From 5c5f78f1afe478269ccfd0350c189df0bd0a7234 Mon Sep 17 00:00:00 2001 From: Imma Valls Date: Mon, 8 May 2023 20:37:27 +0200 Subject: [PATCH 1/4] fix multipart upload - move query parameters to http request query object --- build/aws.js | 2 +- build/aws.js.map | 2 +- build/index.js | 2 +- build/index.js.map | 2 +- build/kms.js.map | 2 +- build/s3.js | 2 +- build/s3.js.map | 2 +- build/secrets-manager.js.map | 2 +- build/signature.js.map | 2 +- build/sqs.js.map | 2 +- build/ssm.js.map | 2 +- src/internal/s3.ts | 37 +++++++++++++++++++++--------------- 12 files changed, 33 insertions(+), 26 deletions(-) diff --git a/build/aws.js b/build/aws.js index 68e349d..c8d7268 100644 --- a/build/aws.js +++ b/build/aws.js @@ -1,2 +1,2 @@ -(()=>{var e={393:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){for(var r=0;rc});var c=function(){function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i(this,"awsConfig",void 0),i(this,"serviceName",void 0),i(this,"_host",void 0),i(this,"_scheme",void 0),this.awsConfig=t,this.serviceName=r}var t,r,n;return t=e,(r=[{key:"host",get:function(){return null==this._host&&(this._host="".concat(this.serviceName,".").concat(this.awsConfig.region,".").concat(this.awsConfig.endpoint)),this._host},set:function(e){this._host=e}},{key:"scheme",get:function(){return null==this._scheme&&(this._scheme=this.awsConfig.scheme),this._scheme},set:function(e){this._scheme=e}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}()},223:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){if(t&&("object"===n(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function i(e){var t="function"==typeof Map?new Map:void 0;return i=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return a(e,arguments,u(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),s(n,e)},i(e)}function a(e,t,r){return a=c()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&s(o,r.prototype),o},a.apply(null,arguments)}function c(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var r=0;rv,o:()=>d});var d=function(){function e(t){if(f(this,e),p(this,"region",void 0),p(this,"accessKeyId",void 0),p(this,"secretAccessKey",void 0),p(this,"sessionToken",void 0),p(this,"scheme","https"),p(this,"endpoint","amazonaws.com"),!t.region||""===t.region)throw new v('invalid AWS region; reason: expected a valid AWS region name (e.g. "us-east-1"), got `'.concat(t.region,"`"));if(!t.accessKeyId||""===t.accessKeyId)throw new v("invalid AWS access key ID; reason: expected a non empty string, got `".concat(t.accessKeyId,"`"));if(t.accessKeyId.length<16||t.accessKeyId.length>128)throw new v("invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ".concat(t.accessKeyId.length));if(!t.secretAccessKey||""===t.secretAccessKey)throw new v("invalid AWS secret access key; reason: expected a non empty string, got `".concat(t.secretAccessKey,"`"));if(t.secretAccessKey.length<16||t.secretAccessKey.length>128)throw new v("invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ".concat(t.secretAccessKey.length));this.region=t.region,this.accessKeyId=t.accessKeyId,this.secretAccessKey=t.secretAccessKey,void 0!==t.sessionToken&&(this.sessionToken=t.sessionToken),void 0!==t.scheme&&(this.scheme=t.scheme),void 0!==t.endpoint&&(this.endpoint=t.endpoint)}return h(e,null,[{key:"fromEnvironment",value:function(t){return new e({region:__ENV.AWS_REGION,accessKeyId:__ENV.AWS_ACCESS_KEY_ID,secretAccessKey:__ENV.AWS_SECRET_ACCESS_KEY,sessionToken:__ENV.AWS_SESSION_TOKEN,scheme:null==t?void 0:t.scheme,endpoint:null==t?void 0:t.endpoint})}}]),e}(),v=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(i,e);var t,r,n=(t=i,r=c(),function(){var e,n=u(t);if(r){var i=u(this).constructor;e=Reflect.construct(n,arguments,i)}else e=n.apply(this,arguments);return o(this,e)});function i(e){return f(this,i),n.call(this,e)}return h(i)}(i(Error))},592:(e,t,r)=>{"use strict";r.d(t,{$l:()=>o,Aq:()=>m,B3:()=>v,Dz:()=>d,K0:()=>n,NL:()=>u,Qk:()=>i,R$:()=>f,SG:()=>w,U4:()=>h,VR:()=>s,a_:()=>l,al:()=>g,cG:()=>c,mc:()=>p,md:()=>b,n8:()=>j,sH:()=>S,th:()=>O,w1:()=>y,zC:()=>a});var n="X-Amz-Algorithm",o="X-Amz-Credential",i="X-Amz-Date",a="X-Amz-Expires",c="X-Amz-Signature",s="X-Amz-SignedHeaders",u="X-Amz-Security-Token",f="x-amz-content-sha256",l=i.toLowerCase(),h=c.toLowerCase(),p="X-Amz-Target".toLowerCase(),y=u.toLowerCase(),d="authorization",v=[d,l,"date"],b="host",m={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},g="aws4_request",w="AWS4-HMAC-SHA256",O=604800,S="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",j="UNSIGNED-PAYLOAD"},380:(e,t,r)=>{"use strict";r.d(t,{t:()=>y});var n=r(255);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){for(var r=0;r{"use strict";function n(e,t){e=e.toLowerCase();for(var r=0,n=Object.keys(t);rn})},137:(e,t,r)=>{"use strict";r.d(t,{L:()=>j,w:()=>P});var n=r(400),o=r.n(n),i=r(592),a=r(380),c=r(491),s=r(23);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=p(e);if(t){var o=p(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return h(this,r)}}function h(e,t){if(t&&("object"===u(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function p(e){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},p(e)}function y(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return d(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return d(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){c=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw i}}}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1&&delete e.headers[O]}e.headers[i.a_]=p,this.credentials.sessionToken&&(e.headers[i.w1]=this.credentials.sessionToken),ArrayBuffer.isView(e.body)&&(e.body=e.body.buffer),e.body||(e.body="");var S=this.computePayloadHash(e);!(0,c.L)(i.R$,e.headers)&&this.applyChecksum&&(e.headers[i.R$]=S);var j=this.computeCanonicalHeaders(e,u,l),P=this.calculateSignature(p,m,this.deriveSigningKey(this.credentials,d,v,y),this.createCanonicalRequest(e,j,S));e.headers[i.Dz]="".concat(i.SG," ")+"Credential=".concat(this.credentials.accessKeyId,"/").concat(m,", ")+"SignedHeaders=".concat(Object.keys(j).sort().join(";"),", ")+"Signature=".concat(P);var _="".concat(e.protocol,"://").concat(e.hostname);return e.path&&(_+=e.path),e.query&&(_+="?".concat(this.serializeQueryParameters(e.query))),b({url:_},e)}},{key:"presign",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.signingDate,n=void 0===r?new Date:r,o=t.expiresIn,a=void 0===o?3600:o,c=t.unsignableHeaders,s=t.unhoistableHeaders,u=t.signableHeaders,f=t.signingRegion,l=t.signingService,h=k(n),p=h.longDate,y=h.shortDate,d=f||this.region,v=l||this.service;if(a>i.th)throw new P("Signature version 4 presigned URLs can't be valid for more than 7 days");var m="".concat(y,"/").concat(d,"/").concat(v,"/").concat(i.al),g=this.moveHeadersToQuery(e,{unhoistableHeaders:s});g.headers[i.md]=e.hostname,this.credentials.sessionToken&&(g.query[i.NL]=this.credentials.sessionToken),g.query[i.K0]=i.SG,g.query[i.$l]="".concat(this.credentials.accessKeyId,"/").concat(m),g.query[i.Qk]=p,g.query[i.zC]=a.toString(10);var w=this.computeCanonicalHeaders(g,c,u);g.query[i.VR]=Object.keys(w).sort().join(";");var O=this.deriveSigningKey(this.credentials,v,d,y),S=this.computePayloadHash(e),j=this.createCanonicalRequest(g,w,S);g.query[i.cG]=this.calculateSignature(p,m,O,j);var _="".concat(g.protocol,"://").concat(g.hostname);return g.path&&(_+=g.path),g.query&&(_+="?".concat(this.serializeQueryParameters(g.query))),b({url:_},g)}},{key:"createCanonicalRequest",value:function(e,t,r){var n=Object.keys(t).sort(),o=n.map((function(e){return"".concat(e,":").concat(t[e])})).join("\n"),i=n.join(";");return"".concat(e.method,"\n")+"".concat(this.computeCanonicalURI(e),"\n")+"".concat(this.computeCanonicalQuerystring(e),"\n")+"".concat(o,"\n\n")+"".concat(i,"\n")+"".concat(r)}},{key:"createStringToSign",value:function(e,t,r){var n=o().sha256(r,"hex");return"".concat(i.SG,"\n")+"".concat(e,"\n")+"".concat(t,"\n")+"".concat(n)}},{key:"calculateSignature",value:function(e,t,r,n){var i=this.createStringToSign(e,t,n);return o().hmac("sha256",r,i,"hex")}},{key:"deriveSigningKey",value:function(e,t,r,n){var i=e.secretAccessKey,a=o().hmac("sha256","AWS4"+i,n,"binary"),c=o().hmac("sha256",a,r,"binary"),s=o().hmac("sha256",c,t,"binary");return o().hmac("sha256",s,"aws4_request","binary")}},{key:"computeCanonicalURI",value:function(e){var t=e.path;if(this.uriEscapePath){var r,n=[],o=y(t.split("/"));try{for(o.s();!(r=o.n()).done;){var i=r.value;0!==(null==i?void 0:i.length)&&("."!==i&&(".."===i?n.pop():n.push(i)))}}catch(e){o.e(e)}finally{o.f()}var a=null!=t&&t.startsWith("/")?"/":"",c=n.join("/"),s=n.length>0&&null!=t&&t.endsWith("/")?"/":"",u="".concat(a).concat(c).concat(s);return encodeURIComponent(u).replace(/%2F/g,"/")}return t}},{key:"computeCanonicalQuerystring",value:function(e){var t,r=e.query,n=void 0===r?{}:r,o=[],a={},c=function(e){if(e.toLowerCase()===i.U4)return"continue";o.push(e);var t=n[e];"string"==typeof t?a[e]="".concat(_(e),"=").concat(_(t)):Array.isArray(t)&&(a[e]=t.slice(0).sort().reduce((function(t,r){return t.concat(["".concat(_(e),"=").concat(_(r))])}),[]).join("&"))},s=y(Object.keys(n).sort());try{for(s.s();!(t=s.n()).done;)c(t.value)}catch(e){s.e(e)}finally{s.f()}return o.map((function(e){return a[e]})).filter((function(e){return e})).join("&")}},{key:"computeCanonicalHeaders",value:function(e,t,r){var n,o=e.headers,a={},c=y(Object.keys(o).sort());try{for(c.s();!(n=c.n()).done;){var s=n.value;if(null!=o[s]){var u=s.toLowerCase();(u in i.Aq||null!=t&&t.has(u))&&(!r||r&&!r.has(u))||(a[u]=o[s].trim().replace(/\s+/g," "))}}}catch(e){c.e(e)}finally{c.f()}return a}},{key:"computePayloadHash",value:function(e){var t=e.headers,r=e.body;return t[i.R$]?t[i.R$]:null==r?i.sH:"string"==typeof r||(0,s.e)(r)?o().sha256(r,"hex").toLowerCase():ArrayBuffer.isView(r)?o().sha256(r.buffer,"hex").toLowerCase():i.n8}},{key:"moveHeadersToQuery",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=JSON.parse(JSON.stringify(e)),n=r.headers,o=r.query,i=void 0===o?{}:o,a=0,c=Object.keys(n);a{"use strict";function n(e){return"function"==typeof ArrayBuffer&&(e instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(e))}function o(e){return Object.keys(e).reduce((function(t,r){var n=e[r];return null!=n&&t.push("".concat(encodeURIComponent(r),"=").concat(encodeURIComponent(n))),t}),[]).join("&")}r.d(t,{C:()=>o,e:()=>n})},41:(e,t,r)=>{"use strict";r.d(t,{SQSClient:()=>P});r(223);var n=r(137),o=r(393),i=r(409),a=r.n(i),c=r(23),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{},n="POST",o={Action:"SendMessage",Version:j,QueueUrl:e,MessageBody:t};void 0!==r.messageDeduplicationId&&(o=l(l({},o),{},{MessageDeduplicationId:r.messageDeduplicationId})),void 0!==r.messageGroupId&&(o=l(l({},o),{},{MessageGroupId:r.messageGroupId}));var i=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l({},this.commonHeaders),body:(0,c.C)(o)},{}),s=a().request(n,i.url,i.body||"",{headers:i.headers});this._handleError("SendMessage",s);var u=s.html("SendMessageResponse > SendMessageResult");return new _(u.find("MessageId").text(),u.find("MD5OfMessageBody").text())}},{key:"listQueues",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="POST",r={Action:"ListQueues",Version:j};void 0!==(null==e?void 0:e.maxResults)&&(r=l(l({},r),{},{MaxResults:e.maxResults})),void 0!==(null==e?void 0:e.nextToken)&&(r=l(l({},r),{},{NextToken:e.nextToken})),void 0!==(null==e?void 0:e.queueNamePrefix)&&(r=l(l({},r),{},{QueueNamePrefix:e.queueNamePrefix}));var n=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},{Host:this.host}),body:(0,c.C)(r)},{}),o=a().request(t,n.url,n.body||"",{headers:n.headers});this._handleError("ListQueues",o);var i=o.html();return{urls:i.find("QueueUrl").toArray().map((function(e){return e.text()})),nextToken:i.find("NextToken").text()||void 0}}},{key:"_handleError",value:function(e,t){var r=t.error_code;if(""!=t.error||0!==r){var o=s.t.parseXML(t.body);if("AuthorizationHeaderMalformed"===o.code)throw new n.w(o.message,o.code);throw new k(o.message,o.code||"unknown",e)}}}]),r}(o.k),_=y((function e(t,r){h(this,e),O(this,"id",void 0),O(this,"bodyMD5",void 0),this.id=t,this.bodyMD5=r})),k=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="SQSServiceError",i.operation=o,i}return y(r)}(s.t)},877:(e,t,r)=>{var n=r(570),o=r(171),i=o;i.v1=n,i.v4=o,e.exports=i},327:e=>{for(var t=[],r=0;r<256;++r)t[r]=(r+256).toString(16).substr(1);e.exports=function(e,r){var n=r||0,o=t;return[o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]]].join("")}},217:e=>{var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(t){var r=new Uint8Array(16);e.exports=function(){return t(r),r}}else{var n=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),n[t]=e>>>((3&t)<<3)&255;return n}}},570:(e,t,r)=>{var n,o,i=r(217),a=r(327),c=0,s=0;e.exports=function(e,t,r){var u=t&&r||0,f=t||[],l=(e=e||{}).node||n,h=void 0!==e.clockseq?e.clockseq:o;if(null==l||null==h){var p=i();null==l&&(l=n=[1|p[0],p[1],p[2],p[3],p[4],p[5]]),null==h&&(h=o=16383&(p[6]<<8|p[7]))}var y=void 0!==e.msecs?e.msecs:(new Date).getTime(),d=void 0!==e.nsecs?e.nsecs:s+1,v=y-c+(d-s)/1e4;if(v<0&&void 0===e.clockseq&&(h=h+1&16383),(v<0||y>c)&&void 0===e.nsecs&&(d=0),d>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");c=y,s=d,o=h;var b=(1e4*(268435455&(y+=122192928e5))+d)%4294967296;f[u++]=b>>>24&255,f[u++]=b>>>16&255,f[u++]=b>>>8&255,f[u++]=255&b;var m=y/4294967296*1e4&268435455;f[u++]=m>>>8&255,f[u++]=255&m,f[u++]=m>>>24&15|16,f[u++]=m>>>16&255,f[u++]=h>>>8|128,f[u++]=255&h;for(var g=0;g<6;++g)f[u+g]=l[g];return t||a(f)}},171:(e,t,r)=>{var n=r(217),o=r(327);e.exports=function(e,t,r){var i=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var a=(e=e||{}).random||(e.rng||n)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var c=0;c<16;++c)t[i+c]=a[c];return t||o(a)}},400:e=>{"use strict";e.exports=require("k6/crypto")},255:e=>{"use strict";e.exports=require("k6/html")},409:e=>{"use strict";e.exports=require("k6/http")}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";r.r(n),r.d(n,{AMZ_CONTENT_SHA256_HEADER:()=>o.R$,AWSConfig:()=>t.o,InvalidAWSConfigError:()=>t.l,InvalidSignatureError:()=>e.w,KMSClient:()=>_,KMSDataKey:()=>C,KMSServiceError:()=>E,S3Bucket:()=>G,S3Client:()=>B,S3Object:()=>U,S3ServiceError:()=>J,SQSClient:()=>De.SQSClient,Secret:()=>le,SecretsManagerClient:()=>fe,SecretsManagerServiceError:()=>he,SignatureV4:()=>e.L,SystemsManagerClient:()=>Ee,SystemsManagerParameter:()=>Te,SystemsManagerServiceError:()=>Ae,UNSIGNED_PAYLOAD:()=>o.n8});var e=r(137),t=r(223),o=r(592),i=r(409),a=r.n(i),c=r(393),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:P.Size256,r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},O({},o.mc,"TrentService.GenerateDataKey")),body:JSON.stringify({KeyId:e,NumberOfBytes:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(j.GenerateDataKey,n),C.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new E(i,o.__type,t)}if(1500===n)throw new E("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),k=function(){function e(t,r){h(this,e),O(this,"keyArn",void 0),O(this,"keyId",void 0),this.keyArn=t,this.keyId=r}return y(e,null,[{key:"fromJSON",value:function(t){return new e(t.KeyArn,t.KeyId)}}]),e}(),C=function(){function e(t,r,n){h(this,e),O(this,"id",void 0),O(this,"ciphertextBlob",void 0),O(this,"plaintext",void 0),this.ciphertextBlob=t,this.id=r,this.plaintext=n}return y(e,null,[{key:"fromJSON",value:function(t){return new e(t.CiphertextBlob,t.KeyId,t.Plaintext)}}]),e}(),E=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="KMSServiceError",i.operation=o,i}return y(r)}(s.t);!function(e){e.GenerateDataKey="GenerateDataKey",e.ListKeys="ListKeys"}(j||(j={})),function(e){e[e.Size256=32]="Size256",e[e.Size512=64]="Size512"}(P||(P={}));var T=r(255);function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function D(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function R(e,t){for(var r=0;r".concat(e.partNumber,"").concat(e.eTag,"")})).join(""),""),u=this.signature.sign({method:o,protocol:"https",hostname:i,path:"/".concat(t,"?").concat(c),headers:{},body:s},{}),f=a().request(o,u.url,u.body||"",{headers:u.headers});this._handle_error("CompleteMultipartUpload",f)}},{key:"abortMultipartUpload",value:function(e,t,r){var n="DELETE",o="".concat(e,".").concat(this.host),i="uploadId=".concat(r),c=this.signature.sign({method:n,protocol:"https",hostname:o,path:"/".concat(t,"?").concat(i),headers:{}},{}),s=a().request(n,c.url,c.body||"",{headers:c.headers});this._handle_error("AbortMultipartUpload",s)}},{key:"_handle_error",value:function(t,r){var n=r.status,o=r.error_code,i=r.error;if(!(n>=200&&n<300&&""==i&&0===o)){if(301==n||i&&i.startsWith("301"))throw new J("Resource not found","ResourceNotFound",t);var a=s.t.parseXML(r.body);if("AuthorizationHeaderMalformed"===a.code)throw new e.w(a.message,a.code);throw new J(a.message,a.code||"unknown",t)}}}]),n}(c.k),G=x((function e(t,r){D(this,e),H(this,"name",void 0),H(this,"creationDate",void 0),this.name=t,this.creationDate=r})),U=x((function e(t,r,n,o,i,a){D(this,e),H(this,"key",void 0),H(this,"lastModified",void 0),H(this,"etag",void 0),H(this,"size",void 0),H(this,"storageClass",void 0),H(this,"data",void 0),this.key=t,this.lastModified=r,this.etag=n,this.size=o,this.storageClass=i,this.data=a})),V=x((function e(t,r){D(this,e),H(this,"key",void 0),H(this,"uploadId",void 0),this.key=t,this.uploadId=r})),W=x((function e(t,r){D(this,e),H(this,"partNumber",void 0),H(this,"eTag",void 0),this.partNumber=t,this.eTag=r})),J=function(e){N(r,e);var t=K(r);function r(e,n,o){var i;return D(this,r),H(L(i=t.call(this,e,n)),"operation",void 0),i.name="S3ServiceError",i.operation=o,i}return x(r)}(s.t),Q=r(877);function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function $(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new he(i,o.__type,t)}if(1500===n)throw new he("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),le=function(){function e(t,r,n,o,i,a){var c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:[];Y(this,e),ce(this,"name",void 0),ce(this,"arn",void 0),ce(this,"secret",void 0),ce(this,"createdDate",void 0),ce(this,"lastAccessedDate",void 0),ce(this,"lastChangedDate",void 0),ce(this,"tags",void 0),this.name=t,this.arn=r,this.secret=n,this.createdDate=o,this.lastAccessedDate=i,this.lastChangedDate=a,this.tags=c}return ee(e,null,[{key:"fromJSON",value:function(t){return new e(t.Name,t.ARN,t.SecretString,t.CreatedDate,t.LastAccessedDate,t.LastChangedDate,t.Tags)}}]),e}(),he=function(e){te(r,e);var t=ne(r);function r(e,n,o){var i;return Y(this,r),ce(ie(i=t.call(this,e,n)),"operation",void 0),i.name="SecretsManagerServiceError",i.operation=o,i}return ee(r)}(s.t);function pe(e){return pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},pe(e)}function ye(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function de(e){for(var t=1;t1&&void 0!==arguments[1]&&arguments[1],r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:de(de({},this.commonHeaders),{},_e({},o.mc,"AmazonSSM.GetParameter")),body:JSON.stringify({Name:e,WithDecryption:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(Ce.GetParameter,n),Te.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new Ae(i,o.__type,t)}if(1500===n)throw new Ae("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),Te=function(){function e(t,r,n,o,i,a,c,s,u){ve(this,e),_e(this,"arn",void 0),_e(this,"dataType",void 0),_e(this,"lastModifiedDate",void 0),_e(this,"name",void 0),_e(this,"selector",void 0),_e(this,"sourceResult",void 0),_e(this,"type",void 0),_e(this,"value",void 0),_e(this,"version",void 0),this.arn=t,this.dataType=r,this.lastModifiedDate=n,this.name=o,this.selector=i,this.sourceResult=a,this.type=c,this.value=s,this.version=u}return me(e,null,[{key:"fromJSON",value:function(t){var r=t.Parameter;return new e(r.ARN,r.DataType,r.LastModifiedDate,r.Name,r.Selector,r.SourceResult,r.Type,r.Value,r.Version)}}]),e}(),Ae=function(e){ge(r,e);var t=Oe(r);function r(e,n,o){var i;return ve(this,r),_e(je(i=t.call(this,e,n)),"operation",void 0),i.name="SystemsManagerServiceError",i.operation=o,i}return me(r)}(s.t);!function(e){e.GetParameter="GetParameter"}(Ce||(Ce={}));var De=r(41)})();var o=exports;for(var i in n)o[i]=n[i];n.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})(); +(()=>{var e={393:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){for(var r=0;rc});var c=function(){function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i(this,"awsConfig",void 0),i(this,"serviceName",void 0),i(this,"_host",void 0),i(this,"_scheme",void 0),this.awsConfig=t,this.serviceName=r}var t,r,n;return t=e,(r=[{key:"host",get:function(){return null==this._host&&(this._host="".concat(this.serviceName,".").concat(this.awsConfig.region,".").concat(this.awsConfig.endpoint)),this._host},set:function(e){this._host=e}},{key:"scheme",get:function(){return null==this._scheme&&(this._scheme=this.awsConfig.scheme),this._scheme},set:function(e){this._scheme=e}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}()},223:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){if(t&&("object"===n(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function i(e){var t="function"==typeof Map?new Map:void 0;return i=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return a(e,arguments,u(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),s(n,e)},i(e)}function a(e,t,r){return a=c()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&s(o,r.prototype),o},a.apply(null,arguments)}function c(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var r=0;rv,o:()=>d});var d=function(){function e(t){if(f(this,e),y(this,"region",void 0),y(this,"accessKeyId",void 0),y(this,"secretAccessKey",void 0),y(this,"sessionToken",void 0),y(this,"scheme","https"),y(this,"endpoint","amazonaws.com"),!t.region||""===t.region)throw new v('invalid AWS region; reason: expected a valid AWS region name (e.g. "us-east-1"), got `'.concat(t.region,"`"));if(!t.accessKeyId||""===t.accessKeyId)throw new v("invalid AWS access key ID; reason: expected a non empty string, got `".concat(t.accessKeyId,"`"));if(t.accessKeyId.length<16||t.accessKeyId.length>128)throw new v("invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ".concat(t.accessKeyId.length));if(!t.secretAccessKey||""===t.secretAccessKey)throw new v("invalid AWS secret access key; reason: expected a non empty string, got `".concat(t.secretAccessKey,"`"));if(t.secretAccessKey.length<16||t.secretAccessKey.length>128)throw new v("invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ".concat(t.secretAccessKey.length));this.region=t.region,this.accessKeyId=t.accessKeyId,this.secretAccessKey=t.secretAccessKey,void 0!==t.sessionToken&&(this.sessionToken=t.sessionToken),void 0!==t.scheme&&(this.scheme=t.scheme),void 0!==t.endpoint&&(this.endpoint=t.endpoint)}return h(e,null,[{key:"fromEnvironment",value:function(t){return new e({region:__ENV.AWS_REGION,accessKeyId:__ENV.AWS_ACCESS_KEY_ID,secretAccessKey:__ENV.AWS_SECRET_ACCESS_KEY,sessionToken:__ENV.AWS_SESSION_TOKEN,scheme:null==t?void 0:t.scheme,endpoint:null==t?void 0:t.endpoint})}}]),e}(),v=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(i,e);var t,r,n=(t=i,r=c(),function(){var e,n=u(t);if(r){var i=u(this).constructor;e=Reflect.construct(n,arguments,i)}else e=n.apply(this,arguments);return o(this,e)});function i(e){return f(this,i),n.call(this,e)}return h(i)}(i(Error))},592:(e,t,r)=>{"use strict";r.d(t,{$l:()=>o,Aq:()=>m,B3:()=>v,Dz:()=>d,K0:()=>n,NL:()=>u,Qk:()=>i,R$:()=>f,SG:()=>w,U4:()=>h,VR:()=>s,a_:()=>l,al:()=>g,cG:()=>c,mc:()=>y,md:()=>b,n8:()=>j,sH:()=>S,th:()=>O,w1:()=>p,zC:()=>a});var n="X-Amz-Algorithm",o="X-Amz-Credential",i="X-Amz-Date",a="X-Amz-Expires",c="X-Amz-Signature",s="X-Amz-SignedHeaders",u="X-Amz-Security-Token",f="x-amz-content-sha256",l=i.toLowerCase(),h=c.toLowerCase(),y="X-Amz-Target".toLowerCase(),p=u.toLowerCase(),d="authorization",v=[d,l,"date"],b="host",m={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},g="aws4_request",w="AWS4-HMAC-SHA256",O=604800,S="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",j="UNSIGNED-PAYLOAD"},380:(e,t,r)=>{"use strict";r.d(t,{t:()=>p});var n=r(255);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){for(var r=0;r{"use strict";function n(e,t){e=e.toLowerCase();for(var r=0,n=Object.keys(t);rn})},137:(e,t,r)=>{"use strict";r.d(t,{L:()=>j,w:()=>P});var n=r(400),o=r.n(n),i=r(592),a=r(380),c=r(491),s=r(23);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=y(e);if(t){var o=y(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return h(this,r)}}function h(e,t){if(t&&("object"===u(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function y(e){return y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},y(e)}function p(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return d(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return d(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){c=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw i}}}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1&&delete e.headers[O]}e.headers[i.a_]=y,this.credentials.sessionToken&&(e.headers[i.w1]=this.credentials.sessionToken),ArrayBuffer.isView(e.body)&&(e.body=e.body.buffer),e.body||(e.body="");var S=this.computePayloadHash(e);!(0,c.L)(i.R$,e.headers)&&this.applyChecksum&&(e.headers[i.R$]=S);var j=this.computeCanonicalHeaders(e,u,l),P=this.calculateSignature(y,m,this.deriveSigningKey(this.credentials,d,v,p),this.createCanonicalRequest(e,j,S));e.headers[i.Dz]="".concat(i.SG," ")+"Credential=".concat(this.credentials.accessKeyId,"/").concat(m,", ")+"SignedHeaders=".concat(Object.keys(j).sort().join(";"),", ")+"Signature=".concat(P);var _="".concat(e.protocol,"://").concat(e.hostname);return e.path&&(_+=e.path),e.query&&(_+="?".concat(this.serializeQueryParameters(e.query))),b({url:_},e)}},{key:"presign",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.signingDate,n=void 0===r?new Date:r,o=t.expiresIn,a=void 0===o?3600:o,c=t.unsignableHeaders,s=t.unhoistableHeaders,u=t.signableHeaders,f=t.signingRegion,l=t.signingService,h=k(n),y=h.longDate,p=h.shortDate,d=f||this.region,v=l||this.service;if(a>i.th)throw new P("Signature version 4 presigned URLs can't be valid for more than 7 days");var m="".concat(p,"/").concat(d,"/").concat(v,"/").concat(i.al),g=this.moveHeadersToQuery(e,{unhoistableHeaders:s});g.headers[i.md]=e.hostname,this.credentials.sessionToken&&(g.query[i.NL]=this.credentials.sessionToken),g.query[i.K0]=i.SG,g.query[i.$l]="".concat(this.credentials.accessKeyId,"/").concat(m),g.query[i.Qk]=y,g.query[i.zC]=a.toString(10);var w=this.computeCanonicalHeaders(g,c,u);g.query[i.VR]=Object.keys(w).sort().join(";");var O=this.deriveSigningKey(this.credentials,v,d,p),S=this.computePayloadHash(e),j=this.createCanonicalRequest(g,w,S);g.query[i.cG]=this.calculateSignature(y,m,O,j);var _="".concat(g.protocol,"://").concat(g.hostname);return g.path&&(_+=g.path),g.query&&(_+="?".concat(this.serializeQueryParameters(g.query))),b({url:_},g)}},{key:"createCanonicalRequest",value:function(e,t,r){var n=Object.keys(t).sort(),o=n.map((function(e){return"".concat(e,":").concat(t[e])})).join("\n"),i=n.join(";");return"".concat(e.method,"\n")+"".concat(this.computeCanonicalURI(e),"\n")+"".concat(this.computeCanonicalQuerystring(e),"\n")+"".concat(o,"\n\n")+"".concat(i,"\n")+"".concat(r)}},{key:"createStringToSign",value:function(e,t,r){var n=o().sha256(r,"hex");return"".concat(i.SG,"\n")+"".concat(e,"\n")+"".concat(t,"\n")+"".concat(n)}},{key:"calculateSignature",value:function(e,t,r,n){var i=this.createStringToSign(e,t,n);return o().hmac("sha256",r,i,"hex")}},{key:"deriveSigningKey",value:function(e,t,r,n){var i=e.secretAccessKey,a=o().hmac("sha256","AWS4"+i,n,"binary"),c=o().hmac("sha256",a,r,"binary"),s=o().hmac("sha256",c,t,"binary");return o().hmac("sha256",s,"aws4_request","binary")}},{key:"computeCanonicalURI",value:function(e){var t=e.path;if(this.uriEscapePath){var r,n=[],o=p(t.split("/"));try{for(o.s();!(r=o.n()).done;){var i=r.value;0!==(null==i?void 0:i.length)&&("."!==i&&(".."===i?n.pop():n.push(i)))}}catch(e){o.e(e)}finally{o.f()}var a=null!=t&&t.startsWith("/")?"/":"",c=n.join("/"),s=n.length>0&&null!=t&&t.endsWith("/")?"/":"",u="".concat(a).concat(c).concat(s);return encodeURIComponent(u).replace(/%2F/g,"/")}return t}},{key:"computeCanonicalQuerystring",value:function(e){var t,r=e.query,n=void 0===r?{}:r,o=[],a={},c=function(e){if(e.toLowerCase()===i.U4)return"continue";o.push(e);var t=n[e];"string"==typeof t?a[e]="".concat(_(e),"=").concat(_(t)):Array.isArray(t)&&(a[e]=t.slice(0).sort().reduce((function(t,r){return t.concat(["".concat(_(e),"=").concat(_(r))])}),[]).join("&"))},s=p(Object.keys(n).sort());try{for(s.s();!(t=s.n()).done;)c(t.value)}catch(e){s.e(e)}finally{s.f()}return o.map((function(e){return a[e]})).filter((function(e){return e})).join("&")}},{key:"computeCanonicalHeaders",value:function(e,t,r){var n,o=e.headers,a={},c=p(Object.keys(o).sort());try{for(c.s();!(n=c.n()).done;){var s=n.value;if(null!=o[s]){var u=s.toLowerCase();(u in i.Aq||null!=t&&t.has(u))&&(!r||r&&!r.has(u))||(a[u]=o[s].trim().replace(/\s+/g," "))}}}catch(e){c.e(e)}finally{c.f()}return a}},{key:"computePayloadHash",value:function(e){var t=e.headers,r=e.body;return t[i.R$]?t[i.R$]:null==r?i.sH:"string"==typeof r||(0,s.e)(r)?o().sha256(r,"hex").toLowerCase():ArrayBuffer.isView(r)?o().sha256(r.buffer,"hex").toLowerCase():i.n8}},{key:"moveHeadersToQuery",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=JSON.parse(JSON.stringify(e)),n=r.headers,o=r.query,i=void 0===o?{}:o,a=0,c=Object.keys(n);a{"use strict";function n(e){return"function"==typeof ArrayBuffer&&(e instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(e))}function o(e){return Object.keys(e).reduce((function(t,r){var n=e[r];return null!=n&&t.push("".concat(encodeURIComponent(r),"=").concat(encodeURIComponent(n))),t}),[]).join("&")}r.d(t,{C:()=>o,e:()=>n})},41:(e,t,r)=>{"use strict";r.d(t,{SQSClient:()=>P});r(223);var n=r(137),o=r(393),i=r(409),a=r.n(i),c=r(23),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{},n="POST",o={Action:"SendMessage",Version:j,QueueUrl:e,MessageBody:t};void 0!==r.messageDeduplicationId&&(o=l(l({},o),{},{MessageDeduplicationId:r.messageDeduplicationId})),void 0!==r.messageGroupId&&(o=l(l({},o),{},{MessageGroupId:r.messageGroupId}));var i=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l({},this.commonHeaders),body:(0,c.C)(o)},{}),s=a().request(n,i.url,i.body||"",{headers:i.headers});this._handleError("SendMessage",s);var u=s.html("SendMessageResponse > SendMessageResult");return new _(u.find("MessageId").text(),u.find("MD5OfMessageBody").text())}},{key:"listQueues",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="POST",r={Action:"ListQueues",Version:j};void 0!==(null==e?void 0:e.maxResults)&&(r=l(l({},r),{},{MaxResults:e.maxResults})),void 0!==(null==e?void 0:e.nextToken)&&(r=l(l({},r),{},{NextToken:e.nextToken})),void 0!==(null==e?void 0:e.queueNamePrefix)&&(r=l(l({},r),{},{QueueNamePrefix:e.queueNamePrefix}));var n=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},{Host:this.host}),body:(0,c.C)(r)},{}),o=a().request(t,n.url,n.body||"",{headers:n.headers});this._handleError("ListQueues",o);var i=o.html();return{urls:i.find("QueueUrl").toArray().map((function(e){return e.text()})),nextToken:i.find("NextToken").text()||void 0}}},{key:"_handleError",value:function(e,t){var r=t.error_code;if(""!=t.error||0!==r){var o=s.t.parseXML(t.body);if("AuthorizationHeaderMalformed"===o.code)throw new n.w(o.message,o.code);throw new k(o.message,o.code||"unknown",e)}}}]),r}(o.k),_=p((function e(t,r){h(this,e),O(this,"id",void 0),O(this,"bodyMD5",void 0),this.id=t,this.bodyMD5=r})),k=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="SQSServiceError",i.operation=o,i}return p(r)}(s.t)},877:(e,t,r)=>{var n=r(570),o=r(171),i=o;i.v1=n,i.v4=o,e.exports=i},327:e=>{for(var t=[],r=0;r<256;++r)t[r]=(r+256).toString(16).substr(1);e.exports=function(e,r){var n=r||0,o=t;return[o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]]].join("")}},217:e=>{var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(t){var r=new Uint8Array(16);e.exports=function(){return t(r),r}}else{var n=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),n[t]=e>>>((3&t)<<3)&255;return n}}},570:(e,t,r)=>{var n,o,i=r(217),a=r(327),c=0,s=0;e.exports=function(e,t,r){var u=t&&r||0,f=t||[],l=(e=e||{}).node||n,h=void 0!==e.clockseq?e.clockseq:o;if(null==l||null==h){var y=i();null==l&&(l=n=[1|y[0],y[1],y[2],y[3],y[4],y[5]]),null==h&&(h=o=16383&(y[6]<<8|y[7]))}var p=void 0!==e.msecs?e.msecs:(new Date).getTime(),d=void 0!==e.nsecs?e.nsecs:s+1,v=p-c+(d-s)/1e4;if(v<0&&void 0===e.clockseq&&(h=h+1&16383),(v<0||p>c)&&void 0===e.nsecs&&(d=0),d>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");c=p,s=d,o=h;var b=(1e4*(268435455&(p+=122192928e5))+d)%4294967296;f[u++]=b>>>24&255,f[u++]=b>>>16&255,f[u++]=b>>>8&255,f[u++]=255&b;var m=p/4294967296*1e4&268435455;f[u++]=m>>>8&255,f[u++]=255&m,f[u++]=m>>>24&15|16,f[u++]=m>>>16&255,f[u++]=h>>>8|128,f[u++]=255&h;for(var g=0;g<6;++g)f[u+g]=l[g];return t||a(f)}},171:(e,t,r)=>{var n=r(217),o=r(327);e.exports=function(e,t,r){var i=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var a=(e=e||{}).random||(e.rng||n)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var c=0;c<16;++c)t[i+c]=a[c];return t||o(a)}},400:e=>{"use strict";e.exports=require("k6/crypto")},255:e=>{"use strict";e.exports=require("k6/html")},409:e=>{"use strict";e.exports=require("k6/http")}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";r.r(n),r.d(n,{AMZ_CONTENT_SHA256_HEADER:()=>o.R$,AWSConfig:()=>t.o,InvalidAWSConfigError:()=>t.l,InvalidSignatureError:()=>e.w,KMSClient:()=>_,KMSDataKey:()=>C,KMSServiceError:()=>E,S3Bucket:()=>G,S3Client:()=>B,S3Object:()=>U,S3ServiceError:()=>J,SQSClient:()=>De.SQSClient,Secret:()=>le,SecretsManagerClient:()=>fe,SecretsManagerServiceError:()=>he,SignatureV4:()=>e.L,SystemsManagerClient:()=>Ee,SystemsManagerParameter:()=>Te,SystemsManagerServiceError:()=>Ae,UNSIGNED_PAYLOAD:()=>o.n8});var e=r(137),t=r(223),o=r(592),i=r(409),a=r.n(i),c=r(393),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:P.Size256,r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},O({},o.mc,"TrentService.GenerateDataKey")),body:JSON.stringify({KeyId:e,NumberOfBytes:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(j.GenerateDataKey,n),C.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new E(i,o.__type,t)}if(1500===n)throw new E("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),k=function(){function e(t,r){h(this,e),O(this,"keyArn",void 0),O(this,"keyId",void 0),this.keyArn=t,this.keyId=r}return p(e,null,[{key:"fromJSON",value:function(t){return new e(t.KeyArn,t.KeyId)}}]),e}(),C=function(){function e(t,r,n){h(this,e),O(this,"id",void 0),O(this,"ciphertextBlob",void 0),O(this,"plaintext",void 0),this.ciphertextBlob=t,this.id=r,this.plaintext=n}return p(e,null,[{key:"fromJSON",value:function(t){return new e(t.CiphertextBlob,t.KeyId,t.Plaintext)}}]),e}(),E=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="KMSServiceError",i.operation=o,i}return p(r)}(s.t);!function(e){e.GenerateDataKey="GenerateDataKey",e.ListKeys="ListKeys"}(j||(j={})),function(e){e[e.Size256=32]="Size256",e[e.Size512=64]="Size512"}(P||(P={}));var T=r(255);function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function D(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function R(e,t){for(var r=0;r".concat(e.partNumber,"").concat(e.eTag,"")})).join(""),""),s=this.signature.sign({method:o,protocol:this.scheme,hostname:i,path:"/".concat(t),headers:{},body:c,query:{uploadId:"".concat(r)}},{}),u=a().request(o,s.url,s.body||"",{headers:s.headers});this._handle_error("CompleteMultipartUpload",u)}},{key:"abortMultipartUpload",value:function(e,t,r){var n="DELETE",o="".concat(e,".").concat(this.host),i=this.signature.sign({method:n,protocol:this.scheme,hostname:o,path:"/".concat(t),headers:{},query:{uploadId:"".concat(r)}},{}),c=a().request(n,i.url,i.body||"",{headers:i.headers});this._handle_error("AbortMultipartUpload",c)}},{key:"_handle_error",value:function(t,r){var n=r.status,o=r.error_code,i=r.error;if(!(n>=200&&n<300&&""==i&&0===o)){if(301==n||i&&i.startsWith("301"))throw new J("Resource not found","ResourceNotFound",t);var a=s.t.parseXML(r.body);if("AuthorizationHeaderMalformed"===a.code)throw new e.w(a.message,a.code);throw new J(a.message,a.code||"unknown",t)}}}]),n}(c.k),G=x((function e(t,r){D(this,e),H(this,"name",void 0),H(this,"creationDate",void 0),this.name=t,this.creationDate=r})),U=x((function e(t,r,n,o,i,a){D(this,e),H(this,"key",void 0),H(this,"lastModified",void 0),H(this,"etag",void 0),H(this,"size",void 0),H(this,"storageClass",void 0),H(this,"data",void 0),this.key=t,this.lastModified=r,this.etag=n,this.size=o,this.storageClass=i,this.data=a})),V=x((function e(t,r){D(this,e),H(this,"key",void 0),H(this,"uploadId",void 0),this.key=t,this.uploadId=r})),W=x((function e(t,r){D(this,e),H(this,"partNumber",void 0),H(this,"eTag",void 0),this.partNumber=t,this.eTag=r})),J=function(e){N(r,e);var t=K(r);function r(e,n,o){var i;return D(this,r),H(q(i=t.call(this,e,n)),"operation",void 0),i.name="S3ServiceError",i.operation=o,i}return x(r)}(s.t),Q=r(877);function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function $(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new he(i,o.__type,t)}if(1500===n)throw new he("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),le=function(){function e(t,r,n,o,i,a){var c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:[];Y(this,e),ce(this,"name",void 0),ce(this,"arn",void 0),ce(this,"secret",void 0),ce(this,"createdDate",void 0),ce(this,"lastAccessedDate",void 0),ce(this,"lastChangedDate",void 0),ce(this,"tags",void 0),this.name=t,this.arn=r,this.secret=n,this.createdDate=o,this.lastAccessedDate=i,this.lastChangedDate=a,this.tags=c}return ee(e,null,[{key:"fromJSON",value:function(t){return new e(t.Name,t.ARN,t.SecretString,t.CreatedDate,t.LastAccessedDate,t.LastChangedDate,t.Tags)}}]),e}(),he=function(e){te(r,e);var t=ne(r);function r(e,n,o){var i;return Y(this,r),ce(ie(i=t.call(this,e,n)),"operation",void 0),i.name="SecretsManagerServiceError",i.operation=o,i}return ee(r)}(s.t);function ye(e){return ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ye(e)}function pe(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function de(e){for(var t=1;t1&&void 0!==arguments[1]&&arguments[1],r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:de(de({},this.commonHeaders),{},_e({},o.mc,"AmazonSSM.GetParameter")),body:JSON.stringify({Name:e,WithDecryption:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(Ce.GetParameter,n),Te.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new Ae(i,o.__type,t)}if(1500===n)throw new Ae("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),Te=function(){function e(t,r,n,o,i,a,c,s,u){ve(this,e),_e(this,"arn",void 0),_e(this,"dataType",void 0),_e(this,"lastModifiedDate",void 0),_e(this,"name",void 0),_e(this,"selector",void 0),_e(this,"sourceResult",void 0),_e(this,"type",void 0),_e(this,"value",void 0),_e(this,"version",void 0),this.arn=t,this.dataType=r,this.lastModifiedDate=n,this.name=o,this.selector=i,this.sourceResult=a,this.type=c,this.value=s,this.version=u}return me(e,null,[{key:"fromJSON",value:function(t){var r=t.Parameter;return new e(r.ARN,r.DataType,r.LastModifiedDate,r.Name,r.Selector,r.SourceResult,r.Type,r.Value,r.Version)}}]),e}(),Ae=function(e){ge(r,e);var t=Oe(r);function r(e,n,o){var i;return ve(this,r),_e(je(i=t.call(this,e,n)),"operation",void 0),i.name="SystemsManagerServiceError",i.operation=o,i}return me(r)}(s.t);!function(e){e.GetParameter="GetParameter"}(Ce||(Ce={}));var De=r(41)})();var o=exports;for(var i in n)o[i]=n[i];n.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})(); //# sourceMappingURL=aws.js.map \ No newline at end of file diff --git a/build/aws.js.map b/build/aws.js.map index 3672803..5cb58da 100644 --- a/build/aws.js.map +++ b/build/aws.js.map @@ -1 +1 @@ -{"version":3,"file":"aws.js","mappings":"04BAUO,IAAMA,EAAS,WAWlB,WAAYC,EAAsBC,I,4FAAqB,iHACnDC,KAAKF,UAAYA,EACjBE,KAAKD,YAAcA,CACvB,C,UAiCD,O,EA/BC,G,EAAA,iBAIA,WAII,OAHkBE,MAAdD,KAAKE,QACPF,KAAKE,MAAQ,GAAH,OAAMF,KAAKD,YAAW,YAAIC,KAAKF,UAAUK,OAAM,YAAIH,KAAKF,UAAUM,WAEvEJ,KAAKE,KAChB,EAAC,IAED,SAAgBG,GACZL,KAAKE,MAAQG,CACjB,GAEE,kBAKF,WAKE,OAHoBJ,MAAhBD,KAAKM,UACPN,KAAKM,QAAUN,KAAKF,UAAUS,QAEzBP,KAAKM,OACd,EAEA,IACA,SAAkBC,GAChBP,KAAKM,QAAUC,CACnB,M,8EAAC,EA/CmB,E,ijFCPf,IAAMC,EAAS,WAsFlB,WAAYC,GACR,GADmC,8IApDlB,SAAO,kBAST,kBA4CVA,EAAQN,QAA6B,KAAnBM,EAAQN,OAC3B,MAAM,IAAIO,EAAsB,yFAAD,OAC+DD,EAAQN,OAAM,MAIhH,IAAKM,EAAQE,aAAuC,KAAxBF,EAAQE,YAChC,MAAM,IAAID,EAAsB,wEAAD,OAC8CD,EAAQE,YAAW,MAIpG,GAAIF,EAAQE,YAAYC,OAAS,IAAMH,EAAQE,YAAYC,OAAS,IAChE,MAAM,IAAIF,EAAsB,wFAAD,OAC6DD,EAAQE,YAAYC,SAIpH,IAAKH,EAAQI,iBAA+C,KAA5BJ,EAAQI,gBACpC,MAAM,IAAIH,EAAsB,4EAAD,OACkDD,EAAQI,gBAAe,MAI5G,GAAIJ,EAAQI,gBAAgBD,OAAS,IAAMH,EAAQI,gBAAgBD,OAAS,IACxE,MAAM,IAAIF,EAAsB,4FAAD,OACiED,EAAQI,gBAAgBD,SAI5HZ,KAAKG,OAASM,EAAQN,OACtBH,KAAKW,YAAcF,EAAQE,YAC3BX,KAAKa,gBAAkBJ,EAAQI,qBAEFZ,IAAzBQ,EAAQK,eACRd,KAAKc,aAAeL,EAAQK,mBAGTb,IAAnBQ,EAAQF,SACRP,KAAKO,OAASE,EAAQF,aAGDN,IAArBQ,EAAQL,WACRJ,KAAKI,SAAWK,EAAQL,SAEhC,CAtDC,OAsDA,uCAtED,SAAuBK,GAQnB,OAAO,IAAID,EAAU,CACjBL,OARWY,MAAMC,WASjBL,YARgBI,MAAME,kBAStBJ,gBARoBE,MAAMG,sBAS1BJ,aARqCC,MAAMI,kBAS3CZ,OARmCE,aAAO,EAAPA,EAASF,OAS5CH,SARiCK,aAAO,EAAPA,EAASL,UAUlD,KAAC,EA9EiB,GA4LTM,EAAqB,a,qRAAA,U,IAAA,G,EAAA,E,mJAC9B,WAAYU,GAAiB,6BACnBA,EACV,CAAC,YAH6B,CAG7B,EAHsCC,O,mOC5LpC,IAAMC,EAA4B,kBAC5BC,EAA6B,mBAC7BC,EAAuB,aACvBC,EAA0B,gBAC1BC,EAA4B,kBAC5BC,EAAiC,sBAEjCC,EAAwB,uBAKxBC,EAA4B,uBAC5BC,EAAkBN,EAAqBO,cACvCC,EAAuBN,EAA0BK,cACjDE,EATyB,eASkBF,cAC3CG,EAAmBN,EAAsBG,cAKzCI,EAAuB,gBAMvBC,EAAoB,CAACD,EAAsBL,EAL7B,QAMdO,EAAc,OAMdC,EAA4B,CACrCC,eAAe,EACf,iBAAiB,EACjBC,YAAY,EACZC,QAAQ,EACRC,MAAM,EACN,cAAc,EACd,gBAAgB,EAChBC,QAAQ,EACRC,SAAS,EACTC,IAAI,EACJC,SAAS,EACT,qBAAqB,EACrBC,SAAS,EACT,cAAc,EACd,mBAAmB,GAMVC,EAAsB,eACtBC,EAA+B,mBAK/BC,EAAoB,OAKpBC,EAAe,mEAQfC,EAAmB,kB,kvECnEzB,IAAMC,EAAQ,a,qRAAA,U,UAAA,G,EAAA,E,mJAYjB,WAAYjC,EAAiBkC,GAAe,M,MAGxB,O,4FAHwB,SACxC,cAAMlC,G,EAAQ,K,OAAA,G,MAAA,W,wFACd,EAAKmC,KAAO,WACZ,EAAKD,KAAOA,EAAI,CACpB,CAUC,O,EARD,E,EAAA,uBAKA,SAAgBE,GACZ,IAAMC,GAAMC,EAAAA,EAAAA,WAAUF,GACtB,OAAO,IAAIH,EAASI,EAAIE,KAAK,WAAWC,OAAQH,EAAIE,KAAK,QAAQC,OACrE,K,EARA,O,8EAQC,EA1BgB,CA0BhB,EA1ByBvC,O,6BCWvB,SAASwC,EAAUC,EAAsBC,GAC5CD,EAAeA,EAAa/B,cAE5B,IAAK,IAAL,MAAyBiC,OAAOC,KAAKF,GAAQ,eAAE,CAC3C,GAAID,IADa,KACe/B,cAC5B,OAAO,CAEf,CAEA,OAAO,CACX,C,+rHCdO,IAAMmC,EAAW,WAoCpB,cAMuB,IALnBC,EAAO,EAAPA,QACAhE,EAAM,EAANA,OACAiE,EAAW,EAAXA,YACAC,EAAa,EAAbA,cACAC,EAAa,EAAbA,cAAa,sJAEbtE,KAAKmE,QAAUA,EACfnE,KAAKG,OAASA,EACdH,KAAKoE,YAAcA,EACnBpE,KAAKqE,cAAyC,kBAAlBA,GAA8BA,EAC1DrE,KAAKsE,cAAyC,kBAAlBA,GAA8BA,CAC9D,CAkjBC,OAhjBD,uBAaA,SACIC,EAAoB,GAQH,QANbC,YAAAA,OAAW,IAAG,MAAIC,KAAM,EACxBC,EAAc,EAAdA,eACAC,EAAa,EAAbA,cAAa,IACbC,kBAAAA,OAAiB,IAAG,MAAIC,IAAa,MACrCC,gBAAAA,OAAe,IAAG,MAAID,IAAa,EAGvC,EAA0CE,EAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZd,EAAUO,GAAkB1E,KAAKmE,QACjChE,EAASwE,GAAiB3E,KAAKG,OAC/B+E,EAAQ,GAAH,OAAMD,EAAS,YAAI9E,EAAM,YAAIgE,EAAO,YAAIgB,EAAAA,IAOnDZ,EAAQR,QAAQoB,EAAAA,IAAyBZ,EAAQa,SAKjD,IAAK,IAAL,MAAyBpB,OAAOC,KAAKM,EAAQR,SAAQ,eAAE,CAAlD,IAAMsB,EAAU,KACbF,EAAAA,GAAAA,QAAoCE,EAAWtD,gBAAkB,UAC1DwC,EAAQR,QAAQsB,EAE/B,CAEAd,EAAQR,QAAQoB,EAAAA,IAA6BH,EACzChF,KAAKoE,YAAYtD,eACjByD,EAAQR,QAAQoB,EAAAA,IAA8BnF,KAAKoE,YAAYtD,cAK/DwE,YAAYC,OAAOhB,EAAQiB,QAC3BjB,EAAQiB,KAAOjB,EAAQiB,KAAKC,QAI3BlB,EAAQiB,OACTjB,EAAQiB,KAAO,IAGnB,IAAIE,EAAc1F,KAAK2F,mBAAmBpB,KACrCV,EAAAA,EAAAA,GAAUsB,EAAAA,GAAqCZ,EAAQR,UAAY/D,KAAKsE,gBACzEC,EAAQR,QAAQoB,EAAAA,IAAuCO,GAG3D,IAAME,EAAmB5F,KAAK6F,wBAAwBtB,EAASK,EAAmBE,GAC5EgB,EAAY9F,KAAK+F,mBACnBf,EACAE,EACAlF,KAAKgG,iBAAiBhG,KAAKoE,YAAaD,EAAShE,EAAQ8E,GACzDjF,KAAKiG,uBAAuB1B,EAASqB,EAAkBF,IAQ3DnB,EAAQR,QAAQoB,EAAAA,IACZ,UAAGA,EAAAA,GAAsC,0BAC3BnF,KAAKoE,YAAYzD,YAAW,YAAIuE,EAAK,MAAI,wBACtClB,OAAOC,KAAK2B,GAAkBM,OAAOC,KAAK,KAAI,MAAI,oBACtDL,GAGjB,IAAIM,EAAM,GAAH,OAAM7B,EAAQ8B,SAAQ,cAAM9B,EAAQa,UAW3C,OAVIb,EAAQ+B,OACRF,GAAO7B,EAAQ+B,MAIf/B,EAAQgC,QAERH,GAAO,IAAJ,OAAQpG,KAAKwG,yBAAyBjC,EAAQgC,SAG9C,EAAP,CACIH,IAAKA,GACF7B,EAEX,GAEA,qBAWA,SAAQkC,GAA+E,IAAjDhG,EAA0B,UAAH,6CAAG,CAAC,EAC7D,EAQIA,EAPA+D,YAAAA,OAAW,IAAG,MAAIC,KAAM,IAOxBhE,EANAiG,UAAAA,OAAS,IAAG,OAAI,EAChB9B,EAKAnE,EALAmE,kBACA+B,EAIAlG,EAJAkG,mBACA7B,EAGArE,EAHAqE,gBACAH,EAEAlE,EAFAkE,cACAD,EACAjE,EADAiE,eAEJ,EAA0CK,EAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZ9E,EAASwE,GAAiB3E,KAAKG,OAC/BgE,EAAUO,GAAkB1E,KAAKmE,QAEvC,GAAIuC,EAAYvB,EAAAA,GACZ,MAAM,IAAIyB,EACN,0EAIR,IAAM1B,EAAQ,GAAH,OAAMD,EAAS,YAAI9E,EAAM,YAAIgE,EAAO,YAAIgB,EAAAA,IAC7CZ,EAAUvE,KAAK6G,mBAAmBJ,EAAiB,CAAEE,mBAAAA,IAO3DpC,EAAQR,QAAQoB,EAAAA,IAAyBsB,EAAgBrB,SAGrDpF,KAAKoE,YAAYtD,eACjByD,EAAQgC,MAAMpB,EAAAA,IAAmCnF,KAAKoE,YAAYtD,cAKtEyD,EAAQgC,MAAMpB,EAAAA,IAAuCA,EAAAA,GACrDZ,EAAQgC,MACJpB,EAAAA,IACA,GAAH,OAAMnF,KAAKoE,YAAYzD,YAAW,YAAIuE,GACvCX,EAAQgC,MAAMpB,EAAAA,IAAkCH,EAChDT,EAAQgC,MAAMpB,EAAAA,IAAqCuB,EAAUI,SAAS,IAEtE,IAAMlB,EAAmB5F,KAAK6F,wBAC1BtB,EACAK,EACAE,GAEJP,EAAQgC,MAAMpB,EAAAA,IAA4CnB,OAAOC,KAAK2B,GACjEM,OACAC,KAAK,KAEV,IAAMY,EAAa/G,KAAKgG,iBAAiBhG,KAAKoE,YAAaD,EAAShE,EAAQ8E,GAStES,EAAc1F,KAAK2F,mBAAmBc,GACtCO,EAAmBhH,KAAKiG,uBAAuB1B,EAASqB,EAAkBF,GAEhFnB,EAAQgC,MAAMpB,EAAAA,IAAuCnF,KAAK+F,mBACtDf,EACAE,EACA6B,EACAC,GAIJ,IAAIZ,EAAM,GAAH,OAAM7B,EAAQ8B,SAAQ,cAAM9B,EAAQa,UAU3C,OATIb,EAAQ+B,OACRF,GAAO7B,EAAQ+B,MAIf/B,EAAQgC,QACRH,GAAO,IAAJ,OAAQpG,KAAKwG,yBAAyBjC,EAAQgC,SAG9C,EAAP,CAASH,IAAKA,GAAQ7B,EAC1B,GAEA,oCAYA,SACIA,EACAqB,EACAF,GAEA,IAAMuB,EAAgBjD,OAAOC,KAAK2B,GAAkBM,OAC9CgB,EAAyBD,EAC1BE,KAAI,SAAC5D,GAAI,gBAAQA,EAAI,YAAIqC,EAAiBrC,GAAK,IAC/C4C,KAAK,MACJiB,EAAgBH,EAAcd,KAAK,KAEzC,MACI,UAAG5B,EAAQ8C,OAAM,gBACdrH,KAAKsH,oBAAoB/C,GAAQ,MAAI,UACrCvE,KAAKuH,4BAA4BhD,GAAQ,MAAI,UAC7C2C,EAAsB,QAAM,UAC5BE,EAAa,MAAI,UACjB1B,EAEX,GAEA,gCAcA,SACIV,EACAwC,EACAR,GAEA,IAAMS,EAAyBC,IAAAA,OAAcV,EAAkB,OAE/D,MACI,UAAG7B,EAAAA,GAAsC,gBACtCH,EAAQ,MAAI,UACZwC,EAAe,MAAI,UACnBC,EAEX,GAEA,gCAYA,SACIzC,EACAwC,EACAT,EACAC,GAEA,IAAMW,EAAe3H,KAAK4H,mBAAmB5C,EAAUwC,EAAiBR,GACxE,OAAOU,IAAAA,KAAY,SAAUX,EAAYY,EAAc,MAC3D,GAEA,8BAiBA,SACIvD,EACAD,EACAhE,EACA8E,GAEA,IAAM4C,EAAkBzD,EAAYvD,gBAC9BiH,EAAaJ,IAAAA,KAAY,SAAU,OAASG,EAAS5C,EAAW,UAChE8C,EAAeL,IAAAA,KAAY,SAAUI,EAAO3H,EAAQ,UACpD6H,EAAgBN,IAAAA,KAAY,SAAUK,EAAS5D,EAAS,UAG9D,OAFsBuD,IAAAA,KAAY,SAAUM,EAAU,eAAgB,SAG1E,GAEA,iCAOA,YAA2D,IAA7B1B,EAAI,EAAJA,KAC1B,GAAItG,KAAKqE,cAAe,CAGpB,IAEwC,EAFlC4D,EAAwB,GAAE,IAEP3B,EAAK4B,MAAM,MAAI,IAAxC,IAAK,EAAL,qBAA0C,KAA/BC,EAAU,QACU,KAAvBA,aAAU,EAAVA,EAAYvH,UAIG,MAAfuH,IAIe,OAAfA,EACAF,EAAsBG,MAEtBH,EAAsBI,KAAKF,IAEnC,CAEA,+BACA,IAAMG,EAAUhC,SAAAA,EAAMiC,WAAW,KAAO,IAAM,GACxCC,EAAMP,EAAsB9B,KAAK,KACjCsC,EAAWR,EAAsBrH,OAAS,GAA/BqH,MAAoC3B,GAAAA,EAAMoC,SAAS,KAAO,IAAM,GAC3EC,EAAgB,GAAH,OAAML,GAAO,OAAGE,GAAG,OAAGC,GAIzC,OAFsBG,mBAAmBD,GAEpBE,QAAQ,OAAQ,IACzC,CAKA,OAAOvC,CACX,GAEA,yCAQA,YAAyE,IAI1B,EAJ0B,IAAnCC,MAAAA,OAAK,IAAG,GAAC,EAAC,EACtCtC,EAAsB,GACtB6E,EAAqC,CAAC,EAAC,WAElCC,GACP,GAAIA,EAAIhH,gBAAkBoD,EAAAA,GACtB,iBAGJlB,EAAKoE,KAAKU,GACV,IAAMC,EAAQzC,EAAMwC,GAEC,iBAAVC,EACPF,EAAWC,GAAO,GAAH,OAAME,EAAUF,GAAI,YAAIE,EAAUD,IAC1CE,MAAMC,QAAQH,KACrBF,EAAWC,GAAOC,EACbI,MAAM,GACNlD,OACAmD,QACG,SAACC,EAAwBN,GAAa,OAClCM,EAAQC,OAAO,CAAC,GAAD,OAAIN,EAAUF,GAAI,YAAIE,EAAUD,KAAU,GAC7D,IAEH7C,KAAK,KACb,MApBanC,OAAOC,KAAKsC,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOjC,EACFkD,KAAI,SAAC4B,GAAG,OAAKD,EAAWC,EAAI,IAC5BS,QAAO,SAACV,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,GAEA,qCAUA,WAEIvB,EACAE,GACa,IAGuC,EANlDf,EAAO,EAAPA,QAII6B,EAAkC,CAAC,EAAC,IAEjB5B,OAAOC,KAAKF,GAASmC,QAAM,IAApD,IAAK,EAAL,qBAAsD,KAA3Cb,EAAU,QACjB,GAA2BpF,MAAvB8D,EAAQsB,GAAZ,CAIA,IAAMoE,EAAsBpE,EAAWtD,eAEnC0H,KAAuBtE,EAAAA,IACvBP,SAAAA,EAAmB8E,IAAID,OAGlB3E,GACAA,IAAoBA,EAAgB4E,IAAID,MAMjD7D,EAAiB6D,GAAuB1F,EAAQsB,GAAYsE,OAAOd,QAAQ,OAAQ,KAfnF,CAgBJ,CAAC,+BAED,OAAOjD,CACX,GAEA,gCAWA,YAAmE,IAAtC7B,EAAO,EAAPA,QAASyB,EAAI,EAAJA,KASlC,OAAIzB,EAAQoB,EAAAA,IACDpB,EAAQoB,EAAAA,IAGPlF,MAARuF,EACOL,EAAAA,GAGS,iBAATK,IAAqBoE,EAAAA,EAAAA,GAAcpE,GACnCkC,IAAAA,OAAclC,EAAM,OAAOzD,cAGlCuD,YAAYC,OAAOC,GAGZkC,IAAAA,OAAelC,EAAkBC,OAAQ,OAAO1D,cAGpDoD,EAAAA,EACX,GAEA,gCAaA,SACIZ,GAMA,IAJ0C,IAD1C9D,EAAgD,UAAH,6CAAG,CAAC,EAE3CoJ,EAAcC,KAAKC,MAAMD,KAAKE,UAAUzF,IACtCR,EAA6C8F,EAA7C9F,QAAO,EAAsC8F,EAApCtD,MAAAA,OAAK,IAAG,GAAC,EAAC,EAE3B,MAAmBvC,OAAOC,KAAKF,GAAQ,eAAE,OAA9BR,EAAI,KACL0G,EAAgB1G,EAAKxB,cAEO,WAA9BkI,EAAcb,MAAM,EAAG,IACI,QAA3B,EAAC3I,EAAQkG,0BAAkB,OAA1B,EAA4B+C,IAAIO,KAEjC1D,EAAMhD,GAAQQ,EAAQR,UACfQ,EAAQR,GAEvB,CAEA,OAAO,EAAP,KACOsG,GAAW,IACd9F,QAAAA,EACAwC,MAAAA,GAER,GAEA,sCAOA,SAAiCA,EAA0B2D,GACvD,IAG2C,EAHrCjG,EAAsB,GACtB6E,EAAqC,CAAC,EAAC,WAElCC,GACP,GAAImB,SAAAA,EAAYC,SAASpB,EAAIhH,eACzB,iBAGJkC,EAAKoE,KAAKU,GACV,IAAMC,EAAQzC,EAAMwC,GAEC,iBAAVC,EACPF,EAAWC,GAAO,GAAH,OAAME,EAAUF,GAAI,YAAIE,EAAUD,IAC1CE,MAAMC,QAAQH,KACrBF,EAAWC,GAAOC,EACbI,MAAM,GACNlD,OACAmD,QACG,SAACC,EAAwBN,GAAa,OAClCM,EAAQC,OAAO,CAAC,GAAD,OAAIN,EAAUF,GAAI,YAAIE,EAAUD,KAAU,GAC7D,IAEH7C,KAAK,KACb,MApBanC,OAAOC,KAAKsC,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOjC,EACFkD,KAAI,SAAC4B,GAAG,OAAKD,EAAWC,EAAI,IAC5BS,QAAO,SAACV,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,KAAC,EAlmBmB,GA6mBXS,EAAqB,a,qRAAA,iBAM9B,WAAYxF,EAAiBkC,GAAe,MAEL,OAFK,WACxC,cAAMlC,EAASkC,IACVC,KAAO,wBAAuB,CACvC,CAAC,YAT6B,CAASF,EAAAA,GA+I3C,SAAS4F,EAAUT,GAKf,OAAOI,mBAAmBJ,GAAKK,QAAQ,YAJrB,SAACuB,GACf,MAAO,IAAP,OAAWA,EAAEC,WAAW,GAAGvD,SAAS,IAAIwD,cAC5C,GAGJ,CASA,SAASvF,EAAWwF,GAChB,IAeaC,EAfPxF,GAeOwF,EAfYD,EA2B7B,SAAgBC,GACZ,MAAoB,iBAATA,EACA,IAAI/F,KAAY,IAAP+F,GAGA,iBAATA,EACHC,OAAOD,GACA,IAAI/F,KAAoB,IAAfgG,OAAOD,IAGpB,IAAI/F,KAAK+F,GAGbA,CACX,CAzBWE,CAAOF,GACTG,cACA9B,QAAQ,YAAa,MAlBKA,QAAQ,SAAU,IACjD,MAAO,CACH7D,SAAAA,EACAC,UAAWD,EAASoE,MAAM,EAAG,GAErC,C,4BC7xBO,SAASQ,EAAcZ,GAC1B,MAC2B,mBAAhB1D,cACN0D,aAAiB1D,aAC4B,yBAA1CtB,OAAO4G,UAAU9D,SAAS+D,KAAK7B,GAE3C,CAEO,SAAS8B,EAAiBC,GAC7B,OAAO/G,OAAOC,KAAK8G,GAAM1B,QAAO,SAAC2B,EAAQjC,GACrC,IAAIC,EAAQ+B,EAAKhC,GAIjB,OAHIC,SACAgC,EAAO3C,KAAK,GAAD,OAAIO,mBAAmBG,GAAI,YAAIH,mBAAmBI,KAE1DgC,CACX,GAAG,IAAgB7E,KAAK,IAC5B,C,m9FCbA,IAAM8E,EAAc,aAEPC,EAAS,8BAIlB,WAAYpL,GAAsB,MAiB7B,OAjB6B,UACP,IAAvB,cAAMA,EAAW,QAAM,mDAEvB,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQ,EAAKL,UAAUK,OACvBiE,YAAa,CACTzD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCuD,eAAe,EACfC,eAAe,IAGnB,EAAK6G,cAAgB,CACjB,eAAgB,qCACnB,CACL,CA2IC,OAzID,8BAUA,SAAYC,EAAkBC,GAAyG,IAApF5K,EAAuE,UAAH,6CAAG,CAAC,EACjH4G,EAAS,OAEX7B,EAAY,CACZ8F,OAAQ,cACRC,QAASN,EACTO,SAAUJ,EACVK,YAAaJ,QAG8B,IAApC5K,EAAQiL,yBACflG,EAAO,EAAH,KAAQA,GAAI,IACZmG,uBAAwBlL,EAAQiL,+BAID,IAA5BjL,EAAQmL,iBACfpG,EAAO,EAAH,KAAQA,GAAI,IACZqG,eAAgBpL,EAAQmL,kBAIhC,IAAME,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,OACRhB,SAAU,QACVjB,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,GACA/D,KAAKmL,eAEZ3F,MAAMsF,EAAAA,EAAAA,GAAiBtF,IAE3B,CAAC,GAGCwG,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKkM,aAAa,cAAeF,GAEjC,IAAMG,EAASH,EAAII,KAAK,2CACxB,OAAO,IAAIC,EACPF,EAAOxI,KAAK,aAAaC,OACzBuI,EAAOxI,KAAK,oBAAoBC,OAExC,GAEA,wBAWA,WAA6E,IAAlE0I,EAA0C,UAAH,6CAAG,CAAC,EAC5CjF,EAAS,OAEX7B,EAAY,CACZ8F,OAAQ,aACRC,QAASN,QAG0B,KAA5BqB,aAAU,EAAVA,EAAYC,cACnB/G,EAAO,EAAH,KAAQA,GAAI,IACZgH,WAAYF,EAAWC,mBAIO,KAA3BD,aAAU,EAAVA,EAAYG,aACnBjH,EAAO,EAAH,KAAQA,GAAI,IACZkH,UAAWJ,EAAWG,kBAIc,KAAjCH,aAAU,EAAVA,EAAYK,mBACnBnH,EAAO,EAAH,KAAQA,GAAI,IACZoH,gBAAiBN,EAAWK,mBAIpC,IAAMb,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,OACRhB,SAAU,QACVjB,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,KACA/D,KAAKmL,eAAa,IACrB,KAAQnL,KAAKK,OAEjBmF,MAAMsF,EAAAA,EAAAA,GAAiBtF,IAE3B,CAAC,GAGCwG,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKkM,aAAa,aAAcF,GAEhC,IAAIG,EAASH,EAAII,OACjB,MAAO,CACHS,KAAMV,EAAOxI,KAAK,YAAYmJ,UAAU3F,KAAI,SAAA4F,GAAC,OAAIA,EAAEnJ,MAAM,IACzD6I,UAAWN,EAAOxI,KAAK,aAAaC,aAAU3D,EAEtD,GAAC,0BAED,SAAqB+M,EAAyBC,GAC1C,IAAMC,EAAoBD,EAASE,WAGnC,GAAoB,IAFSF,EAASG,OAEE,IAAdF,EAA1B,CAIA,IAAMG,EAAWhK,EAAAA,EAAAA,SAAkB4J,EAASzH,MAC5C,GACS,iCADD6H,EAAS/J,KAET,MAAM,IAAIsD,EAAAA,EAAsByG,EAASjM,QAASiM,EAAS/J,MAE3D,MAAM,IAAIgK,EAAgBD,EAASjM,QAASiM,EAAS/J,MAAQ,UAAW0J,EAPhF,CASJ,KAAC,EAjKiB,CAASnN,EAAAA,GAuKlBwM,EAAO,GAkBhB,WAAYkB,EAAYC,GAAiB,uDACrCxN,KAAKuN,GAAKA,EACVvN,KAAKwN,QAAUA,CACnB,IAMSF,EAAe,8BAGxB,WAAYlM,EAAiBkC,EAAc0J,GAAyB,MAGtC,OAHsC,UAC5C,IAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,kBACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,YAPuB,CAAS3J,EAAAA,E,gBC5MrC,IAAIoK,EAAK,EAAQ,KACbC,EAAK,EAAQ,KAEbC,EAAOD,EACXC,EAAKF,GAAKA,EACVE,EAAKD,GAAKA,EAEVE,EAAOC,QAAUF,C,UCFjB,IADA,IAAIG,EAAY,GACPC,EAAI,EAAGA,EAAI,MAAOA,EACzBD,EAAUC,IAAMA,EAAI,KAAOjH,SAAS,IAAIkH,OAAO,GAmBjDJ,EAAOC,QAhBP,SAAqBI,EAAKC,GACxB,IAAIH,EAAIG,GAAU,EACdC,EAAML,EAEV,MAAO,CACLK,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MACvBI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MACvBI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MACvBI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,OACtB5H,KAAK,GACV,C,UChBA,IAAIiI,EAAqC,oBAAZ,QAA2B1G,OAAO0G,iBAAmB1G,OAAO0G,gBAAgBC,KAAK3G,SACnE,oBAAd,UAAuE,mBAAnC4G,OAAOC,SAASH,iBAAiCG,SAASH,gBAAgBC,KAAKE,UAEhJ,GAAIH,EAAiB,CAEnB,IAAII,EAAQ,IAAIC,WAAW,IAE3Bb,EAAOC,QAAU,WAEf,OADAO,EAAgBI,GACTA,CACT,CACF,KAAO,CAKL,IAAIE,EAAO,IAAIxF,MAAM,IAErB0E,EAAOC,QAAU,WACf,IAAK,IAAWc,EAAPZ,EAAI,EAAMA,EAAI,GAAIA,IACN,IAAV,EAAJA,KAAiBY,EAAoB,WAAhBC,KAAKC,UAC/BH,EAAKX,GAAKY,MAAY,EAAJZ,IAAa,GAAK,IAGtC,OAAOW,CACT,CACF,C,gBCjCA,IAQII,EACAC,EATAC,EAAM,EAAQ,KACdC,EAAc,EAAQ,KAWtBC,EAAa,EACbC,EAAa,EA+FjBvB,EAAOC,QA5FP,SAAYpN,EAASwN,EAAKC,GACxB,IAAIH,EAAIE,GAAOC,GAAU,EACrBkB,EAAInB,GAAO,GAGXoB,GADJ5O,EAAUA,GAAW,CAAC,GACH4O,MAAQP,EACvBQ,OAAgCrP,IAArBQ,EAAQ6O,SAAyB7O,EAAQ6O,SAAWP,EAKnE,GAAY,MAARM,GAA4B,MAAZC,EAAkB,CACpC,IAAIC,EAAYP,IACJ,MAARK,IAEFA,EAAOP,EAAU,CACA,EAAfS,EAAU,GACVA,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,KAGtD,MAAZD,IAEFA,EAAWP,EAAiD,OAApCQ,EAAU,IAAM,EAAIA,EAAU,IAE1D,CAMA,IAAIC,OAA0BvP,IAAlBQ,EAAQ+O,MAAsB/O,EAAQ+O,OAAQ,IAAI/K,MAAOgL,UAIjEC,OAA0BzP,IAAlBQ,EAAQiP,MAAsBjP,EAAQiP,MAAQP,EAAa,EAGnEQ,EAAMH,EAAQN,GAAeQ,EAAQP,GAAY,IAcrD,GAXIQ,EAAK,QAA0B1P,IAArBQ,EAAQ6O,WACpBA,EAAWA,EAAW,EAAI,QAKvBK,EAAK,GAAKH,EAAQN,SAAiCjP,IAAlBQ,EAAQiP,QAC5CA,EAAQ,GAINA,GAAS,IACX,MAAM,IAAIrO,MAAM,mDAGlB6N,EAAaM,EACbL,EAAaO,EACbX,EAAYO,EAMZ,IAAIM,GAA4B,KAAb,WAHnBJ,GAAS,cAG+BE,GAAS,WACjDN,EAAErB,KAAO6B,IAAO,GAAK,IACrBR,EAAErB,KAAO6B,IAAO,GAAK,IACrBR,EAAErB,KAAO6B,IAAO,EAAI,IACpBR,EAAErB,KAAY,IAAL6B,EAGT,IAAIC,EAAOL,EAAQ,WAAc,IAAS,UAC1CJ,EAAErB,KAAO8B,IAAQ,EAAI,IACrBT,EAAErB,KAAa,IAAN8B,EAGTT,EAAErB,KAAO8B,IAAQ,GAAK,GAAM,GAC5BT,EAAErB,KAAO8B,IAAQ,GAAK,IAGtBT,EAAErB,KAAOuB,IAAa,EAAI,IAG1BF,EAAErB,KAAkB,IAAXuB,EAGT,IAAK,IAAIQ,EAAI,EAAGA,EAAI,IAAKA,EACvBV,EAAErB,EAAI+B,GAAKT,EAAKS,GAGlB,OAAO7B,GAAYgB,EAAYG,EACjC,C,gBC1GA,IAAIJ,EAAM,EAAQ,KACdC,EAAc,EAAQ,KA2B1BrB,EAAOC,QAzBP,SAAYpN,EAASwN,EAAKC,GACxB,IAAIH,EAAIE,GAAOC,GAAU,EAEF,iBAAb,IACRD,EAAkB,WAAZxN,EAAuB,IAAIyI,MAAM,IAAM,KAC7CzI,EAAU,MAIZ,IAAIiO,GAFJjO,EAAUA,GAAW,CAAC,GAEHoO,SAAWpO,EAAQuO,KAAOA,KAO7C,GAJAN,EAAK,GAAgB,GAAVA,EAAK,GAAa,GAC7BA,EAAK,GAAgB,GAAVA,EAAK,GAAa,IAGzBT,EACF,IAAK,IAAI8B,EAAK,EAAGA,EAAK,KAAMA,EAC1B9B,EAAIF,EAAIgC,GAAMrB,EAAKqB,GAIvB,OAAO9B,GAAOgB,EAAYP,EAC5B,C,uBC1BAd,EAAOC,QAAUmC,QAAQ,Y,uBCAzBpC,EAAOC,QAAUmC,QAAQ,U,uBCAzBpC,EAAOC,QAAUmC,QAAQ,U,GCCrBC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBlQ,IAAjBmQ,EACH,OAAOA,EAAavC,QAGrB,IAAID,EAASqC,EAAyBE,GAAY,CAGjDtC,QAAS,CAAC,GAOX,OAHAwC,EAAoBF,GAAUvC,EAAQA,EAAOC,QAASqC,GAG/CtC,EAAOC,OACf,CCrBAqC,EAAoBJ,EAAKlC,IACxB,IAAI0C,EAAS1C,GAAUA,EAAO2C,WAC7B,IAAO3C,EAAiB,QACxB,IAAM,EAEP,OADAsC,EAAoBM,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdJ,EAAoBM,EAAI,CAAC3C,EAAS6C,KACjC,IAAI,IAAI3H,KAAO2H,EACXR,EAAoBS,EAAED,EAAY3H,KAASmH,EAAoBS,EAAE9C,EAAS9E,IAC5E/E,OAAO4M,eAAe/C,EAAS9E,EAAK,CAAE8H,YAAY,EAAMC,IAAKJ,EAAW3H,IAE1E,ECNDmH,EAAoBS,EAAI,CAACI,EAAKC,IAAUhN,OAAO4G,UAAUqG,eAAepG,KAAKkG,EAAKC,GCClFd,EAAoBvB,EAAKd,IACH,oBAAXqD,QAA0BA,OAAOC,aAC1CnN,OAAO4M,eAAe/C,EAASqD,OAAOC,YAAa,CAAEnI,MAAO,WAE7DhF,OAAO4M,eAAe/C,EAAS,aAAc,CAAE7E,OAAO,GAAO,E,i5GCQvD,IA0NFoI,EAQAC,EAlOQC,EAAS,8BAUlB,WAAYxR,GAAsB,MAoB7B,OApB6B,UACP,IAAvB,cAAMA,EAAW,QAAM,2EAEvB,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQL,EAAUK,OAClBiE,YAAa,CACTzD,YAAab,EAAUa,YACvBE,gBAAiBf,EAAUe,iBAE/BwD,eAAe,EACfC,eAAe,IAKnB,EAAK+C,OAAS,OAEd,EAAK8D,cAAgB,CACjB,eAAgB,8BACnB,CACL,CAyGC,OAvGD,2BAMA,WACI,IAAMW,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,KACA/D,KAAKmL,eAAa,QAEpBlJ,EAAAA,GAAiB,0BAEtBuD,KAAMsE,KAAKE,UAAU,CAAC,IAE1B,CAAC,GAGCgC,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAK3B,OAHA/D,KAAKuR,cAAcH,EAAaI,SAAUxF,GAElBA,EAAIyF,KAAK,QACrBtK,KAAI,SAACuK,GAAC,OAAKC,EAAOC,SAASF,EAAgB,GAC3D,GAEA,6BAiBA,SAAgBnE,GAA2E,IAA/DsE,EAAmB,UAAH,6CAAGR,EAAWS,QAChDhG,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,KACA/D,KAAKmL,eAAa,QAEpBlJ,EAAAA,GAAiB,iCAEtBuD,KAAMsE,KAAKE,UAAU,CAAE+H,MAAOxE,EAAIyE,cAAeH,KAErD,CAAC,GAGC7F,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAcH,EAAaa,gBAAiBjG,GAE1CkG,EAAWN,SAAS5F,EAAIyF,OACnC,GAAC,2BAED,SAAczE,EAAyBC,GACnC,IAAMC,EAAYD,EAASE,WAC3B,GAAkB,IAAdD,EAAJ,CAIA,IAAME,EAAQH,EAASwE,OACvB,GAAIvE,GAAa,MAAQA,GAAa,KAAM,CAGxC,IAAMiF,EACD/E,EAAMf,SAAuBe,EAAMhM,SAAuBgM,EAAMgF,OAGrE,GAAqB,8BAAjBhF,EAAMgF,OACN,MAAM,IAAIxL,EAAAA,EAAsBuL,EAAc/E,EAAMgF,QAIxD,MAAM,IAAIC,EAAgBF,EAAc/E,EAAMgF,OAAkBpF,EACpE,CAEA,GAAkB,OAAdE,EACA,MAAM,IAAImF,EACN,sCACA,uBACArF,EAtBR,CAyBJ,KAAC,EAxIiB,CAASnN,EAAAA,GA8IlB8R,EAAM,WAWf,WAAYW,EAAgBP,GAAe,yDACvC/R,KAAKsS,OAASA,EACdtS,KAAKuS,MAAQR,CACjB,CAIC,OAJA,gCAED,SAAgBN,GACZ,OAAO,IAAIE,EAAOF,EAAKe,OAAkBf,EAAKM,MAClD,KAAC,EAlBc,GAwBNG,EAAU,WAiBnB,WAAYO,EAAwBV,EAAeW,GAAmB,yFAClE1S,KAAK2S,eAAiBF,EACtBzS,KAAKuN,GAAKwE,EACV/R,KAAK4S,UAAYF,CACrB,CAQC,OARA,gCAED,SAAgBjB,GACZ,OAAO,IAAIS,EACPT,EAAKgB,eACLhB,EAAKM,MACLN,EAAKiB,UAEb,KAAC,EA7BkB,GAgCVL,EAAe,8BAUxB,WAAYjR,EAAiBkC,EAAc0J,GAAyB,MAGtC,OAHsC,UAC5C,IAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,kBACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,YAduB,CAAS3J,EAAAA,IAyBrC,SALK+N,GAAAA,EAAY,kCAAZA,EAAY,oBAKjB,CALKA,IAAAA,EAAY,KAQF,SAAVC,GAAAA,EAAAA,EAAU,sBAAVA,EAAAA,EAAU,uBAAVA,IAAAA,EAAU,K,oxECnOR,IAAMwB,EAAQ,8BAQjB,WAAY/S,GAAsB,MAa5B,OAb4B,UACR,IAAtB,cAAMA,EAAW,OAAK,oBAEtB,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQ,EAAKL,UAAUK,OACvBiE,YAAa,CACTzD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCuD,eAAe,EACfC,eAAe,IACjB,CACN,CAqaC,OAnaD,8BASA,WACI,IAEMwH,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,MACRhB,SAAUrG,KAAKO,OACf6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAbG,MAakBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,cAAevF,GAElC,IAAI8G,EAA2B,GAwB/B,OAtBYpP,EAAAA,EAAAA,WAAUsI,EAAIxG,MAEtB7B,KAAK,WACJoP,WACAC,MAAK,SAACC,EAAGC,GACN,IAAIC,EAAS,CAAC,EAEdD,EAAiBH,WAAWK,SAAQ,SAACC,GACjC,OAAQA,EAAMC,YACV,IAAK,OACDtP,OAAOuP,OAAOJ,EAAQ,CAAE5P,KAAM8P,EAAMG,gBACpC,MACJ,IAAK,eACDxP,OAAOuP,OAAOJ,EAAQ,CAClBM,aAAchP,KAAKsF,MAAMsJ,EAAMG,iBAG/C,IAEAV,EAAQzK,KAAK8K,EACjB,IAEGL,CACX,GAEA,yBAUA,SAAYY,EAAoBC,GAE5B,IACMtT,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,MACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,KACpBnN,MAAO,CACH,YAAa,IACboN,OAAQA,GAAU,IAEtB5P,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAlBG,MAkBkBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,gBAAiBvF,GAEpC,IAAI4H,EAA2B,GA+B/B,OA3BAlQ,EAAAA,EAAAA,WAAUsI,EAAIxG,MACT7B,KAAK,YACLqP,MAAK,SAACC,EAAGY,GACN,IAAI9C,EAAM,CAAC,EAEX8C,EAAiBd,WAAWK,SAAQ,SAACC,GACjC,OAAQA,EAAMC,YACV,IAAK,MACDtP,OAAOuP,OAAOxC,EAAK,CAAEhI,IAAKsK,EAAMG,gBAChC,MACJ,IAAK,eACDxP,OAAOuP,OAAOxC,EAAK,CAAE+C,aAAcrP,KAAKsF,MAAMsJ,EAAMG,iBACpD,MACJ,IAAK,OACDxP,OAAOuP,OAAOxC,EAAK,CAAEgD,KAAMV,EAAMG,gBACjC,MACJ,IAAK,OACDxP,OAAOuP,OAAOxC,EAAK,CAAEc,KAAMmC,SAASX,EAAMG,iBAC1C,MACJ,IAAK,eACDxP,OAAOuP,OAAOxC,EAAK,CAAEkD,aAAcZ,EAAMG,gBAErD,IAEAI,EAAQvL,KAAK0I,EACjB,IAEG6C,CACX,GACA,uBAWA,SAAUF,EAAoBQ,GAA6B,MAGjD7T,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQ,MACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,YAAIQ,GACxBnQ,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAdG,MAckBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc,YAAavF,GAEzB,IAAImI,EACPD,EACAzP,KAAKsF,MAAMiC,EAAIjI,QAAQ,kBACvBiI,EAAIjI,QAAc,KAClBiQ,SAAShI,EAAIjI,QAAQ,mBAIc,QADnC,EACCiI,EAAIjI,QAAQ,8BAAsB,QAAI,WAEvCiI,EAAIxG,KAEZ,GACA,uBAWA,SAAUkO,EAAoBQ,EAAmBE,GAE7C,IACM/T,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OALO,MAMPhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,YAAIQ,GACxBnQ,QAAS,CACLsQ,KAAMhU,GAEVmF,KAAM4O,GAEV,CAAC,GAGCpI,EAAMC,IAAAA,QAjBG,MAiBkBH,EAAc1F,IAAK0F,EAActG,KAAM,CACpEzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,YAAavF,EACpC,GAEA,0BASA,SAAa0H,EAAoBQ,GAE7B,IAAM7M,EAAS,SACThH,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,YAAIQ,GACxBnQ,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,eAAgBvF,EACvC,GAEA,mCAUA,SAAsB0H,EAAoBQ,GAEtC,IAAM7M,EAAS,OACThH,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAG7ByL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAU,QACVjB,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,EAAS,YAPb,WAQNnQ,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc,wBAAyBvF,GAErC,IAAIsI,EACPJ,GACAxQ,EAAAA,EAAAA,WAAUsI,EAAIxG,MACT7B,KAAK,YACLC,OAEb,GAEA,wBAUA,SACI8P,EACAQ,EACAK,EACAC,EACAJ,GAGA,IACM/T,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAC7BkG,EAAQ,cAAH,OAAiBiO,EAAU,qBAAaD,GAC7CzI,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OALO,MAMPhB,SAAU,QACVjB,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,EAAS,YAAI3N,GACvBxC,QAAS,CAAC,EACVyB,KAAM4O,GAEV,CAAC,GAGCpI,EAAMC,IAAAA,QAfG,MAekBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc,aAAcvF,GAE1B,IAAIyI,EAAOD,EAAYxI,EAAIjI,QAAc,KACpD,GAEA,qCAUA,SACI2P,EACAQ,EACAK,EACAG,GAGA,IAAMrN,EAAS,OACThH,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAC7BkG,EAAQ,YAAH,OAAegO,GACpB/O,EAAO,4BAAH,OAA+BkP,EACpCvN,KACG,SAACwN,GAAI,kCACoBA,EAAKH,WAAU,8BAAsBG,EAAKC,KAAI,qBAE1EzO,KAAK,IAAG,8BACP2F,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAU,QACVjB,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,EAAS,YAAI3N,GACvBxC,QAAS,CAAC,EACVyB,KAAMA,GAEV,CAAC,GAGCwG,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAG3B/D,KAAKuR,cAAc,0BAA2BvF,EAClD,GAEA,kCASA,SAAqB0H,EAAoBQ,EAAmBK,GAExD,IAAMlN,EAAS,SACThH,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAC7BkG,EAAQ,YAAH,OAAegO,GACpBzI,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAU,QACVjB,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,EAAS,YAAI3N,GACvBxC,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,uBAAwBvF,EAC/C,GAAC,2BAED,SAAcgB,EAAwBC,GAClC,IAAM4H,EAAiB5H,EAAS4H,OAC1B3H,EAAoBD,EAASE,WAC7BgF,EAAuBlF,EAASG,MAGtC,KAAIyH,GAAU,KAAOA,EAAS,KAAuB,IAAhB1C,GAAoC,IAAdjF,GAA3D,CAUA,GAAc,KAAV2H,GAAkB1C,GAAgBA,EAAa5J,WAAW,OAC1D,MAAM,IAAIuM,EAAe,qBAAsB,mBAAoB9H,GAGvE,IAAMK,EAAWhK,EAAAA,EAAAA,SAAkB4J,EAASzH,MAC5C,GACS,iCADD6H,EAAS/J,KAET,MAAM,IAAIsD,EAAAA,EAAsByG,EAASjM,QAASiM,EAAS/J,MAE3D,MAAM,IAAIwR,EAAezH,EAASjM,QAASiM,EAAS/J,MAAQ,UAAW0J,EAjB/E,CAmBJ,KAAC,EA3bgB,CAASnN,EAAAA,GA+bjBkV,EAAQ,GAUjB,WAAYxR,EAAckQ,GAAoB,8DAC1CzT,KAAKuD,KAAOA,EACZvD,KAAKyT,aAAeA,CACxB,IAISU,EAAQ,GAkBjB,WACIpL,EACA+K,EACAC,EACAlC,EACAoC,EACAG,GACF,6JACEpU,KAAK+I,IAAMA,EACX/I,KAAK8T,aAAeA,EACpB9T,KAAK+T,KAAOA,EACZ/T,KAAK6R,KAAOA,EACZ7R,KAAKiU,aAAeA,EACpBjU,KAAKoU,KAAOA,CAChB,IAISE,EAAiB,GAU1B,WAAYvL,EAAawL,GAAkB,yDACvCvU,KAAK+I,IAAMA,EACX/I,KAAKuU,SAAWA,CACpB,IAISE,EAAM,GAUf,WAAYD,EAAoBI,GAAc,4DAC1C5U,KAAKwU,WAAaA,EAClBxU,KAAK4U,KAAOA,CAChB,IAWSE,EAAc,8BAUvB,WAAY1T,EAAiBkC,EAAc0J,GAAmB,MAGhC,OAHgC,UACtC,IAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,iBACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,YAdsB,CAAS3J,EAAAA,G,o2FC3hB7B,IAsXF2R,GAtXQC,GAAoB,gCAiB7B,WAAYnV,GAAsB,MAoB7B,OApB6B,UACI,MAAlC,cAAMA,EAAW,mBAAiB,+EAElC,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQ,EAAKL,UAAUK,OACvBiE,YAAa,CACTzD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCuD,eAAe,EACfC,eAAe,IAKnB,EAAK+C,OAAS,OACd,EAAK8D,cAAgB,CACjB,eAAgB,8BACnB,CACL,CAyPC,OAvPD,+BAQA,WACI,IAAMW,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,kBAE5CyF,KAAMsE,KAAKE,UAAU,CAAC,IAE1B,CAAC,GAGCgC,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAK3B,OAHA/D,KAAKuR,cAAcyD,GAAwBE,YAAalJ,GAChCA,EAAIyF,KAAK,cAErBtK,KAAI,SAACgO,GAAC,OAAKC,GAAOxD,SAASuD,EAAgB,GAC3D,GAEA,uBAQA,SAAU5H,GACN,IAAMzB,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,qBAE5CyF,KAAMsE,KAAKE,UAAU,CAAEqL,SAAU9H,KAErC,CAAC,GAGCvB,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAK3B,OAFA/D,KAAKuR,cAAcyD,GAAwBM,eAAgBtJ,GAEpDoJ,GAAOxD,SAAS5F,EAAIyF,OAC/B,GAEA,0BAkBA,SACIlO,EACAgS,EACAC,EACAC,EACAC,GAEAD,EAAYA,IAAaE,EAAAA,EAAAA,MAEzB,IAAM7J,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,mBAE5CyF,KAAMsE,KAAKE,UAAU,CACjB4L,KAAMrS,EACNsS,YAAaL,EACbM,aAAcP,EACdQ,mBAAoBN,EACpBO,KAAMN,KAGd,CAAC,GAOC1J,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAcyD,GAAwBiB,aAAcjK,GAElDoJ,GAAOxD,SAAS5F,EAAIyF,OAC/B,GACA,4BAYA,SAAelE,EAAYgI,EAAgBE,GACvCA,EAAYA,IAAaE,EAAAA,EAAAA,MAEzB,IAAM7J,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,qBAE5CyF,KAAMsE,KAAKE,UAAU,CACjBqL,SAAU9H,EACVuI,aAAcP,EACdQ,mBAAoBN,KAG5B,CAAC,GAGCzJ,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAcyD,GAAwBkB,eAAgBlK,GAEpDoJ,GAAOxD,SAAS5F,EAAIyF,OAC/B,GAEA,0BAYA,SACIlE,EAAU,GAEZ,QADI4I,eAAAA,OAAc,IAAG,KAAE,MAAEC,WAEjBC,EAAwD,CAC1DhB,SAAU9H,IAIK,UAPc,IAAG,GAAK,GAQrC8I,EAAoC,4BAAI,EAExCA,EAA8B,qBAAIF,EAGtC,IAAMrK,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,mBAE5CyF,KAAMsE,KAAKE,UAAUqM,IAEzB,CAAC,GAGCrK,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAcyD,GAAwBsB,aAActK,EAC7D,GAAC,2BAED,SACIgB,EACAC,GAEA,IAAMC,EAAYD,EAASE,WAC3B,GAAkB,IAAdD,EAAJ,CAIA,IAAME,EAAQH,EAASwE,OACvB,GAAIvE,GAAa,MAAQA,GAAa,KAAM,CAGxC,IAAMiF,EACD/E,EAAMf,SAAuBe,EAAMhM,SAAuBgM,EAAMgF,OAGrE,GAAqB,8BAAjBhF,EAAMgF,OACN,MAAM,IAAIxL,EAAAA,EAAsBuL,EAAc/E,EAAMgF,QAIxD,MAAM,IAAImE,GAA2BpE,EAAc/E,EAAMgF,OAAkBpF,EAC/E,CAEA,GAAkB,OAAdE,EACA,MAAM,IAAIqJ,GACN,sCACA,uBACAvJ,EAtBR,CAyBJ,KAAC,EA/R4B,CAASnN,EAAAA,GAuS7BuV,GAAM,WAoBf,WACI7R,EACAiT,EACAC,EACAC,EACAC,EACAC,GAEF,IADElB,EAAyC,UAAH,6CAAG,GAAE,0MAE3C1V,KAAKuD,KAAOA,EACZvD,KAAKwW,IAAMA,EACXxW,KAAKuV,OAASkB,EACdzW,KAAK0W,YAAcA,EACnB1W,KAAK2W,iBAAmBA,EACxB3W,KAAK4W,gBAAkBA,EACvB5W,KAAK0V,KAAOA,CAChB,CAoBC,OAlBD,iCAQA,SAAgBjE,GACZ,OAAO,IAAI2D,EACP3D,EAAKmE,KACLnE,EAAKoF,IACLpF,EAAKqE,aACLrE,EAAKqF,YACLrF,EAAKsF,iBACLtF,EAAKuF,gBACLvF,EAAKuE,KAEb,KAAC,EAxDc,GA2DNO,GAA0B,gCAUnC,WAAYnV,EAAiBkC,EAAc0J,GAAoC,MAGjD,OAHiD,UACvD,MAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,6BACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,aAdkC,CAAS3J,EAAAA,G,22FAoBpB,SAAvB2R,GAAAA,EAAuB,0BAAvBA,EAAuB,gCAAvBA,EAAuB,4BAAvBA,EAAuB,gCAAvBA,EAAuB,6BAAvBA,KAAAA,GAAuB,KCvXrB,IA4OFiC,GA5OQC,GAAoB,gCAS7B,WAAYpX,GAAsB,MAmB5B,OAnB4B,WAI9B,MAHA,cAAMA,EAAW,QAGjB,+EACA,EAAKuH,OAAS,OACd,EAAK8D,cAAgB,CACjB,eAAgB,8BAGpB,EAAKrF,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQL,EAAUK,OAClBiE,YAAa,CACTzD,YAAab,EAAUa,YACvBE,gBAAiBf,EAAUe,iBAE/BwD,eAAe,EACfC,eAAe,IACjB,CACN,CAsEC,OApED,gCASA,SACIf,GAEmC,IADnC4T,EAA0B,UAAH,8CAEjBrL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,SACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,2BAEtBuD,KAAMsE,KAAKE,UAAU,CAAE4L,KAAMrS,EAAM6T,eAAgBD,KAEvD,CAAC,GAGCnL,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc0F,GAAwBI,aAAcrL,GAElDsL,GAAwB1F,SAAS5F,EAAIyF,OAChD,GAAC,2BAED,SACIzE,EACAC,GAEA,IAAMC,EAAYD,EAASE,WAC3B,GAAkB,IAAdD,EAAJ,CAIA,IAAME,EAAQH,EAASwE,OACvB,GAAIvE,GAAa,MAAQA,GAAa,KAAM,CAGxC,IAAMiF,EACD/E,EAAMf,SAAuBe,EAAMhM,SAAuBgM,EAAMgF,OAGrE,GAAqB,8BAAjBhF,EAAMgF,OACN,MAAM,IAAIxL,EAAAA,EAAsBuL,EAAc/E,EAAMgF,QAIxD,MAAM,IAAImF,GAA2BpF,EAAc/E,EAAMgF,OAAkBpF,EAC/E,CAEA,GAAkB,OAAdE,EACA,MAAM,IAAIqK,GACN,sCACA,uBACAvK,EAtBR,CAyBJ,KAAC,EAnG4B,CAASnN,EAAAA,GAyG7ByX,GAAuB,WAgEhC,WACId,EACAgB,EACAC,EACAlU,EACAmU,EACAC,EACAC,EACA5O,EACA6O,GACF,yPACE7X,KAAKwW,IAAMA,EACXxW,KAAKwX,SAAWA,EAChBxX,KAAKyX,iBAAmBA,EACxBzX,KAAKuD,KAAOA,EACZvD,KAAK0X,SAAWA,EAChB1X,KAAK2X,aAAeA,EACpB3X,KAAK4X,KAAOA,EACZ5X,KAAKgJ,MAAQA,EACbhJ,KAAK6X,QAAUA,CACnB,CAwBC,OAtBD,iCAQA,SAAgBpG,GACZ,IAAMqG,EAAYrG,EAAKsG,UAEvB,OAAO,IAAIT,EACPQ,EAAUjB,IACViB,EAAUE,SACVF,EAAUG,iBACVH,EAAUlC,KACVkC,EAAUI,SACVJ,EAAUK,aACVL,EAAUM,KACVN,EAAUO,MACVP,EAAUvM,QAElB,KAAC,EA5G+B,GA+GvBgM,GAA0B,gCAUnC,WAAYnW,EAAiBkC,EAAc0J,GAAoC,MAGjD,OAHiD,WACvD,MAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,6BACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,aAdkC,CAAS3J,EAAAA,IAoBpB,SAAvB4T,GAAAA,EAAuB,6BAAvBA,KAAAA,GAAuB,K","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n \n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const query = 'uploads'\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const query = `partNumber=${partNumber}&uploadId=${uploadId}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const query = `uploadId=${uploadId}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n body: body,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const query = `uploadId=${uploadId}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"aws.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { 'uploads': '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file diff --git a/build/index.js b/build/index.js index 037e72a..1f3c463 100644 --- a/build/index.js +++ b/build/index.js @@ -1,2 +1,2 @@ -(()=>{var e={393:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){for(var r=0;rc});var c=function(){function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i(this,"awsConfig",void 0),i(this,"serviceName",void 0),i(this,"_host",void 0),i(this,"_scheme",void 0),this.awsConfig=t,this.serviceName=r}var t,r,n;return t=e,(r=[{key:"host",get:function(){return null==this._host&&(this._host="".concat(this.serviceName,".").concat(this.awsConfig.region,".").concat(this.awsConfig.endpoint)),this._host},set:function(e){this._host=e}},{key:"scheme",get:function(){return null==this._scheme&&(this._scheme=this.awsConfig.scheme),this._scheme},set:function(e){this._scheme=e}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}()},223:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){if(t&&("object"===n(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function i(e){var t="function"==typeof Map?new Map:void 0;return i=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return a(e,arguments,u(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),s(n,e)},i(e)}function a(e,t,r){return a=c()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&s(o,r.prototype),o},a.apply(null,arguments)}function c(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var r=0;rv,o:()=>d});var d=function(){function e(t){if(f(this,e),p(this,"region",void 0),p(this,"accessKeyId",void 0),p(this,"secretAccessKey",void 0),p(this,"sessionToken",void 0),p(this,"scheme","https"),p(this,"endpoint","amazonaws.com"),!t.region||""===t.region)throw new v('invalid AWS region; reason: expected a valid AWS region name (e.g. "us-east-1"), got `'.concat(t.region,"`"));if(!t.accessKeyId||""===t.accessKeyId)throw new v("invalid AWS access key ID; reason: expected a non empty string, got `".concat(t.accessKeyId,"`"));if(t.accessKeyId.length<16||t.accessKeyId.length>128)throw new v("invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ".concat(t.accessKeyId.length));if(!t.secretAccessKey||""===t.secretAccessKey)throw new v("invalid AWS secret access key; reason: expected a non empty string, got `".concat(t.secretAccessKey,"`"));if(t.secretAccessKey.length<16||t.secretAccessKey.length>128)throw new v("invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ".concat(t.secretAccessKey.length));this.region=t.region,this.accessKeyId=t.accessKeyId,this.secretAccessKey=t.secretAccessKey,void 0!==t.sessionToken&&(this.sessionToken=t.sessionToken),void 0!==t.scheme&&(this.scheme=t.scheme),void 0!==t.endpoint&&(this.endpoint=t.endpoint)}return h(e,null,[{key:"fromEnvironment",value:function(t){return new e({region:__ENV.AWS_REGION,accessKeyId:__ENV.AWS_ACCESS_KEY_ID,secretAccessKey:__ENV.AWS_SECRET_ACCESS_KEY,sessionToken:__ENV.AWS_SESSION_TOKEN,scheme:null==t?void 0:t.scheme,endpoint:null==t?void 0:t.endpoint})}}]),e}(),v=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(i,e);var t,r,n=(t=i,r=c(),function(){var e,n=u(t);if(r){var i=u(this).constructor;e=Reflect.construct(n,arguments,i)}else e=n.apply(this,arguments);return o(this,e)});function i(e){return f(this,i),n.call(this,e)}return h(i)}(i(Error))},592:(e,t,r)=>{"use strict";r.d(t,{$l:()=>o,Aq:()=>m,B3:()=>v,Dz:()=>d,K0:()=>n,NL:()=>u,Qk:()=>i,R$:()=>f,SG:()=>w,U4:()=>h,VR:()=>s,a_:()=>l,al:()=>g,cG:()=>c,mc:()=>p,md:()=>b,n8:()=>j,sH:()=>S,th:()=>O,w1:()=>y,zC:()=>a});var n="X-Amz-Algorithm",o="X-Amz-Credential",i="X-Amz-Date",a="X-Amz-Expires",c="X-Amz-Signature",s="X-Amz-SignedHeaders",u="X-Amz-Security-Token",f="x-amz-content-sha256",l=i.toLowerCase(),h=c.toLowerCase(),p="X-Amz-Target".toLowerCase(),y=u.toLowerCase(),d="authorization",v=[d,l,"date"],b="host",m={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},g="aws4_request",w="AWS4-HMAC-SHA256",O=604800,S="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",j="UNSIGNED-PAYLOAD"},380:(e,t,r)=>{"use strict";r.d(t,{t:()=>y});var n=r(255);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){for(var r=0;r{"use strict";function n(e,t){e=e.toLowerCase();for(var r=0,n=Object.keys(t);rn})},137:(e,t,r)=>{"use strict";r.d(t,{L:()=>j,w:()=>P});var n=r(400),o=r.n(n),i=r(592),a=r(380),c=r(491),s=r(23);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=p(e);if(t){var o=p(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return h(this,r)}}function h(e,t){if(t&&("object"===u(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function p(e){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},p(e)}function y(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return d(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return d(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){c=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw i}}}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1&&delete e.headers[O]}e.headers[i.a_]=p,this.credentials.sessionToken&&(e.headers[i.w1]=this.credentials.sessionToken),ArrayBuffer.isView(e.body)&&(e.body=e.body.buffer),e.body||(e.body="");var S=this.computePayloadHash(e);!(0,c.L)(i.R$,e.headers)&&this.applyChecksum&&(e.headers[i.R$]=S);var j=this.computeCanonicalHeaders(e,u,l),P=this.calculateSignature(p,m,this.deriveSigningKey(this.credentials,d,v,y),this.createCanonicalRequest(e,j,S));e.headers[i.Dz]="".concat(i.SG," ")+"Credential=".concat(this.credentials.accessKeyId,"/").concat(m,", ")+"SignedHeaders=".concat(Object.keys(j).sort().join(";"),", ")+"Signature=".concat(P);var _="".concat(e.protocol,"://").concat(e.hostname);return e.path&&(_+=e.path),e.query&&(_+="?".concat(this.serializeQueryParameters(e.query))),b({url:_},e)}},{key:"presign",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.signingDate,n=void 0===r?new Date:r,o=t.expiresIn,a=void 0===o?3600:o,c=t.unsignableHeaders,s=t.unhoistableHeaders,u=t.signableHeaders,f=t.signingRegion,l=t.signingService,h=k(n),p=h.longDate,y=h.shortDate,d=f||this.region,v=l||this.service;if(a>i.th)throw new P("Signature version 4 presigned URLs can't be valid for more than 7 days");var m="".concat(y,"/").concat(d,"/").concat(v,"/").concat(i.al),g=this.moveHeadersToQuery(e,{unhoistableHeaders:s});g.headers[i.md]=e.hostname,this.credentials.sessionToken&&(g.query[i.NL]=this.credentials.sessionToken),g.query[i.K0]=i.SG,g.query[i.$l]="".concat(this.credentials.accessKeyId,"/").concat(m),g.query[i.Qk]=p,g.query[i.zC]=a.toString(10);var w=this.computeCanonicalHeaders(g,c,u);g.query[i.VR]=Object.keys(w).sort().join(";");var O=this.deriveSigningKey(this.credentials,v,d,y),S=this.computePayloadHash(e),j=this.createCanonicalRequest(g,w,S);g.query[i.cG]=this.calculateSignature(p,m,O,j);var _="".concat(g.protocol,"://").concat(g.hostname);return g.path&&(_+=g.path),g.query&&(_+="?".concat(this.serializeQueryParameters(g.query))),b({url:_},g)}},{key:"createCanonicalRequest",value:function(e,t,r){var n=Object.keys(t).sort(),o=n.map((function(e){return"".concat(e,":").concat(t[e])})).join("\n"),i=n.join(";");return"".concat(e.method,"\n")+"".concat(this.computeCanonicalURI(e),"\n")+"".concat(this.computeCanonicalQuerystring(e),"\n")+"".concat(o,"\n\n")+"".concat(i,"\n")+"".concat(r)}},{key:"createStringToSign",value:function(e,t,r){var n=o().sha256(r,"hex");return"".concat(i.SG,"\n")+"".concat(e,"\n")+"".concat(t,"\n")+"".concat(n)}},{key:"calculateSignature",value:function(e,t,r,n){var i=this.createStringToSign(e,t,n);return o().hmac("sha256",r,i,"hex")}},{key:"deriveSigningKey",value:function(e,t,r,n){var i=e.secretAccessKey,a=o().hmac("sha256","AWS4"+i,n,"binary"),c=o().hmac("sha256",a,r,"binary"),s=o().hmac("sha256",c,t,"binary");return o().hmac("sha256",s,"aws4_request","binary")}},{key:"computeCanonicalURI",value:function(e){var t=e.path;if(this.uriEscapePath){var r,n=[],o=y(t.split("/"));try{for(o.s();!(r=o.n()).done;){var i=r.value;0!==(null==i?void 0:i.length)&&("."!==i&&(".."===i?n.pop():n.push(i)))}}catch(e){o.e(e)}finally{o.f()}var a=null!=t&&t.startsWith("/")?"/":"",c=n.join("/"),s=n.length>0&&null!=t&&t.endsWith("/")?"/":"",u="".concat(a).concat(c).concat(s);return encodeURIComponent(u).replace(/%2F/g,"/")}return t}},{key:"computeCanonicalQuerystring",value:function(e){var t,r=e.query,n=void 0===r?{}:r,o=[],a={},c=function(e){if(e.toLowerCase()===i.U4)return"continue";o.push(e);var t=n[e];"string"==typeof t?a[e]="".concat(_(e),"=").concat(_(t)):Array.isArray(t)&&(a[e]=t.slice(0).sort().reduce((function(t,r){return t.concat(["".concat(_(e),"=").concat(_(r))])}),[]).join("&"))},s=y(Object.keys(n).sort());try{for(s.s();!(t=s.n()).done;)c(t.value)}catch(e){s.e(e)}finally{s.f()}return o.map((function(e){return a[e]})).filter((function(e){return e})).join("&")}},{key:"computeCanonicalHeaders",value:function(e,t,r){var n,o=e.headers,a={},c=y(Object.keys(o).sort());try{for(c.s();!(n=c.n()).done;){var s=n.value;if(null!=o[s]){var u=s.toLowerCase();(u in i.Aq||null!=t&&t.has(u))&&(!r||r&&!r.has(u))||(a[u]=o[s].trim().replace(/\s+/g," "))}}}catch(e){c.e(e)}finally{c.f()}return a}},{key:"computePayloadHash",value:function(e){var t=e.headers,r=e.body;return t[i.R$]?t[i.R$]:null==r?i.sH:"string"==typeof r||(0,s.e)(r)?o().sha256(r,"hex").toLowerCase():ArrayBuffer.isView(r)?o().sha256(r.buffer,"hex").toLowerCase():i.n8}},{key:"moveHeadersToQuery",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=JSON.parse(JSON.stringify(e)),n=r.headers,o=r.query,i=void 0===o?{}:o,a=0,c=Object.keys(n);a{"use strict";function n(e){return"function"==typeof ArrayBuffer&&(e instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(e))}function o(e){return Object.keys(e).reduce((function(t,r){var n=e[r];return null!=n&&t.push("".concat(encodeURIComponent(r),"=").concat(encodeURIComponent(n))),t}),[]).join("&")}r.d(t,{C:()=>o,e:()=>n})},41:(e,t,r)=>{"use strict";r.d(t,{SQSClient:()=>P});r(223);var n=r(137),o=r(393),i=r(409),a=r.n(i),c=r(23),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{},n="POST",o={Action:"SendMessage",Version:j,QueueUrl:e,MessageBody:t};void 0!==r.messageDeduplicationId&&(o=l(l({},o),{},{MessageDeduplicationId:r.messageDeduplicationId})),void 0!==r.messageGroupId&&(o=l(l({},o),{},{MessageGroupId:r.messageGroupId}));var i=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l({},this.commonHeaders),body:(0,c.C)(o)},{}),s=a().request(n,i.url,i.body||"",{headers:i.headers});this._handleError("SendMessage",s);var u=s.html("SendMessageResponse > SendMessageResult");return new _(u.find("MessageId").text(),u.find("MD5OfMessageBody").text())}},{key:"listQueues",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="POST",r={Action:"ListQueues",Version:j};void 0!==(null==e?void 0:e.maxResults)&&(r=l(l({},r),{},{MaxResults:e.maxResults})),void 0!==(null==e?void 0:e.nextToken)&&(r=l(l({},r),{},{NextToken:e.nextToken})),void 0!==(null==e?void 0:e.queueNamePrefix)&&(r=l(l({},r),{},{QueueNamePrefix:e.queueNamePrefix}));var n=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},{Host:this.host}),body:(0,c.C)(r)},{}),o=a().request(t,n.url,n.body||"",{headers:n.headers});this._handleError("ListQueues",o);var i=o.html();return{urls:i.find("QueueUrl").toArray().map((function(e){return e.text()})),nextToken:i.find("NextToken").text()||void 0}}},{key:"_handleError",value:function(e,t){var r=t.error_code;if(""!=t.error||0!==r){var o=s.t.parseXML(t.body);if("AuthorizationHeaderMalformed"===o.code)throw new n.w(o.message,o.code);throw new k(o.message,o.code||"unknown",e)}}}]),r}(o.k),_=y((function e(t,r){h(this,e),O(this,"id",void 0),O(this,"bodyMD5",void 0),this.id=t,this.bodyMD5=r})),k=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="SQSServiceError",i.operation=o,i}return y(r)}(s.t)},877:(e,t,r)=>{var n=r(570),o=r(171),i=o;i.v1=n,i.v4=o,e.exports=i},327:e=>{for(var t=[],r=0;r<256;++r)t[r]=(r+256).toString(16).substr(1);e.exports=function(e,r){var n=r||0,o=t;return[o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]]].join("")}},217:e=>{var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(t){var r=new Uint8Array(16);e.exports=function(){return t(r),r}}else{var n=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),n[t]=e>>>((3&t)<<3)&255;return n}}},570:(e,t,r)=>{var n,o,i=r(217),a=r(327),c=0,s=0;e.exports=function(e,t,r){var u=t&&r||0,f=t||[],l=(e=e||{}).node||n,h=void 0!==e.clockseq?e.clockseq:o;if(null==l||null==h){var p=i();null==l&&(l=n=[1|p[0],p[1],p[2],p[3],p[4],p[5]]),null==h&&(h=o=16383&(p[6]<<8|p[7]))}var y=void 0!==e.msecs?e.msecs:(new Date).getTime(),d=void 0!==e.nsecs?e.nsecs:s+1,v=y-c+(d-s)/1e4;if(v<0&&void 0===e.clockseq&&(h=h+1&16383),(v<0||y>c)&&void 0===e.nsecs&&(d=0),d>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");c=y,s=d,o=h;var b=(1e4*(268435455&(y+=122192928e5))+d)%4294967296;f[u++]=b>>>24&255,f[u++]=b>>>16&255,f[u++]=b>>>8&255,f[u++]=255&b;var m=y/4294967296*1e4&268435455;f[u++]=m>>>8&255,f[u++]=255&m,f[u++]=m>>>24&15|16,f[u++]=m>>>16&255,f[u++]=h>>>8|128,f[u++]=255&h;for(var g=0;g<6;++g)f[u+g]=l[g];return t||a(f)}},171:(e,t,r)=>{var n=r(217),o=r(327);e.exports=function(e,t,r){var i=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var a=(e=e||{}).random||(e.rng||n)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var c=0;c<16;++c)t[i+c]=a[c];return t||o(a)}},400:e=>{"use strict";e.exports=require("k6/crypto")},255:e=>{"use strict";e.exports=require("k6/html")},409:e=>{"use strict";e.exports=require("k6/http")}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";r.r(n),r.d(n,{AMZ_CONTENT_SHA256_HEADER:()=>o.R$,AWSConfig:()=>t.o,InvalidAWSConfigError:()=>t.l,InvalidSignatureError:()=>e.w,KMSClient:()=>_,KMSDataKey:()=>C,KMSServiceError:()=>E,S3Bucket:()=>G,S3Client:()=>B,S3Object:()=>U,S3ServiceError:()=>J,SQSClient:()=>De.SQSClient,Secret:()=>le,SecretsManagerClient:()=>fe,SecretsManagerServiceError:()=>he,SignatureV4:()=>e.L,SystemsManagerClient:()=>Ee,SystemsManagerParameter:()=>Te,SystemsManagerServiceError:()=>Ae,UNSIGNED_PAYLOAD:()=>o.n8});var e=r(137),t=r(223),o=r(592),i=r(409),a=r.n(i),c=r(393),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:P.Size256,r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},O({},o.mc,"TrentService.GenerateDataKey")),body:JSON.stringify({KeyId:e,NumberOfBytes:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(j.GenerateDataKey,n),C.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new E(i,o.__type,t)}if(1500===n)throw new E("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),k=function(){function e(t,r){h(this,e),O(this,"keyArn",void 0),O(this,"keyId",void 0),this.keyArn=t,this.keyId=r}return y(e,null,[{key:"fromJSON",value:function(t){return new e(t.KeyArn,t.KeyId)}}]),e}(),C=function(){function e(t,r,n){h(this,e),O(this,"id",void 0),O(this,"ciphertextBlob",void 0),O(this,"plaintext",void 0),this.ciphertextBlob=t,this.id=r,this.plaintext=n}return y(e,null,[{key:"fromJSON",value:function(t){return new e(t.CiphertextBlob,t.KeyId,t.Plaintext)}}]),e}(),E=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="KMSServiceError",i.operation=o,i}return y(r)}(s.t);!function(e){e.GenerateDataKey="GenerateDataKey",e.ListKeys="ListKeys"}(j||(j={})),function(e){e[e.Size256=32]="Size256",e[e.Size512=64]="Size512"}(P||(P={}));var T=r(255);function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function D(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function R(e,t){for(var r=0;r".concat(e.partNumber,"").concat(e.eTag,"")})).join(""),""),u=this.signature.sign({method:o,protocol:"https",hostname:i,path:"/".concat(t,"?").concat(c),headers:{},body:s},{}),f=a().request(o,u.url,u.body||"",{headers:u.headers});this._handle_error("CompleteMultipartUpload",f)}},{key:"abortMultipartUpload",value:function(e,t,r){var n="DELETE",o="".concat(e,".").concat(this.host),i="uploadId=".concat(r),c=this.signature.sign({method:n,protocol:"https",hostname:o,path:"/".concat(t,"?").concat(i),headers:{}},{}),s=a().request(n,c.url,c.body||"",{headers:c.headers});this._handle_error("AbortMultipartUpload",s)}},{key:"_handle_error",value:function(t,r){var n=r.status,o=r.error_code,i=r.error;if(!(n>=200&&n<300&&""==i&&0===o)){if(301==n||i&&i.startsWith("301"))throw new J("Resource not found","ResourceNotFound",t);var a=s.t.parseXML(r.body);if("AuthorizationHeaderMalformed"===a.code)throw new e.w(a.message,a.code);throw new J(a.message,a.code||"unknown",t)}}}]),n}(c.k),G=x((function e(t,r){D(this,e),H(this,"name",void 0),H(this,"creationDate",void 0),this.name=t,this.creationDate=r})),U=x((function e(t,r,n,o,i,a){D(this,e),H(this,"key",void 0),H(this,"lastModified",void 0),H(this,"etag",void 0),H(this,"size",void 0),H(this,"storageClass",void 0),H(this,"data",void 0),this.key=t,this.lastModified=r,this.etag=n,this.size=o,this.storageClass=i,this.data=a})),V=x((function e(t,r){D(this,e),H(this,"key",void 0),H(this,"uploadId",void 0),this.key=t,this.uploadId=r})),W=x((function e(t,r){D(this,e),H(this,"partNumber",void 0),H(this,"eTag",void 0),this.partNumber=t,this.eTag=r})),J=function(e){N(r,e);var t=K(r);function r(e,n,o){var i;return D(this,r),H(L(i=t.call(this,e,n)),"operation",void 0),i.name="S3ServiceError",i.operation=o,i}return x(r)}(s.t),Q=r(877);function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function $(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new he(i,o.__type,t)}if(1500===n)throw new he("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),le=function(){function e(t,r,n,o,i,a){var c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:[];Y(this,e),ce(this,"name",void 0),ce(this,"arn",void 0),ce(this,"secret",void 0),ce(this,"createdDate",void 0),ce(this,"lastAccessedDate",void 0),ce(this,"lastChangedDate",void 0),ce(this,"tags",void 0),this.name=t,this.arn=r,this.secret=n,this.createdDate=o,this.lastAccessedDate=i,this.lastChangedDate=a,this.tags=c}return ee(e,null,[{key:"fromJSON",value:function(t){return new e(t.Name,t.ARN,t.SecretString,t.CreatedDate,t.LastAccessedDate,t.LastChangedDate,t.Tags)}}]),e}(),he=function(e){te(r,e);var t=ne(r);function r(e,n,o){var i;return Y(this,r),ce(ie(i=t.call(this,e,n)),"operation",void 0),i.name="SecretsManagerServiceError",i.operation=o,i}return ee(r)}(s.t);function pe(e){return pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},pe(e)}function ye(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function de(e){for(var t=1;t1&&void 0!==arguments[1]&&arguments[1],r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:de(de({},this.commonHeaders),{},_e({},o.mc,"AmazonSSM.GetParameter")),body:JSON.stringify({Name:e,WithDecryption:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(Ce.GetParameter,n),Te.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new Ae(i,o.__type,t)}if(1500===n)throw new Ae("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),Te=function(){function e(t,r,n,o,i,a,c,s,u){ve(this,e),_e(this,"arn",void 0),_e(this,"dataType",void 0),_e(this,"lastModifiedDate",void 0),_e(this,"name",void 0),_e(this,"selector",void 0),_e(this,"sourceResult",void 0),_e(this,"type",void 0),_e(this,"value",void 0),_e(this,"version",void 0),this.arn=t,this.dataType=r,this.lastModifiedDate=n,this.name=o,this.selector=i,this.sourceResult=a,this.type=c,this.value=s,this.version=u}return me(e,null,[{key:"fromJSON",value:function(t){var r=t.Parameter;return new e(r.ARN,r.DataType,r.LastModifiedDate,r.Name,r.Selector,r.SourceResult,r.Type,r.Value,r.Version)}}]),e}(),Ae=function(e){ge(r,e);var t=Oe(r);function r(e,n,o){var i;return ve(this,r),_e(je(i=t.call(this,e,n)),"operation",void 0),i.name="SystemsManagerServiceError",i.operation=o,i}return me(r)}(s.t);!function(e){e.GetParameter="GetParameter"}(Ce||(Ce={}));var De=r(41)})();var o=exports;for(var i in n)o[i]=n[i];n.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})(); +(()=>{var e={393:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){for(var r=0;rc});var c=function(){function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),i(this,"awsConfig",void 0),i(this,"serviceName",void 0),i(this,"_host",void 0),i(this,"_scheme",void 0),this.awsConfig=t,this.serviceName=r}var t,r,n;return t=e,(r=[{key:"host",get:function(){return null==this._host&&(this._host="".concat(this.serviceName,".").concat(this.awsConfig.region,".").concat(this.awsConfig.endpoint)),this._host},set:function(e){this._host=e}},{key:"scheme",get:function(){return null==this._scheme&&(this._scheme=this.awsConfig.scheme),this._scheme},set:function(e){this._scheme=e}}])&&o(t.prototype,r),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}()},223:(e,t,r)=>{"use strict";function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,t){if(t&&("object"===n(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function i(e){var t="function"==typeof Map?new Map:void 0;return i=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return a(e,arguments,u(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),s(n,e)},i(e)}function a(e,t,r){return a=c()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&s(o,r.prototype),o},a.apply(null,arguments)}function c(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function s(e,t){return s=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},s(e,t)}function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var r=0;rv,o:()=>d});var d=function(){function e(t){if(f(this,e),y(this,"region",void 0),y(this,"accessKeyId",void 0),y(this,"secretAccessKey",void 0),y(this,"sessionToken",void 0),y(this,"scheme","https"),y(this,"endpoint","amazonaws.com"),!t.region||""===t.region)throw new v('invalid AWS region; reason: expected a valid AWS region name (e.g. "us-east-1"), got `'.concat(t.region,"`"));if(!t.accessKeyId||""===t.accessKeyId)throw new v("invalid AWS access key ID; reason: expected a non empty string, got `".concat(t.accessKeyId,"`"));if(t.accessKeyId.length<16||t.accessKeyId.length>128)throw new v("invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ".concat(t.accessKeyId.length));if(!t.secretAccessKey||""===t.secretAccessKey)throw new v("invalid AWS secret access key; reason: expected a non empty string, got `".concat(t.secretAccessKey,"`"));if(t.secretAccessKey.length<16||t.secretAccessKey.length>128)throw new v("invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ".concat(t.secretAccessKey.length));this.region=t.region,this.accessKeyId=t.accessKeyId,this.secretAccessKey=t.secretAccessKey,void 0!==t.sessionToken&&(this.sessionToken=t.sessionToken),void 0!==t.scheme&&(this.scheme=t.scheme),void 0!==t.endpoint&&(this.endpoint=t.endpoint)}return h(e,null,[{key:"fromEnvironment",value:function(t){return new e({region:__ENV.AWS_REGION,accessKeyId:__ENV.AWS_ACCESS_KEY_ID,secretAccessKey:__ENV.AWS_SECRET_ACCESS_KEY,sessionToken:__ENV.AWS_SESSION_TOKEN,scheme:null==t?void 0:t.scheme,endpoint:null==t?void 0:t.endpoint})}}]),e}(),v=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}(i,e);var t,r,n=(t=i,r=c(),function(){var e,n=u(t);if(r){var i=u(this).constructor;e=Reflect.construct(n,arguments,i)}else e=n.apply(this,arguments);return o(this,e)});function i(e){return f(this,i),n.call(this,e)}return h(i)}(i(Error))},592:(e,t,r)=>{"use strict";r.d(t,{$l:()=>o,Aq:()=>m,B3:()=>v,Dz:()=>d,K0:()=>n,NL:()=>u,Qk:()=>i,R$:()=>f,SG:()=>w,U4:()=>h,VR:()=>s,a_:()=>l,al:()=>g,cG:()=>c,mc:()=>y,md:()=>b,n8:()=>j,sH:()=>S,th:()=>O,w1:()=>p,zC:()=>a});var n="X-Amz-Algorithm",o="X-Amz-Credential",i="X-Amz-Date",a="X-Amz-Expires",c="X-Amz-Signature",s="X-Amz-SignedHeaders",u="X-Amz-Security-Token",f="x-amz-content-sha256",l=i.toLowerCase(),h=c.toLowerCase(),y="X-Amz-Target".toLowerCase(),p=u.toLowerCase(),d="authorization",v=[d,l,"date"],b="host",m={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},g="aws4_request",w="AWS4-HMAC-SHA256",O=604800,S="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",j="UNSIGNED-PAYLOAD"},380:(e,t,r)=>{"use strict";r.d(t,{t:()=>p});var n=r(255);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){for(var r=0;r{"use strict";function n(e,t){e=e.toLowerCase();for(var r=0,n=Object.keys(t);rn})},137:(e,t,r)=>{"use strict";r.d(t,{L:()=>j,w:()=>P});var n=r(400),o=r.n(n),i=r(592),a=r(380),c=r(491),s=r(23);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){return f=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},f(e,t)}function l(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,n=y(e);if(t){var o=y(this).constructor;r=Reflect.construct(n,arguments,o)}else r=n.apply(this,arguments);return h(this,r)}}function h(e,t){if(t&&("object"===u(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function y(e){return y=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},y(e)}function p(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(!e)return;if("string"==typeof e)return d(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);"Object"===r&&e.constructor&&(r=e.constructor.name);if("Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return d(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){c=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw i}}}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1&&delete e.headers[O]}e.headers[i.a_]=y,this.credentials.sessionToken&&(e.headers[i.w1]=this.credentials.sessionToken),ArrayBuffer.isView(e.body)&&(e.body=e.body.buffer),e.body||(e.body="");var S=this.computePayloadHash(e);!(0,c.L)(i.R$,e.headers)&&this.applyChecksum&&(e.headers[i.R$]=S);var j=this.computeCanonicalHeaders(e,u,l),P=this.calculateSignature(y,m,this.deriveSigningKey(this.credentials,d,v,p),this.createCanonicalRequest(e,j,S));e.headers[i.Dz]="".concat(i.SG," ")+"Credential=".concat(this.credentials.accessKeyId,"/").concat(m,", ")+"SignedHeaders=".concat(Object.keys(j).sort().join(";"),", ")+"Signature=".concat(P);var _="".concat(e.protocol,"://").concat(e.hostname);return e.path&&(_+=e.path),e.query&&(_+="?".concat(this.serializeQueryParameters(e.query))),b({url:_},e)}},{key:"presign",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.signingDate,n=void 0===r?new Date:r,o=t.expiresIn,a=void 0===o?3600:o,c=t.unsignableHeaders,s=t.unhoistableHeaders,u=t.signableHeaders,f=t.signingRegion,l=t.signingService,h=k(n),y=h.longDate,p=h.shortDate,d=f||this.region,v=l||this.service;if(a>i.th)throw new P("Signature version 4 presigned URLs can't be valid for more than 7 days");var m="".concat(p,"/").concat(d,"/").concat(v,"/").concat(i.al),g=this.moveHeadersToQuery(e,{unhoistableHeaders:s});g.headers[i.md]=e.hostname,this.credentials.sessionToken&&(g.query[i.NL]=this.credentials.sessionToken),g.query[i.K0]=i.SG,g.query[i.$l]="".concat(this.credentials.accessKeyId,"/").concat(m),g.query[i.Qk]=y,g.query[i.zC]=a.toString(10);var w=this.computeCanonicalHeaders(g,c,u);g.query[i.VR]=Object.keys(w).sort().join(";");var O=this.deriveSigningKey(this.credentials,v,d,p),S=this.computePayloadHash(e),j=this.createCanonicalRequest(g,w,S);g.query[i.cG]=this.calculateSignature(y,m,O,j);var _="".concat(g.protocol,"://").concat(g.hostname);return g.path&&(_+=g.path),g.query&&(_+="?".concat(this.serializeQueryParameters(g.query))),b({url:_},g)}},{key:"createCanonicalRequest",value:function(e,t,r){var n=Object.keys(t).sort(),o=n.map((function(e){return"".concat(e,":").concat(t[e])})).join("\n"),i=n.join(";");return"".concat(e.method,"\n")+"".concat(this.computeCanonicalURI(e),"\n")+"".concat(this.computeCanonicalQuerystring(e),"\n")+"".concat(o,"\n\n")+"".concat(i,"\n")+"".concat(r)}},{key:"createStringToSign",value:function(e,t,r){var n=o().sha256(r,"hex");return"".concat(i.SG,"\n")+"".concat(e,"\n")+"".concat(t,"\n")+"".concat(n)}},{key:"calculateSignature",value:function(e,t,r,n){var i=this.createStringToSign(e,t,n);return o().hmac("sha256",r,i,"hex")}},{key:"deriveSigningKey",value:function(e,t,r,n){var i=e.secretAccessKey,a=o().hmac("sha256","AWS4"+i,n,"binary"),c=o().hmac("sha256",a,r,"binary"),s=o().hmac("sha256",c,t,"binary");return o().hmac("sha256",s,"aws4_request","binary")}},{key:"computeCanonicalURI",value:function(e){var t=e.path;if(this.uriEscapePath){var r,n=[],o=p(t.split("/"));try{for(o.s();!(r=o.n()).done;){var i=r.value;0!==(null==i?void 0:i.length)&&("."!==i&&(".."===i?n.pop():n.push(i)))}}catch(e){o.e(e)}finally{o.f()}var a=null!=t&&t.startsWith("/")?"/":"",c=n.join("/"),s=n.length>0&&null!=t&&t.endsWith("/")?"/":"",u="".concat(a).concat(c).concat(s);return encodeURIComponent(u).replace(/%2F/g,"/")}return t}},{key:"computeCanonicalQuerystring",value:function(e){var t,r=e.query,n=void 0===r?{}:r,o=[],a={},c=function(e){if(e.toLowerCase()===i.U4)return"continue";o.push(e);var t=n[e];"string"==typeof t?a[e]="".concat(_(e),"=").concat(_(t)):Array.isArray(t)&&(a[e]=t.slice(0).sort().reduce((function(t,r){return t.concat(["".concat(_(e),"=").concat(_(r))])}),[]).join("&"))},s=p(Object.keys(n).sort());try{for(s.s();!(t=s.n()).done;)c(t.value)}catch(e){s.e(e)}finally{s.f()}return o.map((function(e){return a[e]})).filter((function(e){return e})).join("&")}},{key:"computeCanonicalHeaders",value:function(e,t,r){var n,o=e.headers,a={},c=p(Object.keys(o).sort());try{for(c.s();!(n=c.n()).done;){var s=n.value;if(null!=o[s]){var u=s.toLowerCase();(u in i.Aq||null!=t&&t.has(u))&&(!r||r&&!r.has(u))||(a[u]=o[s].trim().replace(/\s+/g," "))}}}catch(e){c.e(e)}finally{c.f()}return a}},{key:"computePayloadHash",value:function(e){var t=e.headers,r=e.body;return t[i.R$]?t[i.R$]:null==r?i.sH:"string"==typeof r||(0,s.e)(r)?o().sha256(r,"hex").toLowerCase():ArrayBuffer.isView(r)?o().sha256(r.buffer,"hex").toLowerCase():i.n8}},{key:"moveHeadersToQuery",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=JSON.parse(JSON.stringify(e)),n=r.headers,o=r.query,i=void 0===o?{}:o,a=0,c=Object.keys(n);a{"use strict";function n(e){return"function"==typeof ArrayBuffer&&(e instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(e))}function o(e){return Object.keys(e).reduce((function(t,r){var n=e[r];return null!=n&&t.push("".concat(encodeURIComponent(r),"=").concat(encodeURIComponent(n))),t}),[]).join("&")}r.d(t,{C:()=>o,e:()=>n})},41:(e,t,r)=>{"use strict";r.d(t,{SQSClient:()=>P});r(223);var n=r(137),o=r(393),i=r(409),a=r.n(i),c=r(23),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t2&&void 0!==arguments[2]?arguments[2]:{},n="POST",o={Action:"SendMessage",Version:j,QueueUrl:e,MessageBody:t};void 0!==r.messageDeduplicationId&&(o=l(l({},o),{},{MessageDeduplicationId:r.messageDeduplicationId})),void 0!==r.messageGroupId&&(o=l(l({},o),{},{MessageGroupId:r.messageGroupId}));var i=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l({},this.commonHeaders),body:(0,c.C)(o)},{}),s=a().request(n,i.url,i.body||"",{headers:i.headers});this._handleError("SendMessage",s);var u=s.html("SendMessageResponse > SendMessageResult");return new _(u.find("MessageId").text(),u.find("MD5OfMessageBody").text())}},{key:"listQueues",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t="POST",r={Action:"ListQueues",Version:j};void 0!==(null==e?void 0:e.maxResults)&&(r=l(l({},r),{},{MaxResults:e.maxResults})),void 0!==(null==e?void 0:e.nextToken)&&(r=l(l({},r),{},{NextToken:e.nextToken})),void 0!==(null==e?void 0:e.queueNamePrefix)&&(r=l(l({},r),{},{QueueNamePrefix:e.queueNamePrefix}));var n=this.signature.sign({method:"POST",protocol:"https",hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},{Host:this.host}),body:(0,c.C)(r)},{}),o=a().request(t,n.url,n.body||"",{headers:n.headers});this._handleError("ListQueues",o);var i=o.html();return{urls:i.find("QueueUrl").toArray().map((function(e){return e.text()})),nextToken:i.find("NextToken").text()||void 0}}},{key:"_handleError",value:function(e,t){var r=t.error_code;if(""!=t.error||0!==r){var o=s.t.parseXML(t.body);if("AuthorizationHeaderMalformed"===o.code)throw new n.w(o.message,o.code);throw new k(o.message,o.code||"unknown",e)}}}]),r}(o.k),_=p((function e(t,r){h(this,e),O(this,"id",void 0),O(this,"bodyMD5",void 0),this.id=t,this.bodyMD5=r})),k=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="SQSServiceError",i.operation=o,i}return p(r)}(s.t)},877:(e,t,r)=>{var n=r(570),o=r(171),i=o;i.v1=n,i.v4=o,e.exports=i},327:e=>{for(var t=[],r=0;r<256;++r)t[r]=(r+256).toString(16).substr(1);e.exports=function(e,r){var n=r||0,o=t;return[o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],"-",o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]],o[e[n++]]].join("")}},217:e=>{var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof window.msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto);if(t){var r=new Uint8Array(16);e.exports=function(){return t(r),r}}else{var n=new Array(16);e.exports=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),n[t]=e>>>((3&t)<<3)&255;return n}}},570:(e,t,r)=>{var n,o,i=r(217),a=r(327),c=0,s=0;e.exports=function(e,t,r){var u=t&&r||0,f=t||[],l=(e=e||{}).node||n,h=void 0!==e.clockseq?e.clockseq:o;if(null==l||null==h){var y=i();null==l&&(l=n=[1|y[0],y[1],y[2],y[3],y[4],y[5]]),null==h&&(h=o=16383&(y[6]<<8|y[7]))}var p=void 0!==e.msecs?e.msecs:(new Date).getTime(),d=void 0!==e.nsecs?e.nsecs:s+1,v=p-c+(d-s)/1e4;if(v<0&&void 0===e.clockseq&&(h=h+1&16383),(v<0||p>c)&&void 0===e.nsecs&&(d=0),d>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");c=p,s=d,o=h;var b=(1e4*(268435455&(p+=122192928e5))+d)%4294967296;f[u++]=b>>>24&255,f[u++]=b>>>16&255,f[u++]=b>>>8&255,f[u++]=255&b;var m=p/4294967296*1e4&268435455;f[u++]=m>>>8&255,f[u++]=255&m,f[u++]=m>>>24&15|16,f[u++]=m>>>16&255,f[u++]=h>>>8|128,f[u++]=255&h;for(var g=0;g<6;++g)f[u+g]=l[g];return t||a(f)}},171:(e,t,r)=>{var n=r(217),o=r(327);e.exports=function(e,t,r){var i=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var a=(e=e||{}).random||(e.rng||n)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var c=0;c<16;++c)t[i+c]=a[c];return t||o(a)}},400:e=>{"use strict";e.exports=require("k6/crypto")},255:e=>{"use strict";e.exports=require("k6/html")},409:e=>{"use strict";e.exports=require("k6/http")}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};(()=>{"use strict";r.r(n),r.d(n,{AMZ_CONTENT_SHA256_HEADER:()=>o.R$,AWSConfig:()=>t.o,InvalidAWSConfigError:()=>t.l,InvalidSignatureError:()=>e.w,KMSClient:()=>_,KMSDataKey:()=>C,KMSServiceError:()=>E,S3Bucket:()=>G,S3Client:()=>B,S3Object:()=>U,S3ServiceError:()=>J,SQSClient:()=>De.SQSClient,Secret:()=>le,SecretsManagerClient:()=>fe,SecretsManagerServiceError:()=>he,SignatureV4:()=>e.L,SystemsManagerClient:()=>Ee,SystemsManagerParameter:()=>Te,SystemsManagerServiceError:()=>Ae,UNSIGNED_PAYLOAD:()=>o.n8});var e=r(137),t=r(223),o=r(592),i=r(409),a=r.n(i),c=r(393),s=r(380);function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function f(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:P.Size256,r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:l(l({},this.commonHeaders),{},O({},o.mc,"TrentService.GenerateDataKey")),body:JSON.stringify({KeyId:e,NumberOfBytes:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(j.GenerateDataKey,n),C.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new E(i,o.__type,t)}if(1500===n)throw new E("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),k=function(){function e(t,r){h(this,e),O(this,"keyArn",void 0),O(this,"keyId",void 0),this.keyArn=t,this.keyId=r}return p(e,null,[{key:"fromJSON",value:function(t){return new e(t.KeyArn,t.KeyId)}}]),e}(),C=function(){function e(t,r,n){h(this,e),O(this,"id",void 0),O(this,"ciphertextBlob",void 0),O(this,"plaintext",void 0),this.ciphertextBlob=t,this.id=r,this.plaintext=n}return p(e,null,[{key:"fromJSON",value:function(t){return new e(t.CiphertextBlob,t.KeyId,t.Plaintext)}}]),e}(),E=function(e){d(r,e);var t=b(r);function r(e,n,o){var i;return h(this,r),O(g(i=t.call(this,e,n)),"operation",void 0),i.name="KMSServiceError",i.operation=o,i}return p(r)}(s.t);!function(e){e.GenerateDataKey="GenerateDataKey",e.ListKeys="ListKeys"}(j||(j={})),function(e){e[e.Size256=32]="Size256",e[e.Size512=64]="Size512"}(P||(P={}));var T=r(255);function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function D(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function R(e,t){for(var r=0;r".concat(e.partNumber,"").concat(e.eTag,"")})).join(""),""),s=this.signature.sign({method:o,protocol:this.scheme,hostname:i,path:"/".concat(t),headers:{},body:c,query:{uploadId:"".concat(r)}},{}),u=a().request(o,s.url,s.body||"",{headers:s.headers});this._handle_error("CompleteMultipartUpload",u)}},{key:"abortMultipartUpload",value:function(e,t,r){var n="DELETE",o="".concat(e,".").concat(this.host),i=this.signature.sign({method:n,protocol:this.scheme,hostname:o,path:"/".concat(t),headers:{},query:{uploadId:"".concat(r)}},{}),c=a().request(n,i.url,i.body||"",{headers:i.headers});this._handle_error("AbortMultipartUpload",c)}},{key:"_handle_error",value:function(t,r){var n=r.status,o=r.error_code,i=r.error;if(!(n>=200&&n<300&&""==i&&0===o)){if(301==n||i&&i.startsWith("301"))throw new J("Resource not found","ResourceNotFound",t);var a=s.t.parseXML(r.body);if("AuthorizationHeaderMalformed"===a.code)throw new e.w(a.message,a.code);throw new J(a.message,a.code||"unknown",t)}}}]),n}(c.k),G=x((function e(t,r){D(this,e),H(this,"name",void 0),H(this,"creationDate",void 0),this.name=t,this.creationDate=r})),U=x((function e(t,r,n,o,i,a){D(this,e),H(this,"key",void 0),H(this,"lastModified",void 0),H(this,"etag",void 0),H(this,"size",void 0),H(this,"storageClass",void 0),H(this,"data",void 0),this.key=t,this.lastModified=r,this.etag=n,this.size=o,this.storageClass=i,this.data=a})),V=x((function e(t,r){D(this,e),H(this,"key",void 0),H(this,"uploadId",void 0),this.key=t,this.uploadId=r})),W=x((function e(t,r){D(this,e),H(this,"partNumber",void 0),H(this,"eTag",void 0),this.partNumber=t,this.eTag=r})),J=function(e){N(r,e);var t=K(r);function r(e,n,o){var i;return D(this,r),H(q(i=t.call(this,e,n)),"operation",void 0),i.name="S3ServiceError",i.operation=o,i}return x(r)}(s.t),Q=r(877);function X(e){return X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},X(e)}function $(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function F(e){for(var t=1;t=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new he(i,o.__type,t)}if(1500===n)throw new he("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),le=function(){function e(t,r,n,o,i,a){var c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:[];Y(this,e),ce(this,"name",void 0),ce(this,"arn",void 0),ce(this,"secret",void 0),ce(this,"createdDate",void 0),ce(this,"lastAccessedDate",void 0),ce(this,"lastChangedDate",void 0),ce(this,"tags",void 0),this.name=t,this.arn=r,this.secret=n,this.createdDate=o,this.lastAccessedDate=i,this.lastChangedDate=a,this.tags=c}return ee(e,null,[{key:"fromJSON",value:function(t){return new e(t.Name,t.ARN,t.SecretString,t.CreatedDate,t.LastAccessedDate,t.LastChangedDate,t.Tags)}}]),e}(),he=function(e){te(r,e);var t=ne(r);function r(e,n,o){var i;return Y(this,r),ce(ie(i=t.call(this,e,n)),"operation",void 0),i.name="SecretsManagerServiceError",i.operation=o,i}return ee(r)}(s.t);function ye(e){return ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ye(e)}function pe(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function de(e){for(var t=1;t1&&void 0!==arguments[1]&&arguments[1],r=this.signature.sign({method:this.method,protocol:this.awsConfig.scheme,hostname:this.host,path:"/",headers:de(de({},this.commonHeaders),{},_e({},o.mc,"AmazonSSM.GetParameter")),body:JSON.stringify({Name:e,WithDecryption:t})},{}),n=a().request(this.method,r.url,r.body,{headers:r.headers});return this._handle_error(Ce.GetParameter,n),Te.fromJSON(n.json())}},{key:"_handle_error",value:function(t,r){var n=r.error_code;if(0!==n){var o=r.json();if(n>=1400&&n<=1499){var i=o.Message||o.message||o.__type;if("InvalidSignatureException"===o.__type)throw new e.w(i,o.__type);throw new Ae(i,o.__type,t)}if(1500===n)throw new Ae("An error occured on the server side","InternalServiceError",t)}}}]),n}(c.k),Te=function(){function e(t,r,n,o,i,a,c,s,u){ve(this,e),_e(this,"arn",void 0),_e(this,"dataType",void 0),_e(this,"lastModifiedDate",void 0),_e(this,"name",void 0),_e(this,"selector",void 0),_e(this,"sourceResult",void 0),_e(this,"type",void 0),_e(this,"value",void 0),_e(this,"version",void 0),this.arn=t,this.dataType=r,this.lastModifiedDate=n,this.name=o,this.selector=i,this.sourceResult=a,this.type=c,this.value=s,this.version=u}return me(e,null,[{key:"fromJSON",value:function(t){var r=t.Parameter;return new e(r.ARN,r.DataType,r.LastModifiedDate,r.Name,r.Selector,r.SourceResult,r.Type,r.Value,r.Version)}}]),e}(),Ae=function(e){ge(r,e);var t=Oe(r);function r(e,n,o){var i;return ve(this,r),_e(je(i=t.call(this,e,n)),"operation",void 0),i.name="SystemsManagerServiceError",i.operation=o,i}return me(r)}(s.t);!function(e){e.GetParameter="GetParameter"}(Ce||(Ce={}));var De=r(41)})();var o=exports;for(var i in n)o[i]=n[i];n.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})(); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map index ad4866b..d1dce49 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n \n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const query = 'uploads'\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const query = `partNumber=${partNumber}&uploadId=${uploadId}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const query = `uploadId=${uploadId}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n body: body,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const query = `uploadId=${uploadId}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { 'uploads': '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file diff --git a/build/kms.js.map b/build/kms.js.map index 1cb5590..597e941 100644 --- a/build/kms.js.map +++ b/build/kms.js.map @@ -1 +1 @@ -{"version":3,"file":"kms.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/kms.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AWSClient","awsConfig","serviceName","_host","host","_scheme","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","KMSOperation","KMSKeySize","KMSClient","commonHeaders","signedRequest","sign","res","http","_handle_error","ListKeys","json","k","KMSKey","fromJSON","id","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","operation","response","errorCode","error_code","error","errorMessage","Message","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"kms.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/kms.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AWSClient","awsConfig","serviceName","_host","host","_scheme","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","KMSOperation","KMSKeySize","KMSClient","commonHeaders","signedRequest","sign","res","http","_handle_error","ListKeys","json","k","KMSKey","fromJSON","id","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","operation","response","errorCode","error_code","error","errorMessage","Message","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext"],"sourceRoot":""} \ No newline at end of file diff --git a/build/s3.js b/build/s3.js index 7ab5ddd..90f1bb9 100644 --- a/build/s3.js +++ b/build/s3.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function n(e,t){if(t&&("object"===r(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function o(e){var t="function"==typeof Map?new Map:void 0;return o=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return i(e,arguments,s(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c(n,e)},o(e)}function i(e,t,r){return i=a()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&c(o,r.prototype),o},i.apply(null,arguments)}function a(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function c(e,t){return c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},c(e,t)}function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var r=0;ry,InvalidAWSConfigError:()=>d,InvalidSignatureError:()=>ue,S3Bucket:()=>Re,S3Client:()=>Ae,S3MultipartUpload:()=>Ie,S3Object:()=>xe,S3Part:()=>De,S3ServiceError:()=>Ke});var y=function(){function e(t){if(u(this,e),h(this,"region",void 0),h(this,"accessKeyId",void 0),h(this,"secretAccessKey",void 0),h(this,"sessionToken",void 0),h(this,"scheme","https"),h(this,"endpoint","amazonaws.com"),!t.region||""===t.region)throw new d('invalid AWS region; reason: expected a valid AWS region name (e.g. "us-east-1"), got `'.concat(t.region,"`"));if(!t.accessKeyId||""===t.accessKeyId)throw new d("invalid AWS access key ID; reason: expected a non empty string, got `".concat(t.accessKeyId,"`"));if(t.accessKeyId.length<16||t.accessKeyId.length>128)throw new d("invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ".concat(t.accessKeyId.length));if(!t.secretAccessKey||""===t.secretAccessKey)throw new d("invalid AWS secret access key; reason: expected a non empty string, got `".concat(t.secretAccessKey,"`"));if(t.secretAccessKey.length<16||t.secretAccessKey.length>128)throw new d("invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ".concat(t.secretAccessKey.length));this.region=t.region,this.accessKeyId=t.accessKeyId,this.secretAccessKey=t.secretAccessKey,void 0!==t.sessionToken&&(this.sessionToken=t.sessionToken),void 0!==t.scheme&&(this.scheme=t.scheme),void 0!==t.endpoint&&(this.endpoint=t.endpoint)}return f(e,null,[{key:"fromEnvironment",value:function(t){return new e({region:__ENV.AWS_REGION,accessKeyId:__ENV.AWS_ACCESS_KEY_ID,secretAccessKey:__ENV.AWS_SECRET_ACCESS_KEY,sessionToken:__ENV.AWS_SESSION_TOKEN,scheme:null==t?void 0:t.scheme,endpoint:null==t?void 0:t.endpoint})}}]),e}(),d=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(i,e);var t,r,o=(t=i,r=a(),function(){var e,o=s(t);if(r){var i=s(this).constructor;e=Reflect.construct(o,arguments,i)}else e=o.apply(this,arguments);return n(this,e)});function i(e){return u(this,i),o.call(this,e)}return f(i)}(o(Error));const b=require("k6/crypto");var v=e.n(b),m="X-Amz-Algorithm",g="X-Amz-Credential",w="X-Amz-Date",O="X-Amz-Expires",S="X-Amz-Signature",j="X-Amz-SignedHeaders",P="X-Amz-Security-Token",_="x-amz-content-sha256",k=w.toLowerCase(),C=S.toLowerCase(),E=("X-Amz-Target".toLowerCase(),P.toLowerCase()),T="authorization",A=[T,k,"date"],R="host",x={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},I="aws4_request",D="AWS4-HMAC-SHA256",K=604800;const q=require("k6/html");function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function N(e,t){for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){c=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw i}}}}function ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1&&delete e.headers[m]}e.headers[k]=f,this.credentials.sessionToken&&(e.headers[E]=this.credentials.sessionToken),ArrayBuffer.isView(e.body)&&(e.body=e.body.buffer),e.body||(e.body="");var g=this.computePayloadHash(e);!function(e,t){e=e.toLowerCase();for(var r=0,n=Object.keys(t);r1&&void 0!==arguments[1]?arguments[1]:{},r=t.signingDate,n=void 0===r?new Date:r,o=t.expiresIn,i=void 0===o?3600:o,a=t.unsignableHeaders,c=t.unhoistableHeaders,s=t.signableHeaders,u=t.signingRegion,l=t.signingService,f=fe(n),h=f.longDate,p=f.shortDate,y=u||this.region,d=l||this.service;if(i>K)throw new ue("Signature version 4 presigned URLs can't be valid for more than 7 days");var b="".concat(p,"/").concat(y,"/").concat(d,"/").concat(I),v=this.moveHeadersToQuery(e,{unhoistableHeaders:c});v.headers[R]=e.hostname,this.credentials.sessionToken&&(v.query[P]=this.credentials.sessionToken),v.query[m]=D,v.query[g]="".concat(this.credentials.accessKeyId,"/").concat(b),v.query[w]=h,v.query[O]=i.toString(10);var _=this.computeCanonicalHeaders(v,a,s);v.query[j]=Object.keys(_).sort().join(";");var k=this.deriveSigningKey(this.credentials,d,y,p),C=this.computePayloadHash(e),E=this.createCanonicalRequest(v,_,C);v.query[S]=this.calculateSignature(h,b,k,E);var T="".concat(v.protocol,"://").concat(v.hostname);return v.path&&(T+=v.path),v.query&&(T+="?".concat(this.serializeQueryParameters(v.query))),re({url:T},v)}},{key:"createCanonicalRequest",value:function(e,t,r){var n=Object.keys(t).sort(),o=n.map((function(e){return"".concat(e,":").concat(t[e])})).join("\n"),i=n.join(";");return"".concat(e.method,"\n")+"".concat(this.computeCanonicalURI(e),"\n")+"".concat(this.computeCanonicalQuerystring(e),"\n")+"".concat(o,"\n\n")+"".concat(i,"\n")+"".concat(r)}},{key:"createStringToSign",value:function(e,t,r){var n=v().sha256(r,"hex");return"".concat(D,"\n")+"".concat(e,"\n")+"".concat(t,"\n")+"".concat(n)}},{key:"calculateSignature",value:function(e,t,r,n){var o=this.createStringToSign(e,t,n);return v().hmac("sha256",r,o,"hex")}},{key:"deriveSigningKey",value:function(e,t,r,n){var o=e.secretAccessKey,i=v().hmac("sha256","AWS4"+o,n,"binary"),a=v().hmac("sha256",i,r,"binary"),c=v().hmac("sha256",a,t,"binary");return v().hmac("sha256",c,"aws4_request","binary")}},{key:"computeCanonicalURI",value:function(e){var t=e.path;if(this.uriEscapePath){var r,n=[],o=$(t.split("/"));try{for(o.s();!(r=o.n()).done;){var i=r.value;0!==(null==i?void 0:i.length)&&("."!==i&&(".."===i?n.pop():n.push(i)))}}catch(e){o.e(e)}finally{o.f()}var a=null!=t&&t.startsWith("/")?"/":"",c=n.join("/"),s=n.length>0&&null!=t&&t.endsWith("/")?"/":"",u="".concat(a).concat(c).concat(s);return encodeURIComponent(u).replace(/%2F/g,"/")}return t}},{key:"computeCanonicalQuerystring",value:function(e){var t,r=e.query,n=void 0===r?{}:r,o=[],i={},a=function(e){if(e.toLowerCase()===C)return"continue";o.push(e);var t=n[e];"string"==typeof t?i[e]="".concat(le(e),"=").concat(le(t)):Array.isArray(t)&&(i[e]=t.slice(0).sort().reduce((function(t,r){return t.concat(["".concat(le(e),"=").concat(le(r))])}),[]).join("&"))},c=$(Object.keys(n).sort());try{for(c.s();!(t=c.n()).done;)a(t.value)}catch(e){c.e(e)}finally{c.f()}return o.map((function(e){return i[e]})).filter((function(e){return e})).join("&")}},{key:"computeCanonicalHeaders",value:function(e,t,r){var n,o=e.headers,i={},a=$(Object.keys(o).sort());try{for(a.s();!(n=a.n()).done;){var c=n.value;if(null!=o[c]){var s=c.toLowerCase();(s in x||null!=t&&t.has(s))&&(!r||r&&!r.has(s))||(i[s]=o[c].trim().replace(/\s+/g," "))}}}catch(e){a.e(e)}finally{a.f()}return i}},{key:"computePayloadHash",value:function(e){var t,r=e.headers,n=e.body;return r[_]?r[_]:null==n?"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855":"string"==typeof n||(t=n,"function"==typeof ArrayBuffer&&(t instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(t)))?v().sha256(n,"hex").toLowerCase():ArrayBuffer.isView(n)?v().sha256(n.buffer,"hex").toLowerCase():"UNSIGNED-PAYLOAD"}},{key:"moveHeadersToQuery",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=JSON.parse(JSON.stringify(e)),n=r.headers,o=r.query,i=void 0===o?{}:o,a=0,c=Object.keys(n);a".concat(e.partNumber,"").concat(e.eTag,"")})).join(""),""),s=this.signature.sign({method:o,protocol:"https",hostname:i,path:"/".concat(t,"?").concat(a),headers:{},body:c},{}),u=pe().request(o,s.url,s.body||"",{headers:s.headers});this._handle_error("CompleteMultipartUpload",u)}},{key:"abortMultipartUpload",value:function(e,t,r){var n="DELETE",o="".concat(e,".").concat(this.host),i="uploadId=".concat(r),a=this.signature.sign({method:n,protocol:"https",hostname:o,path:"/".concat(t,"?").concat(i),headers:{}},{}),c=pe().request(n,a.url,a.body||"",{headers:a.headers});this._handle_error("AbortMultipartUpload",c)}},{key:"_handle_error",value:function(e,t){var r=t.status,n=t.error_code,o=t.error;if(!(r>=200&&r<300&&""==o&&0===n)){if(301==r||o&&o.startsWith("301"))throw new Ke("Resource not found","ResourceNotFound",e);var i=Q.parseXML(t.body);if("AuthorizationHeaderMalformed"===i.code)throw new ue(i.message,i.code);throw new Ke(i.message,i.code||"unknown",e)}}}]),r}(function(){function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),be(this,"awsConfig",void 0),be(this,"serviceName",void 0),be(this,"_host",void 0),be(this,"_scheme",void 0),this.awsConfig=t,this.serviceName=r}var t,r,n;return t=e,(r=[{key:"host",get:function(){return null==this._host&&(this._host="".concat(this.serviceName,".").concat(this.awsConfig.region,".").concat(this.awsConfig.endpoint)),this._host},set:function(e){this._host=e}},{key:"scheme",get:function(){return null==this._scheme&&(this._scheme=this.awsConfig.scheme),this._scheme},set:function(e){this._scheme=e}}])&&de(t.prototype,r),n&&de(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}()),Re=Oe((function e(t,r){ge(this,e),Ee(this,"name",void 0),Ee(this,"creationDate",void 0),this.name=t,this.creationDate=r})),xe=Oe((function e(t,r,n,o,i,a){ge(this,e),Ee(this,"key",void 0),Ee(this,"lastModified",void 0),Ee(this,"etag",void 0),Ee(this,"size",void 0),Ee(this,"storageClass",void 0),Ee(this,"data",void 0),this.key=t,this.lastModified=r,this.etag=n,this.size=o,this.storageClass=i,this.data=a})),Ie=Oe((function e(t,r){ge(this,e),Ee(this,"key",void 0),Ee(this,"uploadId",void 0),this.key=t,this.uploadId=r})),De=Oe((function e(t,r){ge(this,e),Ee(this,"partNumber",void 0),Ee(this,"eTag",void 0),this.partNumber=t,this.eTag=r})),Ke=function(e){Se(r,e);var t=Pe(r);function r(e,n,o){var i;return ge(this,r),Ee(ke(i=t.call(this,e,n)),"operation",void 0),i.name="S3ServiceError",i.operation=o,i}return Oe(r)}(Q),qe=exports;for(var Me in t)qe[Me]=t[Me];t.__esModule&&Object.defineProperty(qe,"__esModule",{value:!0})})(); +(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function n(e,t){if(t&&("object"===r(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}function o(e){var t="function"==typeof Map?new Map:void 0;return o=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return i(e,arguments,s(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c(n,e)},o(e)}function i(e,t,r){return i=a()?Reflect.construct.bind():function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&c(o,r.prototype),o},i.apply(null,arguments)}function a(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function c(e,t){return c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},c(e,t)}function s(e){return s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},s(e)}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var r=0;rp,InvalidAWSConfigError:()=>d,InvalidSignatureError:()=>ue,S3Bucket:()=>Re,S3Client:()=>Ae,S3MultipartUpload:()=>Ie,S3Object:()=>xe,S3Part:()=>De,S3ServiceError:()=>qe});var p=function(){function e(t){if(u(this,e),h(this,"region",void 0),h(this,"accessKeyId",void 0),h(this,"secretAccessKey",void 0),h(this,"sessionToken",void 0),h(this,"scheme","https"),h(this,"endpoint","amazonaws.com"),!t.region||""===t.region)throw new d('invalid AWS region; reason: expected a valid AWS region name (e.g. "us-east-1"), got `'.concat(t.region,"`"));if(!t.accessKeyId||""===t.accessKeyId)throw new d("invalid AWS access key ID; reason: expected a non empty string, got `".concat(t.accessKeyId,"`"));if(t.accessKeyId.length<16||t.accessKeyId.length>128)throw new d("invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ".concat(t.accessKeyId.length));if(!t.secretAccessKey||""===t.secretAccessKey)throw new d("invalid AWS secret access key; reason: expected a non empty string, got `".concat(t.secretAccessKey,"`"));if(t.secretAccessKey.length<16||t.secretAccessKey.length>128)throw new d("invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ".concat(t.secretAccessKey.length));this.region=t.region,this.accessKeyId=t.accessKeyId,this.secretAccessKey=t.secretAccessKey,void 0!==t.sessionToken&&(this.sessionToken=t.sessionToken),void 0!==t.scheme&&(this.scheme=t.scheme),void 0!==t.endpoint&&(this.endpoint=t.endpoint)}return f(e,null,[{key:"fromEnvironment",value:function(t){return new e({region:__ENV.AWS_REGION,accessKeyId:__ENV.AWS_ACCESS_KEY_ID,secretAccessKey:__ENV.AWS_SECRET_ACCESS_KEY,sessionToken:__ENV.AWS_SESSION_TOKEN,scheme:null==t?void 0:t.scheme,endpoint:null==t?void 0:t.endpoint})}}]),e}(),d=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&c(e,t)}(i,e);var t,r,o=(t=i,r=a(),function(){var e,o=s(t);if(r){var i=s(this).constructor;e=Reflect.construct(o,arguments,i)}else e=o.apply(this,arguments);return n(this,e)});function i(e){return u(this,i),o.call(this,e)}return f(i)}(o(Error));const b=require("k6/crypto");var v=e.n(b),m="X-Amz-Algorithm",g="X-Amz-Credential",w="X-Amz-Date",O="X-Amz-Expires",S="X-Amz-Signature",j="X-Amz-SignedHeaders",P="X-Amz-Security-Token",_="x-amz-content-sha256",k=w.toLowerCase(),C=S.toLowerCase(),E=("X-Amz-Target".toLowerCase(),P.toLowerCase()),T="authorization",A=[T,k,"date"],R="host",x={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},I="aws4_request",D="AWS4-HMAC-SHA256",q=604800;const K=require("k6/html");function M(e){return M="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},M(e)}function N(e,t){for(var r=0;r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){c=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(c)throw i}}}}function ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r-1&&delete e.headers[m]}e.headers[k]=f,this.credentials.sessionToken&&(e.headers[E]=this.credentials.sessionToken),ArrayBuffer.isView(e.body)&&(e.body=e.body.buffer),e.body||(e.body="");var g=this.computePayloadHash(e);!function(e,t){e=e.toLowerCase();for(var r=0,n=Object.keys(t);r1&&void 0!==arguments[1]?arguments[1]:{},r=t.signingDate,n=void 0===r?new Date:r,o=t.expiresIn,i=void 0===o?3600:o,a=t.unsignableHeaders,c=t.unhoistableHeaders,s=t.signableHeaders,u=t.signingRegion,l=t.signingService,f=fe(n),h=f.longDate,y=f.shortDate,p=u||this.region,d=l||this.service;if(i>q)throw new ue("Signature version 4 presigned URLs can't be valid for more than 7 days");var b="".concat(y,"/").concat(p,"/").concat(d,"/").concat(I),v=this.moveHeadersToQuery(e,{unhoistableHeaders:c});v.headers[R]=e.hostname,this.credentials.sessionToken&&(v.query[P]=this.credentials.sessionToken),v.query[m]=D,v.query[g]="".concat(this.credentials.accessKeyId,"/").concat(b),v.query[w]=h,v.query[O]=i.toString(10);var _=this.computeCanonicalHeaders(v,a,s);v.query[j]=Object.keys(_).sort().join(";");var k=this.deriveSigningKey(this.credentials,d,p,y),C=this.computePayloadHash(e),E=this.createCanonicalRequest(v,_,C);v.query[S]=this.calculateSignature(h,b,k,E);var T="".concat(v.protocol,"://").concat(v.hostname);return v.path&&(T+=v.path),v.query&&(T+="?".concat(this.serializeQueryParameters(v.query))),re({url:T},v)}},{key:"createCanonicalRequest",value:function(e,t,r){var n=Object.keys(t).sort(),o=n.map((function(e){return"".concat(e,":").concat(t[e])})).join("\n"),i=n.join(";");return"".concat(e.method,"\n")+"".concat(this.computeCanonicalURI(e),"\n")+"".concat(this.computeCanonicalQuerystring(e),"\n")+"".concat(o,"\n\n")+"".concat(i,"\n")+"".concat(r)}},{key:"createStringToSign",value:function(e,t,r){var n=v().sha256(r,"hex");return"".concat(D,"\n")+"".concat(e,"\n")+"".concat(t,"\n")+"".concat(n)}},{key:"calculateSignature",value:function(e,t,r,n){var o=this.createStringToSign(e,t,n);return v().hmac("sha256",r,o,"hex")}},{key:"deriveSigningKey",value:function(e,t,r,n){var o=e.secretAccessKey,i=v().hmac("sha256","AWS4"+o,n,"binary"),a=v().hmac("sha256",i,r,"binary"),c=v().hmac("sha256",a,t,"binary");return v().hmac("sha256",c,"aws4_request","binary")}},{key:"computeCanonicalURI",value:function(e){var t=e.path;if(this.uriEscapePath){var r,n=[],o=$(t.split("/"));try{for(o.s();!(r=o.n()).done;){var i=r.value;0!==(null==i?void 0:i.length)&&("."!==i&&(".."===i?n.pop():n.push(i)))}}catch(e){o.e(e)}finally{o.f()}var a=null!=t&&t.startsWith("/")?"/":"",c=n.join("/"),s=n.length>0&&null!=t&&t.endsWith("/")?"/":"",u="".concat(a).concat(c).concat(s);return encodeURIComponent(u).replace(/%2F/g,"/")}return t}},{key:"computeCanonicalQuerystring",value:function(e){var t,r=e.query,n=void 0===r?{}:r,o=[],i={},a=function(e){if(e.toLowerCase()===C)return"continue";o.push(e);var t=n[e];"string"==typeof t?i[e]="".concat(le(e),"=").concat(le(t)):Array.isArray(t)&&(i[e]=t.slice(0).sort().reduce((function(t,r){return t.concat(["".concat(le(e),"=").concat(le(r))])}),[]).join("&"))},c=$(Object.keys(n).sort());try{for(c.s();!(t=c.n()).done;)a(t.value)}catch(e){c.e(e)}finally{c.f()}return o.map((function(e){return i[e]})).filter((function(e){return e})).join("&")}},{key:"computeCanonicalHeaders",value:function(e,t,r){var n,o=e.headers,i={},a=$(Object.keys(o).sort());try{for(a.s();!(n=a.n()).done;){var c=n.value;if(null!=o[c]){var s=c.toLowerCase();(s in x||null!=t&&t.has(s))&&(!r||r&&!r.has(s))||(i[s]=o[c].trim().replace(/\s+/g," "))}}}catch(e){a.e(e)}finally{a.f()}return i}},{key:"computePayloadHash",value:function(e){var t,r=e.headers,n=e.body;return r[_]?r[_]:null==n?"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855":"string"==typeof n||(t=n,"function"==typeof ArrayBuffer&&(t instanceof ArrayBuffer||"[object ArrayBuffer]"===Object.prototype.toString.call(t)))?v().sha256(n,"hex").toLowerCase():ArrayBuffer.isView(n)?v().sha256(n.buffer,"hex").toLowerCase():"UNSIGNED-PAYLOAD"}},{key:"moveHeadersToQuery",value:function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=JSON.parse(JSON.stringify(e)),n=r.headers,o=r.query,i=void 0===o?{}:o,a=0,c=Object.keys(n);a".concat(e.partNumber,"").concat(e.eTag,"")})).join(""),""),c=this.signature.sign({method:o,protocol:this.scheme,hostname:i,path:"/".concat(t),headers:{},body:a,query:{uploadId:"".concat(r)}},{}),s=ye().request(o,c.url,c.body||"",{headers:c.headers});this._handle_error("CompleteMultipartUpload",s)}},{key:"abortMultipartUpload",value:function(e,t,r){var n="DELETE",o="".concat(e,".").concat(this.host),i=this.signature.sign({method:n,protocol:this.scheme,hostname:o,path:"/".concat(t),headers:{},query:{uploadId:"".concat(r)}},{}),a=ye().request(n,i.url,i.body||"",{headers:i.headers});this._handle_error("AbortMultipartUpload",a)}},{key:"_handle_error",value:function(e,t){var r=t.status,n=t.error_code,o=t.error;if(!(r>=200&&r<300&&""==o&&0===n)){if(301==r||o&&o.startsWith("301"))throw new qe("Resource not found","ResourceNotFound",e);var i=Q.parseXML(t.body);if("AuthorizationHeaderMalformed"===i.code)throw new ue(i.message,i.code);throw new qe(i.message,i.code||"unknown",e)}}}]),r}(function(){function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),be(this,"awsConfig",void 0),be(this,"serviceName",void 0),be(this,"_host",void 0),be(this,"_scheme",void 0),this.awsConfig=t,this.serviceName=r}var t,r,n;return t=e,(r=[{key:"host",get:function(){return null==this._host&&(this._host="".concat(this.serviceName,".").concat(this.awsConfig.region,".").concat(this.awsConfig.endpoint)),this._host},set:function(e){this._host=e}},{key:"scheme",get:function(){return null==this._scheme&&(this._scheme=this.awsConfig.scheme),this._scheme},set:function(e){this._scheme=e}}])&&de(t.prototype,r),n&&de(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}()),Re=Oe((function e(t,r){ge(this,e),Ee(this,"name",void 0),Ee(this,"creationDate",void 0),this.name=t,this.creationDate=r})),xe=Oe((function e(t,r,n,o,i,a){ge(this,e),Ee(this,"key",void 0),Ee(this,"lastModified",void 0),Ee(this,"etag",void 0),Ee(this,"size",void 0),Ee(this,"storageClass",void 0),Ee(this,"data",void 0),this.key=t,this.lastModified=r,this.etag=n,this.size=o,this.storageClass=i,this.data=a})),Ie=Oe((function e(t,r){ge(this,e),Ee(this,"key",void 0),Ee(this,"uploadId",void 0),this.key=t,this.uploadId=r})),De=Oe((function e(t,r){ge(this,e),Ee(this,"partNumber",void 0),Ee(this,"eTag",void 0),this.partNumber=t,this.eTag=r})),qe=function(e){Se(r,e);var t=Pe(r);function r(e,n,o){var i;return ge(this,r),Ee(ke(i=t.call(this,e,n)),"operation",void 0),i.name="S3ServiceError",i.operation=o,i}return Oe(r)}(Q),Ke=exports;for(var Me in t)Ke[Me]=t[Me];t.__esModule&&Object.defineProperty(Ke,"__esModule",{value:!0})})(); //# sourceMappingURL=s3.js.map \ No newline at end of file diff --git a/build/s3.js.map b/build/s3.js.map index 0a4a909..f11f39f 100644 --- a/build/s3.js.map +++ b/build/s3.js.map @@ -1 +1 @@ -{"version":3,"file":"s3.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n \n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const query = 'uploads'\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const query = `partNumber=${partNumber}&uploadId=${uploadId}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const query = `uploadId=${uploadId}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n body: body,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const query = `uploadId=${uploadId}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: 'https',\n hostname: host,\n path: `/${objectKey}?${query}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","S3Client","awsConfig","serviceName","signedRequest","sign","host","res","http","_handle_error","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","size","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","operation","response","status","errorCode","error_code","errorMessage","error","S3ServiceError","awsError","parseXML","_host","_scheme","S3Bucket"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"s3.js","mappings":"mBACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,ssFCFvD,IAAMC,EAAS,WAsFlB,WAAYC,GACR,GADmC,8IApDlB,SAAO,kBAST,kBA4CVA,EAAQC,QAA6B,KAAnBD,EAAQC,OAC3B,MAAM,IAAIC,EAAsB,yFAAD,OAC+DF,EAAQC,OAAM,MAIhH,IAAKD,EAAQG,aAAuC,KAAxBH,EAAQG,YAChC,MAAM,IAAID,EAAsB,wEAAD,OAC8CF,EAAQG,YAAW,MAIpG,GAAIH,EAAQG,YAAYC,OAAS,IAAMJ,EAAQG,YAAYC,OAAS,IAChE,MAAM,IAAIF,EAAsB,wFAAD,OAC6DF,EAAQG,YAAYC,SAIpH,IAAKJ,EAAQK,iBAA+C,KAA5BL,EAAQK,gBACpC,MAAM,IAAIH,EAAsB,4EAAD,OACkDF,EAAQK,gBAAe,MAI5G,GAAIL,EAAQK,gBAAgBD,OAAS,IAAMJ,EAAQK,gBAAgBD,OAAS,IACxE,MAAM,IAAIF,EAAsB,4FAAD,OACiEF,EAAQK,gBAAgBD,SAI5HE,KAAKL,OAASD,EAAQC,OACtBK,KAAKH,YAAcH,EAAQG,YAC3BG,KAAKD,gBAAkBL,EAAQK,qBAEFE,IAAzBP,EAAQQ,eACRF,KAAKE,aAAeR,EAAQQ,mBAGTD,IAAnBP,EAAQS,SACRH,KAAKG,OAAST,EAAQS,aAGDF,IAArBP,EAAQU,WACRJ,KAAKI,SAAWV,EAAQU,SAEhC,CAtDC,OAsDA,uCAtED,SAAuBV,GAQnB,OAAO,IAAID,EAAU,CACjBE,OARWU,MAAMC,WASjBT,YARgBQ,MAAME,kBAStBR,gBARoBM,MAAMG,sBAS1BN,aARqCG,MAAMI,kBAS3CN,OARmCT,aAAO,EAAPA,EAASS,OAS5CC,SARiCV,aAAO,EAAPA,EAASU,UAUlD,KAAC,EA9EiB,GA4LTR,EAAqB,a,qRAAA,U,IAAA,G,EAAA,E,mJAC9B,WAAYc,GAAiB,6BACnBA,EACV,CAAC,YAH6B,CAG7B,EAHsCC,QC/L3C,MAAM,EAA+BC,QAAQ,a,aCGhCC,EAA4B,kBAC5BC,EAA6B,mBAC7BC,EAAuB,aACvBC,EAA0B,gBAC1BC,EAA4B,kBAC5BC,EAAiC,sBAEjCC,EAAwB,uBAKxBC,EAA4B,uBAC5BC,EAAkBN,EAAqBO,cACvCC,EAAuBN,EAA0BK,cAEjDE,GAVyB,eASkBF,cACxBH,EAAsBG,eAKzCG,EAAuB,gBAMvBC,EAAoB,CAACD,EAAsBJ,EAL7B,QAMdM,EAAc,OAMdC,EAA4B,CACrCC,eAAe,EACf,iBAAiB,EACjBC,YAAY,EACZC,QAAQ,EACRC,MAAM,EACN,cAAc,EACd,gBAAgB,EAChBC,QAAQ,EACRC,SAAS,EACTC,IAAI,EACJC,SAAS,EACT,qBAAqB,EACrBC,SAAS,EACT,cAAc,EACd,mBAAmB,GAMVC,EAAsB,eACtBC,EAA+B,mBAK/BC,EAAoB,OChEjC,MAAM,EAA+B5B,QAAQ,W,urECUtC,IAAM6B,EAAQ,a,qRAAA,U,UAAA,G,EAAA,E,mJAYjB,WAAY/B,EAAiBgC,GAAe,M,MAGxB,O,4FAHwB,SACxC,cAAMhC,G,EAAQ,K,OAAA,G,MAAA,W,wFACd,EAAKiC,KAAO,WACZ,EAAKD,KAAOA,EAAI,CACpB,CAUC,O,EARD,E,EAAA,uBAKA,SAAgBE,GACZ,IAAMC,GAAMC,EAAAA,EAAAA,WAAUF,GACtB,OAAO,IAAIH,EAASI,EAAIE,KAAK,WAAWC,OAAQH,EAAIE,KAAK,QAAQC,OACrE,K,EARA,O,8EAQC,EA1BgB,CA0BhB,EA1ByBrC,Q,ilHCOvB,IAAMsC,GAAW,WAoCpB,cAMuB,IALnBC,EAAO,EAAPA,QACAvD,EAAM,EAANA,OACAwD,EAAW,EAAXA,YACAC,EAAa,EAAbA,cACAC,EAAa,EAAbA,cAAa,4JAEbrD,KAAKkD,QAAUA,EACflD,KAAKL,OAASA,EACdK,KAAKmD,YAAcA,EACnBnD,KAAKoD,cAAyC,kBAAlBA,GAA8BA,EAC1DpD,KAAKqD,cAAyC,kBAAlBA,GAA8BA,CAC9D,CAkjBC,OAhjBD,wBAaA,SACIC,EAAoB,GAQH,QANbC,YAAAA,OAAW,IAAG,MAAIC,KAAM,EACxBC,EAAc,EAAdA,eACAC,EAAa,EAAbA,cAAa,IACbC,kBAAAA,OAAiB,IAAG,MAAIC,IAAa,MACrCC,gBAAAA,OAAe,IAAG,MAAID,IAAa,EAGvC,EAA0CE,GAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZd,EAAUO,GAAkBzD,KAAKkD,QACjCvD,EAAS+D,GAAiB1D,KAAKL,OAC/BsE,EAAQ,GAAH,OAAMD,EAAS,YAAIrE,EAAM,YAAIuD,EAAO,YAAIgB,GAOnDZ,EAAQa,QAAQD,GAAyBZ,EAAQc,SAKjD,IAAK,IAAL,MAAyBvF,OAAOwF,KAAKf,EAAQa,SAAQ,eAAE,CAAlD,IAAMG,EAAU,KACbJ,EAAAA,QAAoCI,EAAWhD,gBAAkB,UAC1DgC,EAAQa,QAAQG,EAE/B,CAEAhB,EAAQa,QAAQD,GAA6BH,EACzC/D,KAAKmD,YAAYjD,eACjBoD,EAAQa,QAAQD,GAA8BlE,KAAKmD,YAAYjD,cAK/DqE,YAAYC,OAAOlB,EAAQmB,QAC3BnB,EAAQmB,KAAOnB,EAAQmB,KAAKC,QAI3BpB,EAAQmB,OACTnB,EAAQmB,KAAO,IAGnB,IAAIE,EAAc3E,KAAK4E,mBAAmBtB,IC1G3C,SAAmBuB,EAAsBV,GAC5CU,EAAeA,EAAavD,cAE5B,IAAK,IAAL,MAAyBzC,OAAOwF,KAAKF,GAAQ,eACzC,GAAIU,IADa,KACevD,cAC5B,OAAO,EAIf,OAAO,CACX,CDiGawD,CAAUZ,EAAqCZ,EAAQa,UAAYnE,KAAKqD,gBACzEC,EAAQa,QAAQD,GAAuCS,GAG3D,IAAMI,EAAmB/E,KAAKgF,wBAAwB1B,EAASK,EAAmBE,GAC5EoB,EAAYjF,KAAKkF,mBACnBnB,EACAE,EACAjE,KAAKmF,iBAAiBnF,KAAKmD,YAAaD,EAASvD,EAAQqE,GACzDhE,KAAKoF,uBAAuB9B,EAASyB,EAAkBJ,IAQ3DrB,EAAQa,QAAQD,GACZ,UAAGA,EAAsC,0BAC3BlE,KAAKmD,YAAYtD,YAAW,YAAIoE,EAAK,MAAI,wBACtCpF,OAAOwF,KAAKU,GAAkBM,OAAOC,KAAK,KAAI,MAAI,oBACtDL,GAGjB,IAAIM,EAAM,GAAH,OAAMjC,EAAQkC,SAAQ,cAAMlC,EAAQc,UAW3C,OAVId,EAAQmC,OACRF,GAAOjC,EAAQmC,MAIfnC,EAAQoC,QAERH,GAAO,IAAJ,OAAQvF,KAAK2F,yBAAyBrC,EAAQoC,SAG9C,GAAP,CACIH,IAAKA,GACFjC,EAEX,GAEA,qBAWA,SAAQsC,GAA+E,IAAjDlG,EAA0B,UAAH,6CAAG,CAAC,EAC7D,EAQIA,EAPA6D,YAAAA,OAAW,IAAG,MAAIC,KAAM,IAOxB9D,EANAmG,UAAAA,OAAS,IAAG,OAAI,EAChBlC,EAKAjE,EALAiE,kBACAmC,EAIApG,EAJAoG,mBACAjC,EAGAnE,EAHAmE,gBACAH,EAEAhE,EAFAgE,cACAD,EACA/D,EADA+D,eAEJ,EAA0CK,GAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZrE,EAAS+D,GAAiB1D,KAAKL,OAC/BuD,EAAUO,GAAkBzD,KAAKkD,QAEvC,GAAI2C,EAAY3B,EACZ,MAAM,IAAI6B,GACN,0EAIR,IAAM9B,EAAQ,GAAH,OAAMD,EAAS,YAAIrE,EAAM,YAAIuD,EAAO,YAAIgB,GAC7CZ,EAAUtD,KAAKgG,mBAAmBJ,EAAiB,CAAEE,mBAAAA,IAO3DxC,EAAQa,QAAQD,GAAyB0B,EAAgBxB,SAGrDpE,KAAKmD,YAAYjD,eACjBoD,EAAQoC,MAAMxB,GAAmClE,KAAKmD,YAAYjD,cAKtEoD,EAAQoC,MAAMxB,GAAuCA,EACrDZ,EAAQoC,MACJxB,GACA,GAAH,OAAMlE,KAAKmD,YAAYtD,YAAW,YAAIoE,GACvCX,EAAQoC,MAAMxB,GAAkCH,EAChDT,EAAQoC,MAAMxB,GAAqC2B,EAAUI,SAAS,IAEtE,IAAMlB,EAAmB/E,KAAKgF,wBAC1B1B,EACAK,EACAE,GAEJP,EAAQoC,MAAMxB,GAA4CrF,OAAOwF,KAAKU,GACjEM,OACAC,KAAK,KAEV,IAAMY,EAAalG,KAAKmF,iBAAiBnF,KAAKmD,YAAaD,EAASvD,EAAQqE,GAStEW,EAAc3E,KAAK4E,mBAAmBgB,GACtCO,EAAmBnG,KAAKoF,uBAAuB9B,EAASyB,EAAkBJ,GAEhFrB,EAAQoC,MAAMxB,GAAuClE,KAAKkF,mBACtDnB,EACAE,EACAiC,EACAC,GAIJ,IAAIZ,EAAM,GAAH,OAAMjC,EAAQkC,SAAQ,cAAMlC,EAAQc,UAU3C,OATId,EAAQmC,OACRF,GAAOjC,EAAQmC,MAIfnC,EAAQoC,QACRH,GAAO,IAAJ,OAAQvF,KAAK2F,yBAAyBrC,EAAQoC,SAG9C,GAAP,CAASH,IAAKA,GAAQjC,EAC1B,GAEA,oCAYA,SACIA,EACAyB,EACAJ,GAEA,IAAMyB,EAAgBvH,OAAOwF,KAAKU,GAAkBM,OAC9CgB,EAAyBD,EAC1BE,KAAI,SAAC3D,GAAI,gBAAQA,EAAI,YAAIoC,EAAiBpC,GAAK,IAC/C2C,KAAK,MACJiB,EAAgBH,EAAcd,KAAK,KAEzC,MACI,UAAGhC,EAAQkD,OAAM,gBACdxG,KAAKyG,oBAAoBnD,GAAQ,MAAI,UACrCtD,KAAK0G,4BAA4BpD,GAAQ,MAAI,UAC7C+C,EAAsB,QAAM,UAC5BE,EAAa,MAAI,UACjB5B,EAEX,GAEA,gCAcA,SACIZ,EACA4C,EACAR,GAEA,IAAMS,EAAyBC,IAAAA,OAAcV,EAAkB,OAE/D,MACI,UAAGjC,EAAsC,gBACtCH,EAAQ,MAAI,UACZ4C,EAAe,MAAI,UACnBC,EAEX,GAEA,gCAYA,SACI7C,EACA4C,EACAT,EACAC,GAEA,IAAMW,EAAe9G,KAAK+G,mBAAmBhD,EAAU4C,EAAiBR,GACxE,OAAOU,IAAAA,KAAY,SAAUX,EAAYY,EAAc,MAC3D,GAEA,8BAiBA,SACI3D,EACAD,EACAvD,EACAqE,GAEA,IAAMgD,EAAkB7D,EAAYpD,gBAC9BkH,EAAaJ,IAAAA,KAAY,SAAU,OAASG,EAAShD,EAAW,UAChEkD,EAAeL,IAAAA,KAAY,SAAUI,EAAOtH,EAAQ,UACpDwH,EAAgBN,IAAAA,KAAY,SAAUK,EAAShE,EAAS,UAG9D,OAFsB2D,IAAAA,KAAY,SAAUM,EAAU,eAAgB,SAG1E,GAEA,iCAOA,YAA2D,IAA7B1B,EAAI,EAAJA,KAC1B,GAAIzF,KAAKoD,cAAe,CAGpB,IAEwC,EAFlCgE,EAAwB,GAAE,IAEP3B,EAAK4B,MAAM,MAAI,IAAxC,IAAK,EAAL,qBAA0C,KAA/BC,EAAU,QACU,KAAvBA,aAAU,EAAVA,EAAYxH,UAIG,MAAfwH,IAIe,OAAfA,EACAF,EAAsBG,MAEtBH,EAAsBI,KAAKF,IAEnC,CAEA,+BACA,IAAMG,EAAUhC,SAAAA,EAAMiC,WAAW,KAAO,IAAM,GACxCC,EAAMP,EAAsB9B,KAAK,KACjCsC,EAAWR,EAAsBtH,OAAS,GAA/BsH,MAAoC3B,GAAAA,EAAMoC,SAAS,KAAO,IAAM,GAC3EC,EAAgB,GAAH,OAAML,GAAO,OAAGE,GAAG,OAAGC,GAIzC,OAFsBG,mBAAmBD,GAEpBE,QAAQ,OAAQ,IACzC,CAKA,OAAOvC,CACX,GAEA,yCAQA,YAAyE,IAI1B,EAJ0B,IAAnCC,MAAAA,OAAK,IAAG,GAAC,EAAC,EACtCrB,EAAsB,GACtB4D,EAAqC,CAAC,EAAC,cAGzC,GAAItJ,EAAI2C,gBAAkB4C,EAAgC,iBAI1DG,EAAKmD,KAAK7I,GACV,IAAMa,EAAQkG,EAAM/G,GAEC,iBAAVa,EACPyI,EAAWtJ,GAAO,GAAH,OAAMuJ,GAAUvJ,GAAI,YAAIuJ,GAAU1I,IAC1C2I,MAAMC,QAAQ5I,KACrByI,EAAWtJ,GAAOa,EACb6I,MAAM,GACNhD,OACAiD,QACG,SAACC,EAAwB/I,GAAa,OAClC+I,EAAQC,OAAO,CAAC,GAAD,OAAIN,GAAUvJ,GAAI,YAAIuJ,GAAU1I,KAAU,GAC7D,IAEH8F,KAAK,KAElB,EAAC,IArBiBzG,OAAOwF,KAAKqB,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOhB,EACFiC,KAAI,SAAC3H,GAAG,OAAKsJ,EAAWtJ,EAAI,IAC5B8J,QAAO,SAACR,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,GAEA,qCAUA,WAEI3B,EACAE,GACa,IAGuC,EANlDM,EAAO,EAAPA,QAIIY,EAAkC,CAAC,EAAC,IAEjBlG,OAAOwF,KAAKF,GAASkB,QAAM,IAApD,IAAK,EAAL,qBAAsD,KAA3Cf,EAAU,QACjB,GAA2BrE,MAAvBkE,EAAQG,GAAZ,CAIA,IAAMoE,EAAsBpE,EAAWhD,eAEnCoH,KAAuBxE,GACvBP,SAAAA,EAAmBgF,IAAID,OAGlB7E,GACAA,IAAoBA,EAAgB8E,IAAID,MAMjD3D,EAAiB2D,GAAuBvE,EAAQG,GAAYsE,OAAOZ,QAAQ,OAAQ,KAfnF,CAgBJ,CAAC,+BAED,OAAOjD,CACX,GAEA,gCAWA,YAAmE,IEpgBzCvF,EFogBG2E,EAAO,EAAPA,QAASM,EAAI,EAAJA,KASlC,OAAIN,EAAQD,GACDC,EAAQD,GAGPjE,MAARwE,EHjdgB,mEGqdA,iBAATA,IErhBWjF,EFqhBwBiF,EEnhBvB,mBAAhBF,cACN/E,aAAiB+E,aAC4B,yBAA1C1F,OAAOM,UAAU8G,SAAS5G,KAAKG,KFkhBxBqH,IAAAA,OAAcpC,EAAM,OAAOnD,cAGlCiD,YAAYC,OAAOC,GAGZoC,IAAAA,OAAepC,EAAkBC,OAAQ,OAAOpD,cHpdnC,kBGwd5B,GAEA,gCAaA,SACIgC,GAMA,IAJ0C,IAD1C5D,EAAgD,UAAH,6CAAG,CAAC,EAE3CmJ,EAAcC,KAAKC,MAAMD,KAAKE,UAAU1F,IACtCa,EAA6C0E,EAA7C1E,QAAO,EAAsC0E,EAApCnD,MAAAA,OAAK,IAAG,GAAC,EAAC,EAE3B,MAAmB7G,OAAOwF,KAAKF,GAAQ,eAAE,OAA9BxB,EAAI,KACLsG,EAAgBtG,EAAKrB,cAEO,WAA9B2H,EAAcZ,MAAM,EAAG,IACI,QAA3B,EAAC3I,EAAQoG,0BAAkB,OAA1B,EAA4B6C,IAAIM,KAEjCvD,EAAM/C,GAAQwB,EAAQxB,UACfwB,EAAQxB,GAEvB,CAEA,OAAO,GAAP,MACOkG,GAAW,IACd1E,QAAAA,EACAuB,MAAAA,GAER,GAEA,sCAOA,SAAiCA,EAA0BwD,GACvD,IAG2C,EAHrC7E,EAAsB,GACtB4D,EAAqC,CAAC,EAAC,cAGzC,GAAIiB,SAAAA,EAAYC,SAASxK,EAAI2C,eAAgB,iBAI7C+C,EAAKmD,KAAK7I,GACV,IAAMa,EAAQkG,EAAM/G,GAEC,iBAAVa,EACPyI,EAAWtJ,GAAO,GAAH,OAAMuJ,GAAUvJ,GAAI,YAAIuJ,GAAU1I,IAC1C2I,MAAMC,QAAQ5I,KACrByI,EAAWtJ,GAAOa,EACb6I,MAAM,GACNhD,OACAiD,QACG,SAACC,EAAwB/I,GAAa,OAClC+I,EAAQC,OAAO,CAAC,GAAD,OAAIN,GAAUvJ,GAAI,YAAIuJ,GAAU1I,KAAU,GAC7D,IAEH8F,KAAK,KAElB,EAAC,IArBiBzG,OAAOwF,KAAKqB,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOhB,EACFiC,KAAI,SAAC3H,GAAG,OAAKsJ,EAAWtJ,EAAI,IAC5B8J,QAAO,SAACR,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,KAAC,EAlmBmB,GA6mBXS,GAAqB,a,qRAAA,iBAM9B,WAAYrF,EAAiBgC,GAAe,MAEL,OAFK,YACxC,cAAMhC,EAASgC,IACVC,KAAO,wBAAuB,CACvC,CAAC,aAT6B,CAASF,GA+I3C,SAASyF,GAAUP,GAKf,OAAOI,mBAAmBJ,GAAKK,QAAQ,YAJrB,SAACoB,GACf,MAAO,IAAP,OAAWA,EAAEC,WAAW,GAAGpD,SAAS,IAAIqD,cAC5C,GAGJ,CASA,SAASxF,GAAWyF,GAChB,IAeaC,EAfPzF,GAeOyF,EAfYD,EA2B7B,SAAgBC,GACZ,MAAoB,iBAATA,EACA,IAAIhG,KAAY,IAAPgG,GAGA,iBAATA,EACHC,OAAOD,GACA,IAAIhG,KAAoB,IAAfiG,OAAOD,IAGpB,IAAIhG,KAAKgG,GAGbA,CACX,CAzBWE,CAAOF,GACTG,cACA3B,QAAQ,YAAa,MAlBKA,QAAQ,SAAU,IACjD,MAAO,CACHjE,SAAAA,EACAC,UAAWD,EAASsE,MAAM,EAAG,GAErC,CGlyBA,MAAM,GAA+BzH,QAAQ,W,ipGCYtC,IAAMgJ,GAAQ,gCAQjB,WAAYC,GAAsB,MAa5B,OAb4B,WACR,MAAtB,cAAMA,EAAW,OAAK,oBAEtB,EAAK5E,UAAY,IAAIhC,GAAY,CAC7BC,QAAS,EAAK4G,YACdnK,OAAQ,EAAKkK,UAAUlK,OACvBwD,YAAa,CACTtD,YAAa,EAAKgK,UAAUhK,YAC5BE,gBAAiB,EAAK8J,UAAU9J,gBAChCG,aAAc,EAAK2J,UAAU3J,cAEjCkD,eAAe,EACfC,eAAe,IACjB,CACN,CA4aC,OA1aD,+BASA,WACI,IAEM0G,EAAmC/J,KAAKiF,UAAU+E,KACpD,CACIxD,OAAQ,MACRhB,SAAUxF,KAAKG,OACfiE,SAAUpE,KAAKiK,KACfxE,KAAM,IACNtB,QAAS,CAAC,GAEd,CAAC,GAGC+F,EAAMC,KAAAA,QAbG,MAakBJ,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAE3BnE,KAAKoK,cAAc,cAAeF,GAElC,IAAIG,EAA2B,GAwB/B,OAtBYvH,EAAAA,EAAAA,WAAUoH,EAAIzF,MAEtB1B,KAAK,WACJuH,WACAC,MAAK,SAACC,EAAGC,GACN,IAAIC,EAAS,CAAC,EAEdD,EAAiBH,WAAWK,SAAQ,SAACC,GACjC,OAAQA,EAAMC,YACV,IAAK,OACDhM,OAAOiM,OAAOJ,EAAQ,CAAE/H,KAAMiI,EAAMG,gBACpC,MACJ,IAAK,eACDlM,OAAOiM,OAAOJ,EAAQ,CAClBM,aAAcxH,KAAKuF,MAAM6B,EAAMG,iBAG/C,IAEAV,EAAQ7C,KAAKkD,EACjB,IAEGL,CACX,GAEA,yBAUA,SAAYY,EAAoBC,GAE5B,IACMjB,EAAO,GAAH,OAAMjK,KAAKiK,MAEfF,EAAmC/J,KAAKiF,UAAU+E,KACpD,CACIxD,OAAQ,MACRhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMwF,EAAU,KACpBvF,MAAO,CACH,YAAa,IACbwF,OAAQA,GAAU,IAEtB/G,QAAS,CAAC,GAEd,CAAC,GAGC+F,EAAMC,KAAAA,QAlBG,MAkBkBJ,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAE3BnE,KAAKoK,cAAc,gBAAiBF,GAEpC,IAAIiB,EAA2B,GA+B/B,OA3BArI,EAAAA,EAAAA,WAAUoH,EAAIzF,MACT1B,KAAK,YACLwH,MAAK,SAACC,EAAGY,GACN,IAAInM,EAAM,CAAC,EAEXmM,EAAiBd,WAAWK,SAAQ,SAACC,GACjC,OAAQA,EAAMC,YACV,IAAK,MACDhM,OAAOiM,OAAO7L,EAAK,CAAEN,IAAKiM,EAAMG,gBAChC,MACJ,IAAK,eACDlM,OAAOiM,OAAO7L,EAAK,CAAEoM,aAAc7H,KAAKuF,MAAM6B,EAAMG,iBACpD,MACJ,IAAK,OACDlM,OAAOiM,OAAO7L,EAAK,CAAEqM,KAAMV,EAAMG,gBACjC,MACJ,IAAK,OACDlM,OAAOiM,OAAO7L,EAAK,CAAEsM,KAAMC,SAASZ,EAAMG,iBAC1C,MACJ,IAAK,eACDlM,OAAOiM,OAAO7L,EAAK,CAAEwM,aAAcb,EAAMG,gBAErD,IAEAI,EAAQ3D,KAAKvI,EACjB,IAEGkM,CACX,GACA,uBAWA,SAAUF,EAAoBS,GAA6B,MAGjDzB,EAAO,GAAH,OAAMjK,KAAKiK,MAEfF,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OAAQ,MACRhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMwF,EAAU,YAAIS,GACxBvH,QAAS,CAAC,GAEd,CAAC,GAGC+F,EAAMC,KAAAA,QAdG,MAckBJ,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAI3B,OAFAnE,KAAKoK,cAAc,YAAaF,GAEzB,IAAIyB,GACPD,EACAlI,KAAKuF,MAAMmB,EAAI/F,QAAQ,kBACvB+F,EAAI/F,QAAc,KAClBqH,SAAStB,EAAI/F,QAAQ,mBAIc,QADnC,EACC+F,EAAI/F,QAAQ,8BAAsB,QAAI,WAEvC+F,EAAIzF,KAEZ,GACA,uBAWA,SAAUwG,EAAoBS,EAAmBE,GAE7C,IACM3B,EAAO,GAAH,OAAMjK,KAAKiK,MAEfF,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OALO,MAMPhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMwF,EAAU,YAAIS,GACxBvH,QAAS,CACL0H,KAAM5B,GAEVxF,KAAMmH,GAEV,CAAC,GAGC1B,EAAMC,KAAAA,QAjBG,MAiBkBJ,EAAcxE,IAAKwE,EAActF,KAAM,CACpEN,QAAS4F,EAAc5F,UAE3BnE,KAAKoK,cAAc,YAAaF,EACpC,GAEA,0BASA,SAAae,EAAoBS,GAE7B,IAAMlF,EAAS,SACTyD,EAAO,GAAH,OAAMjK,KAAKiK,MAEfF,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OAAQA,EACRhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMwF,EAAU,YAAIS,GACxBvH,QAAS,CAAC,GAEd,CAAC,GAGC+F,EAAMC,KAAAA,QAAa3D,EAAQuD,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAE3BnE,KAAKoK,cAAc,eAAgBF,EACvC,GAEA,mCAUA,SAAsBe,EAAoBS,GAEtC,IAAMlF,EAAS,OACTyD,EAAO,GAAH,OAAMgB,EAAU,YAAIjL,KAAKiK,MAE7BF,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OAAQA,EACRhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMiG,GACVvH,QAAS,CAAC,EACVuB,MAAO,CAAE,QAAW,KAExB,CAAC,GAGCwE,EAAMC,KAAAA,QAAa3D,EAAQuD,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAI3B,OAFAnE,KAAKoK,cAAc,wBAAyBF,GAErC,IAAI4B,GACPJ,GACA5I,EAAAA,EAAAA,WAAUoH,EAAIzF,MACT1B,KAAK,YACLC,OAEb,GAEA,wBAUA,SACIiI,EACAS,EACAK,EACAC,EACAJ,GAGA,IACM3B,EAAO,GAAH,OAAMgB,EAAU,YAAIjL,KAAKiK,MAC7BF,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OAJO,MAKPhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMiG,GACVvH,QAAS,CAAC,EACVM,KAAMmH,EACNlG,MAAO,CACHsG,WAAY,GAAF,OAAKA,GACfD,SAAU,GAAF,OAAKA,KAGrB,CAAC,GAGC7B,EAAMC,KAAAA,QAlBG,MAkBkBJ,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAI3B,OAFAnE,KAAKoK,cAAc,aAAcF,GAE1B,IAAI+B,GAAOD,EAAY9B,EAAI/F,QAAc,KACpD,GAEA,qCAUA,SACI8G,EACAS,EACAK,EACAG,GAGA,IAAM1F,EAAS,OACTyD,EAAO,GAAH,OAAMgB,EAAU,YAAIjL,KAAKiK,MAC7BxF,EAAO,4BAAH,OAA+ByH,EACpC5F,KACG,SAAC6F,GAAI,kCACoBA,EAAKH,WAAU,8BAAsBG,EAAKC,KAAI,qBAE1E9G,KAAK,IAAG,8BACPyE,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OAAQA,EACRhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMiG,GACVvH,QAAS,CAAC,EACVM,KAAMA,EACNiB,MAAO,CACHqG,SAAU,GAAF,OAAKA,KAGrB,CAAC,GAGC7B,EAAMC,KAAAA,QAAa3D,EAAQuD,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAG3BnE,KAAKoK,cAAc,0BAA2BF,EAClD,GAEA,kCASA,SAAqBe,EAAoBS,EAAmBK,GAExD,IAAMvF,EAAS,SACTyD,EAAO,GAAH,OAAMgB,EAAU,YAAIjL,KAAKiK,MAC7BF,EAAgB/J,KAAKiF,UAAU+E,KACjC,CACIxD,OAAQA,EACRhB,SAAUxF,KAAKG,OACfiE,SAAU6F,EACVxE,KAAM,IAAF,OAAMiG,GACVvH,QAAS,CAAC,EACVuB,MAAO,CACHqG,SAAU,GAAF,OAAKA,KAGrB,CAAC,GAGC7B,EAAMC,KAAAA,QAAa3D,EAAQuD,EAAcxE,IAAKwE,EAActF,MAAQ,GAAI,CAC1EN,QAAS4F,EAAc5F,UAE3BnE,KAAKoK,cAAc,uBAAwBF,EAC/C,GAAC,2BAED,SAAcmC,EAAwBC,GAClC,IAAMC,EAAiBD,EAASC,OAC1BC,EAAoBF,EAASG,WAC7BC,EAAuBJ,EAASK,MAGtC,KAAIJ,GAAU,KAAOA,EAAS,KAAuB,IAAhBG,GAAoC,IAAdF,GAA3D,CAUA,GAAc,KAAVD,GAAkBG,GAAgBA,EAAahF,WAAW,OAC1D,MAAM,IAAIkF,GAAe,qBAAsB,mBAAoBP,GAGvE,IAAMQ,EAAWpK,EAASqK,SAASR,EAAS7H,MAC5C,GACS,iCADDoI,EAASnK,KAET,MAAM,IAAIqD,GAAsB8G,EAASnM,QAASmM,EAASnK,MAE3D,MAAM,IAAIkK,GAAeC,EAASnM,QAASmM,EAASnK,MAAQ,UAAW2J,EAjB/E,CAmBJ,KAAC,EAlcgB,CCFC,WAWlB,WAAYxC,EAAsBC,I,4FAAqB,qHACnD9J,KAAK6J,UAAYA,EACjB7J,KAAK8J,YAAcA,CACvB,C,UAiCD,O,EA/BC,G,EAAA,iBAIA,WAII,OAHkB7J,MAAdD,KAAK+M,QACP/M,KAAK+M,MAAQ,GAAH,OAAM/M,KAAK8J,YAAW,YAAI9J,KAAK6J,UAAUlK,OAAM,YAAIK,KAAK6J,UAAUzJ,WAEvEJ,KAAK+M,KAChB,EAAC,IAED,SAAgB9C,GACZjK,KAAK+M,MAAQ9C,CACjB,GAEE,kBAKF,WAKE,OAHoBhK,MAAhBD,KAAKgN,UACPhN,KAAKgN,QAAUhN,KAAK6J,UAAU1J,QAEzBH,KAAKgN,OACd,EAEA,IACA,SAAkB7M,GAChBH,KAAKgN,QAAU7M,CACnB,M,gFAAC,EA/CmB,IDwcT8M,GAAQ,IAUjB,WAAYtK,EAAcqI,GAAoB,iEAC1ChL,KAAK2C,KAAOA,EACZ3C,KAAKgL,aAAeA,CACxB,IAISW,GAAQ,IAkBjB,WACIhN,EACA0M,EACAC,EACAC,EACAE,EACAG,GACF,oKACE5L,KAAKrB,IAAMA,EACXqB,KAAKqL,aAAeA,EACpBrL,KAAKsL,KAAOA,EACZtL,KAAKuL,KAAOA,EACZvL,KAAKyL,aAAeA,EACpBzL,KAAK4L,KAAOA,CAChB,IAISE,GAAiB,IAU1B,WAAYnN,EAAaoN,GAAkB,4DACvC/L,KAAKrB,IAAMA,EACXqB,KAAK+L,SAAWA,CACpB,IAISE,GAAM,IAUf,WAAYD,EAAoBI,GAAc,+DAC1CpM,KAAKgM,WAAaA,EAClBhM,KAAKoM,KAAOA,CAChB,IAWSQ,GAAc,gCAUvB,WAAYlM,EAAiBgC,EAAc2J,GAAmB,MAGhC,OAHgC,WACtC,MAApB,cAAM3L,EAASgC,IAAK,oBACpB,EAAKC,KAAO,iBACZ,EAAK0J,UAAYA,EAAS,CAC9B,CAAC,aAdsB,CAAS5J,G","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { 'uploads': '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","S3Client","awsConfig","serviceName","signedRequest","sign","host","res","http","_handle_error","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","size","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","operation","response","status","errorCode","error_code","errorMessage","error","S3ServiceError","awsError","parseXML","_host","_scheme","S3Bucket"],"sourceRoot":""} \ No newline at end of file diff --git a/build/secrets-manager.js.map b/build/secrets-manager.js.map index aa32559..5dfb154 100644 --- a/build/secrets-manager.js.map +++ b/build/secrets-manager.js.map @@ -1 +1 @@ -{"version":3,"file":"secrets-manager.js","mappings":"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","sources":["webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["v1","v4","uuid","module","exports","byteToHex","i","toString","substr","buf","offset","bth","join","getRandomValues","crypto","bind","window","msCrypto","rnds8","Uint8Array","rnds","Array","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","options","b","node","clockseq","undefined","seedBytes","msecs","Date","getTime","nsecs","dt","Error","tl","tmh","n","ii","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","SecretsManagerOperation","SecretsManagerClient","awsConfig","serviceName","commonHeaders","signedRequest","sign","host","res","http","_handle_error","ListSecrets","json","s","Secret","fromJSON","id","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","operation","response","errorCode","error_code","error","errorMessage","Message","__type","SecretsManagerServiceError","_host","_scheme","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"secrets-manager.js","mappings":"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","sources":["webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["v1","v4","uuid","module","exports","byteToHex","i","toString","substr","buf","offset","bth","join","getRandomValues","crypto","bind","window","msCrypto","rnds8","Uint8Array","rnds","Array","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","options","b","node","clockseq","undefined","seedBytes","msecs","Date","getTime","nsecs","dt","Error","tl","tmh","n","ii","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","SecretsManagerOperation","SecretsManagerClient","awsConfig","serviceName","commonHeaders","signedRequest","sign","host","res","http","_handle_error","ListSecrets","json","s","Secret","fromJSON","id","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","operation","response","errorCode","error_code","error","errorMessage","Message","__type","SecretsManagerServiceError","_host","_scheme","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate"],"sourceRoot":""} \ No newline at end of file diff --git a/build/signature.js.map b/build/signature.js.map index c7a579b..49d493f 100644 --- a/build/signature.js.map +++ b/build/signature.js.map @@ -1 +1 @@ -{"version":3,"file":"signature.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","UNSIGNED_PAYLOAD","require","AWSError","message","code","name","xmlDocument","doc","parseHTML","find","text","Error","SignatureV4","service","region","credentials","uriEscapePath","applyChecksum","this","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","sessionToken","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","accessKeyId","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","options","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","secretAccessKey","kDate","kRegion","kService","normalizedURISegments","split","URISegment","length","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","undefined","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"signature.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","UNSIGNED_PAYLOAD","require","AWSError","message","code","name","xmlDocument","doc","parseHTML","find","text","Error","SignatureV4","service","region","credentials","uriEscapePath","applyChecksum","this","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","sessionToken","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","accessKeyId","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","options","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","secretAccessKey","kDate","kRegion","kService","normalizedURISegments","split","URISegment","length","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","undefined","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString"],"sourceRoot":""} \ No newline at end of file diff --git a/build/sqs.js.map b/build/sqs.js.map index 2b25747..0880d55 100644 --- a/build/sqs.js.map +++ b/build/sqs.js.map @@ -1 +1 @@ -{"version":3,"file":"sqs.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/sqs.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","module","exports","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"sqs.js","mappings":"04BAUO,IAAMA,EAAS,WAWlB,WAAYC,EAAsBC,I,4FAAqB,iHACnDC,KAAKF,UAAYA,EACjBE,KAAKD,YAAcA,CACvB,C,UAiCD,O,EA/BC,G,EAAA,iBAIA,WAII,OAHkBE,MAAdD,KAAKE,QACPF,KAAKE,MAAQ,GAAH,OAAMF,KAAKD,YAAW,YAAIC,KAAKF,UAAUK,OAAM,YAAIH,KAAKF,UAAUM,WAEvEJ,KAAKE,KAChB,EAAC,IAED,SAAgBG,GACZL,KAAKE,MAAQG,CACjB,GAEE,kBAKF,WAKE,OAHoBJ,MAAhBD,KAAKM,UACPN,KAAKM,QAAUN,KAAKF,UAAUS,QAEzBP,KAAKM,OACd,EAEA,IACA,SAAkBC,GAChBP,KAAKM,QAAUC,CACnB,M,8EAAC,EA/CmB,E,oiFCPf,IAAMC,EAAS,WAsFlB,WAAYC,GACR,GADmC,8IApDlB,SAAO,kBAST,kBA4CVA,EAAQN,QAA6B,KAAnBM,EAAQN,OAC3B,MAAM,IAAIO,EAAsB,yFAAD,OAC+DD,EAAQN,OAAM,MAIhH,IAAKM,EAAQE,aAAuC,KAAxBF,EAAQE,YAChC,MAAM,IAAID,EAAsB,wEAAD,OAC8CD,EAAQE,YAAW,MAIpG,GAAIF,EAAQE,YAAYC,OAAS,IAAMH,EAAQE,YAAYC,OAAS,IAChE,MAAM,IAAIF,EAAsB,wFAAD,OAC6DD,EAAQE,YAAYC,SAIpH,IAAKH,EAAQI,iBAA+C,KAA5BJ,EAAQI,gBACpC,MAAM,IAAIH,EAAsB,4EAAD,OACkDD,EAAQI,gBAAe,MAI5G,GAAIJ,EAAQI,gBAAgBD,OAAS,IAAMH,EAAQI,gBAAgBD,OAAS,IACxE,MAAM,IAAIF,EAAsB,4FAAD,OACiED,EAAQI,gBAAgBD,SAI5HZ,KAAKG,OAASM,EAAQN,OACtBH,KAAKW,YAAcF,EAAQE,YAC3BX,KAAKa,gBAAkBJ,EAAQI,qBAEFZ,IAAzBQ,EAAQK,eACRd,KAAKc,aAAeL,EAAQK,mBAGTb,IAAnBQ,EAAQF,SACRP,KAAKO,OAASE,EAAQF,aAGDN,IAArBQ,EAAQL,WACRJ,KAAKI,SAAWK,EAAQL,SAEhC,CAtDC,OAsDA,uCAtED,SAAuBK,GAQnB,OAAO,IAAID,EAAU,CACjBL,OARWY,MAAMC,WASjBL,YARgBI,MAAME,kBAStBJ,gBARoBE,MAAMG,sBAS1BJ,aARqCC,MAAMI,kBAS3CZ,OARmCE,aAAO,EAAPA,EAASF,OAS5CH,SARiCK,aAAO,EAAPA,EAASL,UAUlD,KAAC,EA9EiB,GA4LTM,EAAqB,a,qRAAA,U,IAAA,G,EAAA,E,mJAC9B,WAAYU,GAAiB,6BACnBA,EACV,CAAC,YAH6B,CAG7B,EAHsCC,O,6MC5LpC,IAAMC,EAA4B,kBAC5BC,EAA6B,mBAC7BC,EAAuB,aACvBC,EAA0B,gBAC1BC,EAA4B,kBAC5BC,EAAiC,sBAEjCC,EAAwB,uBAKxBC,EAA4B,uBAC5BC,EAAkBN,EAAqBO,cACvCC,EAAuBN,EAA0BK,cAEjDE,GAVyB,eASkBF,cACxBH,EAAsBG,eAKzCG,EAAuB,gBAMvBC,EAAoB,CAACD,EAAsBJ,EAL7B,QAMdM,EAAc,OAMdC,EAA4B,CACrCC,eAAe,EACf,iBAAiB,EACjBC,YAAY,EACZC,QAAQ,EACRC,MAAM,EACN,cAAc,EACd,gBAAgB,EAChBC,QAAQ,EACRC,SAAS,EACTC,IAAI,EACJC,SAAS,EACT,qBAAqB,EACrBC,SAAS,EACT,cAAc,EACd,mBAAmB,GAMVC,EAAsB,eACtBC,EAA+B,mBAK/BC,EAAoB,OAKpBC,EAAe,mEAQfC,EAAmB,kB,quECnEzB,IAAMC,EAAQ,a,qRAAA,U,UAAA,G,EAAA,E,mJAYjB,WAAYhC,EAAiBiC,GAAe,M,MAGxB,O,4FAHwB,SACxC,cAAMjC,G,EAAQ,K,OAAA,G,MAAA,W,wFACd,EAAKkC,KAAO,WACZ,EAAKD,KAAOA,EAAI,CACpB,CAUC,O,EARD,E,EAAA,uBAKA,SAAgBE,GACZ,IAAMC,GAAMC,EAAAA,EAAAA,WAAUF,GACtB,OAAO,IAAIH,EAASI,EAAIE,KAAK,WAAWC,OAAQH,EAAIE,KAAK,QAAQC,OACrE,K,EARA,O,8EAQC,EA1BgB,CA0BhB,EA1ByBtC,O,gBCWvB,SAASuC,EAAUC,EAAsBC,GAC5CD,EAAeA,EAAa9B,cAE5B,IAAK,IAAL,MAAyBgC,OAAOC,KAAKF,GAAQ,eAAE,CAC3C,GAAID,IADa,KACe9B,cAC5B,OAAO,CAEf,CAEA,OAAO,CACX,C,krHCdO,IAAMkC,EAAW,WAoCpB,cAMuB,IALnBC,EAAO,EAAPA,QACA/D,EAAM,EAANA,OACAgE,EAAW,EAAXA,YACAC,EAAa,EAAbA,cACAC,EAAa,EAAbA,cAAa,sJAEbrE,KAAKkE,QAAUA,EACflE,KAAKG,OAASA,EACdH,KAAKmE,YAAcA,EACnBnE,KAAKoE,cAAyC,kBAAlBA,GAA8BA,EAC1DpE,KAAKqE,cAAyC,kBAAlBA,GAA8BA,CAC9D,CAkjBC,OAhjBD,uBAaA,SACIC,EAAoB,GAQH,QANbC,YAAAA,OAAW,IAAG,MAAIC,KAAM,EACxBC,EAAc,EAAdA,eACAC,EAAa,EAAbA,cAAa,IACbC,kBAAAA,OAAiB,IAAG,MAAIC,IAAa,MACrCC,gBAAAA,OAAe,IAAG,MAAID,IAAa,EAGvC,EAA0CE,EAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZd,EAAUO,GAAkBzE,KAAKkE,QACjC/D,EAASuE,GAAiB1E,KAAKG,OAC/B8E,EAAQ,GAAH,OAAMD,EAAS,YAAI7E,EAAM,YAAI+D,EAAO,YAAIgB,EAAAA,IAOnDZ,EAAQR,QAAQoB,EAAAA,IAAyBZ,EAAQa,SAKjD,IAAK,IAAL,MAAyBpB,OAAOC,KAAKM,EAAQR,SAAQ,eAAE,CAAlD,IAAMsB,EAAU,KACbF,EAAAA,GAAAA,QAAoCE,EAAWrD,gBAAkB,UAC1DuC,EAAQR,QAAQsB,EAE/B,CAEAd,EAAQR,QAAQoB,EAAAA,IAA6BH,EACzC/E,KAAKmE,YAAYrD,eACjBwD,EAAQR,QAAQoB,EAAAA,IAA8BlF,KAAKmE,YAAYrD,cAK/DuE,YAAYC,OAAOhB,EAAQiB,QAC3BjB,EAAQiB,KAAOjB,EAAQiB,KAAKC,QAI3BlB,EAAQiB,OACTjB,EAAQiB,KAAO,IAGnB,IAAIE,EAAczF,KAAK0F,mBAAmBpB,KACrCV,EAAAA,EAAAA,GAAUsB,EAAAA,GAAqCZ,EAAQR,UAAY9D,KAAKqE,gBACzEC,EAAQR,QAAQoB,EAAAA,IAAuCO,GAG3D,IAAME,EAAmB3F,KAAK4F,wBAAwBtB,EAASK,EAAmBE,GAC5EgB,EAAY7F,KAAK8F,mBACnBf,EACAE,EACAjF,KAAK+F,iBAAiB/F,KAAKmE,YAAaD,EAAS/D,EAAQ6E,GACzDhF,KAAKgG,uBAAuB1B,EAASqB,EAAkBF,IAQ3DnB,EAAQR,QAAQoB,EAAAA,IACZ,UAAGA,EAAAA,GAAsC,0BAC3BlF,KAAKmE,YAAYxD,YAAW,YAAIsE,EAAK,MAAI,wBACtClB,OAAOC,KAAK2B,GAAkBM,OAAOC,KAAK,KAAI,MAAI,oBACtDL,GAGjB,IAAIM,EAAM,GAAH,OAAM7B,EAAQ8B,SAAQ,cAAM9B,EAAQa,UAW3C,OAVIb,EAAQ+B,OACRF,GAAO7B,EAAQ+B,MAIf/B,EAAQgC,QAERH,GAAO,IAAJ,OAAQnG,KAAKuG,yBAAyBjC,EAAQgC,SAG9C,EAAP,CACIH,IAAKA,GACF7B,EAEX,GAEA,qBAWA,SAAQkC,GAA+E,IAAjD/F,EAA0B,UAAH,6CAAG,CAAC,EAC7D,EAQIA,EAPA8D,YAAAA,OAAW,IAAG,MAAIC,KAAM,IAOxB/D,EANAgG,UAAAA,OAAS,IAAG,OAAI,EAChB9B,EAKAlE,EALAkE,kBACA+B,EAIAjG,EAJAiG,mBACA7B,EAGApE,EAHAoE,gBACAH,EAEAjE,EAFAiE,cACAD,EACAhE,EADAgE,eAEJ,EAA0CK,EAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZ7E,EAASuE,GAAiB1E,KAAKG,OAC/B+D,EAAUO,GAAkBzE,KAAKkE,QAEvC,GAAIuC,EAAYvB,EAAAA,GACZ,MAAM,IAAIyB,EACN,0EAIR,IAAM1B,EAAQ,GAAH,OAAMD,EAAS,YAAI7E,EAAM,YAAI+D,EAAO,YAAIgB,EAAAA,IAC7CZ,EAAUtE,KAAK4G,mBAAmBJ,EAAiB,CAAEE,mBAAAA,IAO3DpC,EAAQR,QAAQoB,EAAAA,IAAyBsB,EAAgBrB,SAGrDnF,KAAKmE,YAAYrD,eACjBwD,EAAQgC,MAAMpB,EAAAA,IAAmClF,KAAKmE,YAAYrD,cAKtEwD,EAAQgC,MAAMpB,EAAAA,IAAuCA,EAAAA,GACrDZ,EAAQgC,MACJpB,EAAAA,IACA,GAAH,OAAMlF,KAAKmE,YAAYxD,YAAW,YAAIsE,GACvCX,EAAQgC,MAAMpB,EAAAA,IAAkCH,EAChDT,EAAQgC,MAAMpB,EAAAA,IAAqCuB,EAAUI,SAAS,IAEtE,IAAMlB,EAAmB3F,KAAK4F,wBAC1BtB,EACAK,EACAE,GAEJP,EAAQgC,MAAMpB,EAAAA,IAA4CnB,OAAOC,KAAK2B,GACjEM,OACAC,KAAK,KAEV,IAAMY,EAAa9G,KAAK+F,iBAAiB/F,KAAKmE,YAAaD,EAAS/D,EAAQ6E,GAStES,EAAczF,KAAK0F,mBAAmBc,GACtCO,EAAmB/G,KAAKgG,uBAAuB1B,EAASqB,EAAkBF,GAEhFnB,EAAQgC,MAAMpB,EAAAA,IAAuClF,KAAK8F,mBACtDf,EACAE,EACA6B,EACAC,GAIJ,IAAIZ,EAAM,GAAH,OAAM7B,EAAQ8B,SAAQ,cAAM9B,EAAQa,UAU3C,OATIb,EAAQ+B,OACRF,GAAO7B,EAAQ+B,MAIf/B,EAAQgC,QACRH,GAAO,IAAJ,OAAQnG,KAAKuG,yBAAyBjC,EAAQgC,SAG9C,EAAP,CAASH,IAAKA,GAAQ7B,EAC1B,GAEA,oCAYA,SACIA,EACAqB,EACAF,GAEA,IAAMuB,EAAgBjD,OAAOC,KAAK2B,GAAkBM,OAC9CgB,EAAyBD,EAC1BE,KAAI,SAAC5D,GAAI,gBAAQA,EAAI,YAAIqC,EAAiBrC,GAAK,IAC/C4C,KAAK,MACJiB,EAAgBH,EAAcd,KAAK,KAEzC,MACI,UAAG5B,EAAQ8C,OAAM,gBACdpH,KAAKqH,oBAAoB/C,GAAQ,MAAI,UACrCtE,KAAKsH,4BAA4BhD,GAAQ,MAAI,UAC7C2C,EAAsB,QAAM,UAC5BE,EAAa,MAAI,UACjB1B,EAEX,GAEA,gCAcA,SACIV,EACAwC,EACAR,GAEA,IAAMS,EAAyBC,IAAAA,OAAcV,EAAkB,OAE/D,MACI,UAAG7B,EAAAA,GAAsC,gBACtCH,EAAQ,MAAI,UACZwC,EAAe,MAAI,UACnBC,EAEX,GAEA,gCAYA,SACIzC,EACAwC,EACAT,EACAC,GAEA,IAAMW,EAAe1H,KAAK2H,mBAAmB5C,EAAUwC,EAAiBR,GACxE,OAAOU,IAAAA,KAAY,SAAUX,EAAYY,EAAc,MAC3D,GAEA,8BAiBA,SACIvD,EACAD,EACA/D,EACA6E,GAEA,IAAM4C,EAAkBzD,EAAYtD,gBAC9BgH,EAAaJ,IAAAA,KAAY,SAAU,OAASG,EAAS5C,EAAW,UAChE8C,EAAeL,IAAAA,KAAY,SAAUI,EAAO1H,EAAQ,UACpD4H,EAAgBN,IAAAA,KAAY,SAAUK,EAAS5D,EAAS,UAG9D,OAFsBuD,IAAAA,KAAY,SAAUM,EAAU,eAAgB,SAG1E,GAEA,iCAOA,YAA2D,IAA7B1B,EAAI,EAAJA,KAC1B,GAAIrG,KAAKoE,cAAe,CAGpB,IAEwC,EAFlC4D,EAAwB,GAAE,IAEP3B,EAAK4B,MAAM,MAAI,IAAxC,IAAK,EAAL,qBAA0C,KAA/BC,EAAU,QACU,KAAvBA,aAAU,EAAVA,EAAYtH,UAIG,MAAfsH,IAIe,OAAfA,EACAF,EAAsBG,MAEtBH,EAAsBI,KAAKF,IAEnC,CAEA,+BACA,IAAMG,EAAUhC,SAAAA,EAAMiC,WAAW,KAAO,IAAM,GACxCC,EAAMP,EAAsB9B,KAAK,KACjCsC,EAAWR,EAAsBpH,OAAS,GAA/BoH,MAAoC3B,GAAAA,EAAMoC,SAAS,KAAO,IAAM,GAC3EC,EAAgB,GAAH,OAAML,GAAO,OAAGE,GAAG,OAAGC,GAIzC,OAFsBG,mBAAmBD,GAEpBE,QAAQ,OAAQ,IACzC,CAKA,OAAOvC,CACX,GAEA,yCAQA,YAAyE,IAI1B,EAJ0B,IAAnCC,MAAAA,OAAK,IAAG,GAAC,EAAC,EACtCtC,EAAsB,GACtB6E,EAAqC,CAAC,EAAC,cAGzC,GAAIC,EAAI/G,gBAAkBmD,EAAAA,GAAgC,iBAI1DlB,EAAKoE,KAAKU,GACV,IAAMC,EAAQzC,EAAMwC,GAEC,iBAAVC,EACPF,EAAWC,GAAO,GAAH,OAAME,EAAUF,GAAI,YAAIE,EAAUD,IAC1CE,MAAMC,QAAQH,KACrBF,EAAWC,GAAOC,EACbI,MAAM,GACNlD,OACAmD,QACG,SAACC,EAAwBN,GAAa,OAClCM,EAAQC,OAAO,CAAC,GAAD,OAAIN,EAAUF,GAAI,YAAIE,EAAUD,KAAU,GAC7D,IAEH7C,KAAK,KAElB,EAAC,IArBiBnC,OAAOC,KAAKsC,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOjC,EACFkD,KAAI,SAAC4B,GAAG,OAAKD,EAAWC,EAAI,IAC5BS,QAAO,SAACV,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,GAEA,qCAUA,WAEIvB,EACAE,GACa,IAGuC,EANlDf,EAAO,EAAPA,QAII6B,EAAkC,CAAC,EAAC,IAEjB5B,OAAOC,KAAKF,GAASmC,QAAM,IAApD,IAAK,EAAL,qBAAsD,KAA3Cb,EAAU,QACjB,GAA2BnF,MAAvB6D,EAAQsB,GAAZ,CAIA,IAAMoE,EAAsBpE,EAAWrD,eAEnCyH,KAAuBtE,EAAAA,IACvBP,SAAAA,EAAmB8E,IAAID,OAGlB3E,GACAA,IAAoBA,EAAgB4E,IAAID,MAMjD7D,EAAiB6D,GAAuB1F,EAAQsB,GAAYsE,OAAOd,QAAQ,OAAQ,KAfnF,CAgBJ,CAAC,+BAED,OAAOjD,CACX,GAEA,gCAWA,YAAmE,IAAtC7B,EAAO,EAAPA,QAASyB,EAAI,EAAJA,KASlC,OAAIzB,EAAQoB,EAAAA,IACDpB,EAAQoB,EAAAA,IAGPjF,MAARsF,EACOL,EAAAA,GAGS,iBAATK,IAAqBoE,EAAAA,EAAAA,GAAcpE,GACnCkC,IAAAA,OAAclC,EAAM,OAAOxD,cAGlCsD,YAAYC,OAAOC,GAGZkC,IAAAA,OAAelC,EAAkBC,OAAQ,OAAOzD,cAGpDmD,EAAAA,EACX,GAEA,gCAaA,SACIZ,GAMA,IAJ0C,IAD1C7D,EAAgD,UAAH,6CAAG,CAAC,EAE3CmJ,EAAcC,KAAKC,MAAMD,KAAKE,UAAUzF,IACtCR,EAA6C8F,EAA7C9F,QAAO,EAAsC8F,EAApCtD,MAAAA,OAAK,IAAG,GAAC,EAAC,EAE3B,MAAmBvC,OAAOC,KAAKF,GAAQ,eAAE,OAA9BR,EAAI,KACL0G,EAAgB1G,EAAKvB,cAEO,WAA9BiI,EAAcb,MAAM,EAAG,IACI,QAA3B,EAAC1I,EAAQiG,0BAAkB,OAA1B,EAA4B+C,IAAIO,KAEjC1D,EAAMhD,GAAQQ,EAAQR,UACfQ,EAAQR,GAEvB,CAEA,OAAO,EAAP,KACOsG,GAAW,IACd9F,QAAAA,EACAwC,MAAAA,GAER,GAEA,sCAOA,SAAiCA,EAA0B2D,GACvD,IAG2C,EAHrCjG,EAAsB,GACtB6E,EAAqC,CAAC,EAAC,cAGzC,GAAIoB,SAAAA,EAAYC,SAASpB,EAAI/G,eAAgB,iBAI7CiC,EAAKoE,KAAKU,GACV,IAAMC,EAAQzC,EAAMwC,GAEC,iBAAVC,EACPF,EAAWC,GAAO,GAAH,OAAME,EAAUF,GAAI,YAAIE,EAAUD,IAC1CE,MAAMC,QAAQH,KACrBF,EAAWC,GAAOC,EACbI,MAAM,GACNlD,OACAmD,QACG,SAACC,EAAwBN,GAAa,OAClCM,EAAQC,OAAO,CAAC,GAAD,OAAIN,EAAUF,GAAI,YAAIE,EAAUD,KAAU,GAC7D,IAEH7C,KAAK,KAElB,EAAC,IArBiBnC,OAAOC,KAAKsC,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOjC,EACFkD,KAAI,SAAC4B,GAAG,OAAKD,EAAWC,EAAI,IAC5BS,QAAO,SAACV,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,KAAC,EAlmBmB,GA6mBXS,EAAqB,a,qRAAA,iBAM9B,WAAYvF,EAAiBiC,GAAe,MAEL,OAFK,WACxC,cAAMjC,EAASiC,IACVC,KAAO,wBAAuB,CACvC,CAAC,YAT6B,CAASF,EAAAA,GA+I3C,SAAS4F,EAAUT,GAKf,OAAOI,mBAAmBJ,GAAKK,QAAQ,YAJrB,SAACuB,GACf,MAAO,IAAP,OAAWA,EAAEC,WAAW,GAAGvD,SAAS,IAAIwD,cAC5C,GAGJ,CASA,SAASvF,EAAWwF,GAChB,IAeaC,EAfPxF,GAeOwF,EAfYD,EA2B7B,SAAgBC,GACZ,MAAoB,iBAATA,EACA,IAAI/F,KAAY,IAAP+F,GAGA,iBAATA,EACHC,OAAOD,GACA,IAAI/F,KAAoB,IAAfgG,OAAOD,IAGpB,IAAI/F,KAAK+F,GAGbA,CACX,CAzBWE,CAAOF,GACTG,cACA9B,QAAQ,YAAa,MAlBKA,QAAQ,SAAU,IACjD,MAAO,CACH7D,SAAAA,EACAC,UAAWD,EAASoE,MAAM,EAAG,GAErC,C,eC7xBO,SAASQ,EAAcZ,GAC1B,MAC2B,mBAAhB1D,cACN0D,aAAiB1D,aAC4B,yBAA1CtB,OAAO4G,UAAU9D,SAAS+D,KAAK7B,GAE3C,CAEO,SAAS8B,EAAiBC,GAC7B,OAAO/G,OAAOC,KAAK8G,GAAM1B,QAAO,SAAC2B,EAAQjC,GACrC,IAAIC,EAAQ+B,EAAKhC,GAIjB,OAHIC,SACAgC,EAAO3C,KAAK,GAAD,OAAIO,mBAAmBG,GAAI,YAAIH,mBAAmBI,KAE1DgC,CACX,GAAG,IAAgB7E,KAAK,IAC5B,C,kCCrBA8E,EAAOC,QAAUC,QAAQ,Y,UCAzBF,EAAOC,QAAUC,QAAQ,U,UCAzBF,EAAOC,QAAUC,QAAQ,U,GCCrBC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBpL,IAAjBqL,EACH,OAAOA,EAAaL,QAGrB,IAAID,EAASG,EAAyBE,GAAY,CAGjDJ,QAAS,CAAC,GAOX,OAHAM,EAAoBF,GAAUL,EAAQA,EAAOC,QAASG,GAG/CJ,EAAOC,OACf,CCrBAG,EAAoBI,EAAKR,IACxB,IAAIS,EAAST,GAAUA,EAAOU,WAC7B,IAAOV,EAAiB,QACxB,IAAM,EAEP,OADAI,EAAoBO,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdL,EAAoBO,EAAI,CAACV,EAASY,KACjC,IAAI,IAAI/C,KAAO+C,EACXT,EAAoBU,EAAED,EAAY/C,KAASsC,EAAoBU,EAAEb,EAASnC,IAC5E/E,OAAOgI,eAAed,EAASnC,EAAK,CAAEkD,YAAY,EAAMC,IAAKJ,EAAW/C,IAE1E,ECNDsC,EAAoBU,EAAI,CAACI,EAAKC,IAAUpI,OAAO4G,UAAUyB,eAAexB,KAAKsB,EAAKC,GCClFf,EAAoBiB,EAAKpB,IACH,oBAAXqB,QAA0BA,OAAOC,aAC1CxI,OAAOgI,eAAed,EAASqB,OAAOC,YAAa,CAAExD,MAAO,WAE7DhF,OAAOgI,eAAed,EAAS,aAAc,CAAElC,OAAO,GAAO,E,qgGCG9D,IAAMyD,EAAc,aAEPC,EAAS,8BAIlB,WAAY3M,GAAsB,MAiB7B,OAjB6B,UACP,IAAvB,cAAMA,EAAW,QAAM,mDAEvB,EAAK+F,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKnE,YACdI,OAAQ,EAAKL,UAAUK,OACvBgE,YAAa,CACTxD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCsD,eAAe,EACfC,eAAe,IAGnB,EAAKqI,cAAgB,CACjB,eAAgB,qCACnB,CACL,CA2IC,OAzID,8BAUA,SAAYC,EAAkBC,GAAyG,IAApFnM,EAAuE,UAAH,6CAAG,CAAC,EACjH2G,EAAS,OAEX7B,EAAY,CACZsH,OAAQ,cACRC,QAASN,EACTO,SAAUJ,EACVK,YAAaJ,QAG8B,IAApCnM,EAAQwM,yBACf1H,EAAO,EAAH,KAAQA,GAAI,IACZ2H,uBAAwBzM,EAAQwM,+BAID,IAA5BxM,EAAQ0M,iBACf5H,EAAO,EAAH,KAAQA,GAAI,IACZ6H,eAAgB3M,EAAQ0M,kBAIhC,IAAME,EAAmCrN,KAAK6F,UAAUyH,KACpD,CACIlG,OAAQ,OACRhB,SAAU,QACVjB,SAAUnF,KAAKK,KACfgG,KAAM,IACNvC,QAAS,EAAF,GACA9D,KAAK0M,eAEZnH,MAAMsF,EAAAA,EAAAA,GAAiBtF,IAE3B,CAAC,GAGCgI,EAAMC,IAAAA,QAAapG,EAAQiG,EAAclH,IAAKkH,EAAc9H,MAAQ,GAAI,CAC1EzB,QAASuJ,EAAcvJ,UAE3B9D,KAAKyN,aAAa,cAAeF,GAEjC,IAAMG,EAASH,EAAII,KAAK,2CACxB,OAAO,IAAIC,EACPF,EAAOhK,KAAK,aAAaC,OACzB+J,EAAOhK,KAAK,oBAAoBC,OAExC,GAEA,wBAWA,WAA6E,IAAlEkK,EAA0C,UAAH,6CAAG,CAAC,EAC5CzG,EAAS,OAEX7B,EAAY,CACZsH,OAAQ,aACRC,QAASN,QAG0B,KAA5BqB,aAAU,EAAVA,EAAYC,cACnBvI,EAAO,EAAH,KAAQA,GAAI,IACZwI,WAAYF,EAAWC,mBAIO,KAA3BD,aAAU,EAAVA,EAAYG,aACnBzI,EAAO,EAAH,KAAQA,GAAI,IACZ0I,UAAWJ,EAAWG,kBAIc,KAAjCH,aAAU,EAAVA,EAAYK,mBACnB3I,EAAO,EAAH,KAAQA,GAAI,IACZ4I,gBAAiBN,EAAWK,mBAIpC,IAAMb,EAAmCrN,KAAK6F,UAAUyH,KACpD,CACIlG,OAAQ,OACRhB,SAAU,QACVjB,SAAUnF,KAAKK,KACfgG,KAAM,IACNvC,QAAS,EAAF,KACA9D,KAAK0M,eAAa,IACrB,KAAQ1M,KAAKK,OAEjBkF,MAAMsF,EAAAA,EAAAA,GAAiBtF,IAE3B,CAAC,GAGCgI,EAAMC,IAAAA,QAAapG,EAAQiG,EAAclH,IAAKkH,EAAc9H,MAAQ,GAAI,CAC1EzB,QAASuJ,EAAcvJ,UAE3B9D,KAAKyN,aAAa,aAAcF,GAEhC,IAAIG,EAASH,EAAII,OACjB,MAAO,CACHS,KAAMV,EAAOhK,KAAK,YAAY2K,UAAUnH,KAAI,SAAAoH,GAAC,OAAIA,EAAE3K,MAAM,IACzDqK,UAAWN,EAAOhK,KAAK,aAAaC,aAAU1D,EAEtD,GAAC,0BAED,SAAqBsO,EAAyBC,GAC1C,IAAMC,EAAoBD,EAASE,WAGnC,GAAoB,IAFSF,EAASG,OAEE,IAAdF,EAA1B,CAIA,IAAMG,EAAWxL,EAAAA,EAAAA,SAAkBoL,EAASjJ,MAC5C,GACS,iCADDqJ,EAASvL,KAET,MAAM,IAAIsD,EAAAA,EAAsBiI,EAASxN,QAASwN,EAASvL,MAE3D,MAAM,IAAIwL,EAAgBD,EAASxN,QAASwN,EAASvL,MAAQ,UAAWkL,EAPhF,CASJ,KAAC,EAjKiB,CAAS1O,EAAAA,GAuKlB+N,EAAO,GAkBhB,WAAYkB,EAAYC,GAAiB,uDACrC/O,KAAK8O,GAAKA,EACV9O,KAAK+O,QAAUA,CACnB,IAMSF,EAAe,8BAGxB,WAAYzN,EAAiBiC,EAAckL,GAAyB,MAGtC,OAHsC,UAC5C,IAApB,cAAMnN,EAASiC,IAAK,oBACpB,EAAKC,KAAO,kBACZ,EAAKiL,UAAYA,EAAS,CAC9B,CAAC,YAPuB,CAASnL,EAAAA,E","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/sqs.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","module","exports","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","r","Symbol","toStringTag","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5"],"sourceRoot":""} \ No newline at end of file diff --git a/build/ssm.js.map b/build/ssm.js.map index 2dd0cf7..f6e7b73 100644 --- a/build/ssm.js.map +++ b/build/ssm.js.map @@ -1 +1 @@ -{"version":3,"file":"ssm.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/ssm.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","SystemsManagerOperation","SystemsManagerClient","awsConfig","commonHeaders","serviceName","withDecryption","signedRequest","sign","host","Name","WithDecryption","res","http","_handle_error","GetParameter","SystemsManagerParameter","fromJSON","json","operation","response","errorCode","error_code","error","errorMessage","Message","__type","SystemsManagerServiceError","_host","_scheme","arn","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","ARN","DataType","LastModifiedDate","Selector","SourceResult","Type","Value","Version"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"ssm.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/ssm.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","SystemsManagerOperation","SystemsManagerClient","awsConfig","commonHeaders","serviceName","withDecryption","signedRequest","sign","host","Name","WithDecryption","res","http","_handle_error","GetParameter","SystemsManagerParameter","fromJSON","json","operation","response","errorCode","error_code","error","errorMessage","Message","__type","SystemsManagerServiceError","_host","_scheme","arn","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","ARN","DataType","LastModifiedDate","Selector","SourceResult","Type","Value","Version"],"sourceRoot":""} \ No newline at end of file diff --git a/src/internal/s3.ts b/src/internal/s3.ts index cc483e4..5b7fd5c 100644 --- a/src/internal/s3.ts +++ b/src/internal/s3.ts @@ -217,7 +217,7 @@ export class S3Client extends AWSClient { // Prepare request const method = 'PUT' const host = `${this.host}` - + const signedRequest = this.signature.sign( { method: method, @@ -274,7 +274,7 @@ export class S3Client extends AWSClient { * The uploadId returned can be used to upload parts to the object. * * @param {string} bucketName - The bucket name containing the object. - * @param {string} objectKey - Key of the object to delete. + * @param {string} objectKey - Key of the object to upload. * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload. * @throws {S3ServiceError} * @throws {InvalidSignatureError} @@ -283,15 +283,15 @@ export class S3Client extends AWSClient { // Prepare request const method = 'POST' const host = `${bucketName}.${this.host}` - const query = 'uploads' const signedRequest = this.signature.sign( { method: method, - protocol: 'https', + protocol: this.scheme, hostname: host, - path: `/${objectKey}?${query}`, + path: `/${objectKey}`, headers: {}, + query: { 'uploads': '' }, }, {} ) @@ -312,7 +312,7 @@ export class S3Client extends AWSClient { /** * Uploads a part in a multipart upload. * @param {string} bucketName - The bucket name containing the object. - * @param {string} objectKey - Key of the object to delete. + * @param {string} objectKey - Key of the object to upload. * @param {string} uploadId - The uploadId of the multipart upload. * @param {number} partNumber - The part number of the part to upload. * @param {string | ArrayBuffer} data - The content of the part to upload. @@ -329,15 +329,18 @@ export class S3Client extends AWSClient { // Prepare request const method = 'PUT' const host = `${bucketName}.${this.host}` - const query = `partNumber=${partNumber}&uploadId=${uploadId}` const signedRequest = this.signature.sign( { method: method, - protocol: 'https', + protocol: this.scheme, hostname: host, - path: `/${objectKey}?${query}`, + path: `/${objectKey}`, headers: {}, body: data, + query: { + partNumber: `${partNumber}`, + uploadId: `${uploadId}`, + }, }, {} ) @@ -369,7 +372,6 @@ export class S3Client extends AWSClient { // Prepare request const method = 'POST' const host = `${bucketName}.${this.host}` - const query = `uploadId=${uploadId}` const body = `${parts .map( (part) => @@ -379,11 +381,14 @@ export class S3Client extends AWSClient { const signedRequest = this.signature.sign( { method: method, - protocol: 'https', + protocol: this.scheme, hostname: host, - path: `/${objectKey}?${query}`, + path: `/${objectKey}`, headers: {}, body: body, + query: { + uploadId: `${uploadId}`, + }, }, {} ) @@ -408,14 +413,16 @@ export class S3Client extends AWSClient { // Prepare request const method = 'DELETE' const host = `${bucketName}.${this.host}` - const query = `uploadId=${uploadId}` const signedRequest = this.signature.sign( { method: method, - protocol: 'https', + protocol: this.scheme, hostname: host, - path: `/${objectKey}?${query}`, + path: `/${objectKey}`, headers: {}, + query: { + uploadId: `${uploadId}`, + }, }, {} ) From b334dbf3c127585579fe62275e6ec70480b51e17 Mon Sep 17 00:00:00 2001 From: Imma Valls Date: Mon, 8 May 2023 20:55:11 +0200 Subject: [PATCH 2/4] minor correction of the uploads parameter --- build/aws.js.map | 2 +- build/index.js.map | 2 +- build/s3.js.map | 2 +- src/internal/s3.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/aws.js.map b/build/aws.js.map index 5cb58da..83ac4d2 100644 --- a/build/aws.js.map +++ b/build/aws.js.map @@ -1 +1 @@ -{"version":3,"file":"aws.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { 'uploads': '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"aws.js","mappings":"04BAUO,IAAMA,EAAS,WAWlB,WAAYC,EAAsBC,I,4FAAqB,iHACnDC,KAAKF,UAAYA,EACjBE,KAAKD,YAAcA,CACvB,C,UAiCD,O,EA/BC,G,EAAA,iBAIA,WAII,OAHkBE,MAAdD,KAAKE,QACPF,KAAKE,MAAQ,GAAH,OAAMF,KAAKD,YAAW,YAAIC,KAAKF,UAAUK,OAAM,YAAIH,KAAKF,UAAUM,WAEvEJ,KAAKE,KAChB,EAAC,IAED,SAAgBG,GACZL,KAAKE,MAAQG,CACjB,GAEE,kBAKF,WAKE,OAHoBJ,MAAhBD,KAAKM,UACPN,KAAKM,QAAUN,KAAKF,UAAUS,QAEzBP,KAAKM,OACd,EAEA,IACA,SAAkBC,GAChBP,KAAKM,QAAUC,CACnB,M,8EAAC,EA/CmB,E,ijFCPf,IAAMC,EAAS,WAsFlB,WAAYC,GACR,GADmC,8IApDlB,SAAO,kBAST,kBA4CVA,EAAQN,QAA6B,KAAnBM,EAAQN,OAC3B,MAAM,IAAIO,EAAsB,yFAAD,OAC+DD,EAAQN,OAAM,MAIhH,IAAKM,EAAQE,aAAuC,KAAxBF,EAAQE,YAChC,MAAM,IAAID,EAAsB,wEAAD,OAC8CD,EAAQE,YAAW,MAIpG,GAAIF,EAAQE,YAAYC,OAAS,IAAMH,EAAQE,YAAYC,OAAS,IAChE,MAAM,IAAIF,EAAsB,wFAAD,OAC6DD,EAAQE,YAAYC,SAIpH,IAAKH,EAAQI,iBAA+C,KAA5BJ,EAAQI,gBACpC,MAAM,IAAIH,EAAsB,4EAAD,OACkDD,EAAQI,gBAAe,MAI5G,GAAIJ,EAAQI,gBAAgBD,OAAS,IAAMH,EAAQI,gBAAgBD,OAAS,IACxE,MAAM,IAAIF,EAAsB,4FAAD,OACiED,EAAQI,gBAAgBD,SAI5HZ,KAAKG,OAASM,EAAQN,OACtBH,KAAKW,YAAcF,EAAQE,YAC3BX,KAAKa,gBAAkBJ,EAAQI,qBAEFZ,IAAzBQ,EAAQK,eACRd,KAAKc,aAAeL,EAAQK,mBAGTb,IAAnBQ,EAAQF,SACRP,KAAKO,OAASE,EAAQF,aAGDN,IAArBQ,EAAQL,WACRJ,KAAKI,SAAWK,EAAQL,SAEhC,CAtDC,OAsDA,uCAtED,SAAuBK,GAQnB,OAAO,IAAID,EAAU,CACjBL,OARWY,MAAMC,WASjBL,YARgBI,MAAME,kBAStBJ,gBARoBE,MAAMG,sBAS1BJ,aARqCC,MAAMI,kBAS3CZ,OARmCE,aAAO,EAAPA,EAASF,OAS5CH,SARiCK,aAAO,EAAPA,EAASL,UAUlD,KAAC,EA9EiB,GA4LTM,EAAqB,a,qRAAA,U,IAAA,G,EAAA,E,mJAC9B,WAAYU,GAAiB,6BACnBA,EACV,CAAC,YAH6B,CAG7B,EAHsCC,O,mOC5LpC,IAAMC,EAA4B,kBAC5BC,EAA6B,mBAC7BC,EAAuB,aACvBC,EAA0B,gBAC1BC,EAA4B,kBAC5BC,EAAiC,sBAEjCC,EAAwB,uBAKxBC,EAA4B,uBAC5BC,EAAkBN,EAAqBO,cACvCC,EAAuBN,EAA0BK,cACjDE,EATyB,eASkBF,cAC3CG,EAAmBN,EAAsBG,cAKzCI,EAAuB,gBAMvBC,EAAoB,CAACD,EAAsBL,EAL7B,QAMdO,EAAc,OAMdC,EAA4B,CACrCC,eAAe,EACf,iBAAiB,EACjBC,YAAY,EACZC,QAAQ,EACRC,MAAM,EACN,cAAc,EACd,gBAAgB,EAChBC,QAAQ,EACRC,SAAS,EACTC,IAAI,EACJC,SAAS,EACT,qBAAqB,EACrBC,SAAS,EACT,cAAc,EACd,mBAAmB,GAMVC,EAAsB,eACtBC,EAA+B,mBAK/BC,EAAoB,OAKpBC,EAAe,mEAQfC,EAAmB,kB,kvECnEzB,IAAMC,EAAQ,a,qRAAA,U,UAAA,G,EAAA,E,mJAYjB,WAAYjC,EAAiBkC,GAAe,M,MAGxB,O,4FAHwB,SACxC,cAAMlC,G,EAAQ,K,OAAA,G,MAAA,W,wFACd,EAAKmC,KAAO,WACZ,EAAKD,KAAOA,EAAI,CACpB,CAUC,O,EARD,E,EAAA,uBAKA,SAAgBE,GACZ,IAAMC,GAAMC,EAAAA,EAAAA,WAAUF,GACtB,OAAO,IAAIH,EAASI,EAAIE,KAAK,WAAWC,OAAQH,EAAIE,KAAK,QAAQC,OACrE,K,EARA,O,8EAQC,EA1BgB,CA0BhB,EA1ByBvC,O,6BCWvB,SAASwC,EAAUC,EAAsBC,GAC5CD,EAAeA,EAAa/B,cAE5B,IAAK,IAAL,MAAyBiC,OAAOC,KAAKF,GAAQ,eAAE,CAC3C,GAAID,IADa,KACe/B,cAC5B,OAAO,CAEf,CAEA,OAAO,CACX,C,+rHCdO,IAAMmC,EAAW,WAoCpB,cAMuB,IALnBC,EAAO,EAAPA,QACAhE,EAAM,EAANA,OACAiE,EAAW,EAAXA,YACAC,EAAa,EAAbA,cACAC,EAAa,EAAbA,cAAa,sJAEbtE,KAAKmE,QAAUA,EACfnE,KAAKG,OAASA,EACdH,KAAKoE,YAAcA,EACnBpE,KAAKqE,cAAyC,kBAAlBA,GAA8BA,EAC1DrE,KAAKsE,cAAyC,kBAAlBA,GAA8BA,CAC9D,CAkjBC,OAhjBD,uBAaA,SACIC,EAAoB,GAQH,QANbC,YAAAA,OAAW,IAAG,MAAIC,KAAM,EACxBC,EAAc,EAAdA,eACAC,EAAa,EAAbA,cAAa,IACbC,kBAAAA,OAAiB,IAAG,MAAIC,IAAa,MACrCC,gBAAAA,OAAe,IAAG,MAAID,IAAa,EAGvC,EAA0CE,EAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZd,EAAUO,GAAkB1E,KAAKmE,QACjChE,EAASwE,GAAiB3E,KAAKG,OAC/B+E,EAAQ,GAAH,OAAMD,EAAS,YAAI9E,EAAM,YAAIgE,EAAO,YAAIgB,EAAAA,IAOnDZ,EAAQR,QAAQoB,EAAAA,IAAyBZ,EAAQa,SAKjD,IAAK,IAAL,MAAyBpB,OAAOC,KAAKM,EAAQR,SAAQ,eAAE,CAAlD,IAAMsB,EAAU,KACbF,EAAAA,GAAAA,QAAoCE,EAAWtD,gBAAkB,UAC1DwC,EAAQR,QAAQsB,EAE/B,CAEAd,EAAQR,QAAQoB,EAAAA,IAA6BH,EACzChF,KAAKoE,YAAYtD,eACjByD,EAAQR,QAAQoB,EAAAA,IAA8BnF,KAAKoE,YAAYtD,cAK/DwE,YAAYC,OAAOhB,EAAQiB,QAC3BjB,EAAQiB,KAAOjB,EAAQiB,KAAKC,QAI3BlB,EAAQiB,OACTjB,EAAQiB,KAAO,IAGnB,IAAIE,EAAc1F,KAAK2F,mBAAmBpB,KACrCV,EAAAA,EAAAA,GAAUsB,EAAAA,GAAqCZ,EAAQR,UAAY/D,KAAKsE,gBACzEC,EAAQR,QAAQoB,EAAAA,IAAuCO,GAG3D,IAAME,EAAmB5F,KAAK6F,wBAAwBtB,EAASK,EAAmBE,GAC5EgB,EAAY9F,KAAK+F,mBACnBf,EACAE,EACAlF,KAAKgG,iBAAiBhG,KAAKoE,YAAaD,EAAShE,EAAQ8E,GACzDjF,KAAKiG,uBAAuB1B,EAASqB,EAAkBF,IAQ3DnB,EAAQR,QAAQoB,EAAAA,IACZ,UAAGA,EAAAA,GAAsC,0BAC3BnF,KAAKoE,YAAYzD,YAAW,YAAIuE,EAAK,MAAI,wBACtClB,OAAOC,KAAK2B,GAAkBM,OAAOC,KAAK,KAAI,MAAI,oBACtDL,GAGjB,IAAIM,EAAM,GAAH,OAAM7B,EAAQ8B,SAAQ,cAAM9B,EAAQa,UAW3C,OAVIb,EAAQ+B,OACRF,GAAO7B,EAAQ+B,MAIf/B,EAAQgC,QAERH,GAAO,IAAJ,OAAQpG,KAAKwG,yBAAyBjC,EAAQgC,SAG9C,EAAP,CACIH,IAAKA,GACF7B,EAEX,GAEA,qBAWA,SAAQkC,GAA+E,IAAjDhG,EAA0B,UAAH,6CAAG,CAAC,EAC7D,EAQIA,EAPA+D,YAAAA,OAAW,IAAG,MAAIC,KAAM,IAOxBhE,EANAiG,UAAAA,OAAS,IAAG,OAAI,EAChB9B,EAKAnE,EALAmE,kBACA+B,EAIAlG,EAJAkG,mBACA7B,EAGArE,EAHAqE,gBACAH,EAEAlE,EAFAkE,cACAD,EACAjE,EADAiE,eAEJ,EAA0CK,EAAWP,GAA7CQ,EAAQ,EAARA,SAAUC,EAAS,EAATA,UACZ9E,EAASwE,GAAiB3E,KAAKG,OAC/BgE,EAAUO,GAAkB1E,KAAKmE,QAEvC,GAAIuC,EAAYvB,EAAAA,GACZ,MAAM,IAAIyB,EACN,0EAIR,IAAM1B,EAAQ,GAAH,OAAMD,EAAS,YAAI9E,EAAM,YAAIgE,EAAO,YAAIgB,EAAAA,IAC7CZ,EAAUvE,KAAK6G,mBAAmBJ,EAAiB,CAAEE,mBAAAA,IAO3DpC,EAAQR,QAAQoB,EAAAA,IAAyBsB,EAAgBrB,SAGrDpF,KAAKoE,YAAYtD,eACjByD,EAAQgC,MAAMpB,EAAAA,IAAmCnF,KAAKoE,YAAYtD,cAKtEyD,EAAQgC,MAAMpB,EAAAA,IAAuCA,EAAAA,GACrDZ,EAAQgC,MACJpB,EAAAA,IACA,GAAH,OAAMnF,KAAKoE,YAAYzD,YAAW,YAAIuE,GACvCX,EAAQgC,MAAMpB,EAAAA,IAAkCH,EAChDT,EAAQgC,MAAMpB,EAAAA,IAAqCuB,EAAUI,SAAS,IAEtE,IAAMlB,EAAmB5F,KAAK6F,wBAC1BtB,EACAK,EACAE,GAEJP,EAAQgC,MAAMpB,EAAAA,IAA4CnB,OAAOC,KAAK2B,GACjEM,OACAC,KAAK,KAEV,IAAMY,EAAa/G,KAAKgG,iBAAiBhG,KAAKoE,YAAaD,EAAShE,EAAQ8E,GAStES,EAAc1F,KAAK2F,mBAAmBc,GACtCO,EAAmBhH,KAAKiG,uBAAuB1B,EAASqB,EAAkBF,GAEhFnB,EAAQgC,MAAMpB,EAAAA,IAAuCnF,KAAK+F,mBACtDf,EACAE,EACA6B,EACAC,GAIJ,IAAIZ,EAAM,GAAH,OAAM7B,EAAQ8B,SAAQ,cAAM9B,EAAQa,UAU3C,OATIb,EAAQ+B,OACRF,GAAO7B,EAAQ+B,MAIf/B,EAAQgC,QACRH,GAAO,IAAJ,OAAQpG,KAAKwG,yBAAyBjC,EAAQgC,SAG9C,EAAP,CAASH,IAAKA,GAAQ7B,EAC1B,GAEA,oCAYA,SACIA,EACAqB,EACAF,GAEA,IAAMuB,EAAgBjD,OAAOC,KAAK2B,GAAkBM,OAC9CgB,EAAyBD,EAC1BE,KAAI,SAAC5D,GAAI,gBAAQA,EAAI,YAAIqC,EAAiBrC,GAAK,IAC/C4C,KAAK,MACJiB,EAAgBH,EAAcd,KAAK,KAEzC,MACI,UAAG5B,EAAQ8C,OAAM,gBACdrH,KAAKsH,oBAAoB/C,GAAQ,MAAI,UACrCvE,KAAKuH,4BAA4BhD,GAAQ,MAAI,UAC7C2C,EAAsB,QAAM,UAC5BE,EAAa,MAAI,UACjB1B,EAEX,GAEA,gCAcA,SACIV,EACAwC,EACAR,GAEA,IAAMS,EAAyBC,IAAAA,OAAcV,EAAkB,OAE/D,MACI,UAAG7B,EAAAA,GAAsC,gBACtCH,EAAQ,MAAI,UACZwC,EAAe,MAAI,UACnBC,EAEX,GAEA,gCAYA,SACIzC,EACAwC,EACAT,EACAC,GAEA,IAAMW,EAAe3H,KAAK4H,mBAAmB5C,EAAUwC,EAAiBR,GACxE,OAAOU,IAAAA,KAAY,SAAUX,EAAYY,EAAc,MAC3D,GAEA,8BAiBA,SACIvD,EACAD,EACAhE,EACA8E,GAEA,IAAM4C,EAAkBzD,EAAYvD,gBAC9BiH,EAAaJ,IAAAA,KAAY,SAAU,OAASG,EAAS5C,EAAW,UAChE8C,EAAeL,IAAAA,KAAY,SAAUI,EAAO3H,EAAQ,UACpD6H,EAAgBN,IAAAA,KAAY,SAAUK,EAAS5D,EAAS,UAG9D,OAFsBuD,IAAAA,KAAY,SAAUM,EAAU,eAAgB,SAG1E,GAEA,iCAOA,YAA2D,IAA7B1B,EAAI,EAAJA,KAC1B,GAAItG,KAAKqE,cAAe,CAGpB,IAEwC,EAFlC4D,EAAwB,GAAE,IAEP3B,EAAK4B,MAAM,MAAI,IAAxC,IAAK,EAAL,qBAA0C,KAA/BC,EAAU,QACU,KAAvBA,aAAU,EAAVA,EAAYvH,UAIG,MAAfuH,IAIe,OAAfA,EACAF,EAAsBG,MAEtBH,EAAsBI,KAAKF,IAEnC,CAEA,+BACA,IAAMG,EAAUhC,SAAAA,EAAMiC,WAAW,KAAO,IAAM,GACxCC,EAAMP,EAAsB9B,KAAK,KACjCsC,EAAWR,EAAsBrH,OAAS,GAA/BqH,MAAoC3B,GAAAA,EAAMoC,SAAS,KAAO,IAAM,GAC3EC,EAAgB,GAAH,OAAML,GAAO,OAAGE,GAAG,OAAGC,GAIzC,OAFsBG,mBAAmBD,GAEpBE,QAAQ,OAAQ,IACzC,CAKA,OAAOvC,CACX,GAEA,yCAQA,YAAyE,IAI1B,EAJ0B,IAAnCC,MAAAA,OAAK,IAAG,GAAC,EAAC,EACtCtC,EAAsB,GACtB6E,EAAqC,CAAC,EAAC,cAGzC,GAAIC,EAAIhH,gBAAkBoD,EAAAA,GAAgC,iBAI1DlB,EAAKoE,KAAKU,GACV,IAAMC,EAAQzC,EAAMwC,GAEC,iBAAVC,EACPF,EAAWC,GAAO,GAAH,OAAME,EAAUF,GAAI,YAAIE,EAAUD,IAC1CE,MAAMC,QAAQH,KACrBF,EAAWC,GAAOC,EACbI,MAAM,GACNlD,OACAmD,QACG,SAACC,EAAwBN,GAAa,OAClCM,EAAQC,OAAO,CAAC,GAAD,OAAIN,EAAUF,GAAI,YAAIE,EAAUD,KAAU,GAC7D,IAEH7C,KAAK,KAElB,EAAC,IArBiBnC,OAAOC,KAAKsC,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOjC,EACFkD,KAAI,SAAC4B,GAAG,OAAKD,EAAWC,EAAI,IAC5BS,QAAO,SAACV,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,GAEA,qCAUA,WAEIvB,EACAE,GACa,IAGuC,EANlDf,EAAO,EAAPA,QAII6B,EAAkC,CAAC,EAAC,IAEjB5B,OAAOC,KAAKF,GAASmC,QAAM,IAApD,IAAK,EAAL,qBAAsD,KAA3Cb,EAAU,QACjB,GAA2BpF,MAAvB8D,EAAQsB,GAAZ,CAIA,IAAMoE,EAAsBpE,EAAWtD,eAEnC0H,KAAuBtE,EAAAA,IACvBP,SAAAA,EAAmB8E,IAAID,OAGlB3E,GACAA,IAAoBA,EAAgB4E,IAAID,MAMjD7D,EAAiB6D,GAAuB1F,EAAQsB,GAAYsE,OAAOd,QAAQ,OAAQ,KAfnF,CAgBJ,CAAC,+BAED,OAAOjD,CACX,GAEA,gCAWA,YAAmE,IAAtC7B,EAAO,EAAPA,QAASyB,EAAI,EAAJA,KASlC,OAAIzB,EAAQoB,EAAAA,IACDpB,EAAQoB,EAAAA,IAGPlF,MAARuF,EACOL,EAAAA,GAGS,iBAATK,IAAqBoE,EAAAA,EAAAA,GAAcpE,GACnCkC,IAAAA,OAAclC,EAAM,OAAOzD,cAGlCuD,YAAYC,OAAOC,GAGZkC,IAAAA,OAAelC,EAAkBC,OAAQ,OAAO1D,cAGpDoD,EAAAA,EACX,GAEA,gCAaA,SACIZ,GAMA,IAJ0C,IAD1C9D,EAAgD,UAAH,6CAAG,CAAC,EAE3CoJ,EAAcC,KAAKC,MAAMD,KAAKE,UAAUzF,IACtCR,EAA6C8F,EAA7C9F,QAAO,EAAsC8F,EAApCtD,MAAAA,OAAK,IAAG,GAAC,EAAC,EAE3B,MAAmBvC,OAAOC,KAAKF,GAAQ,eAAE,OAA9BR,EAAI,KACL0G,EAAgB1G,EAAKxB,cAEO,WAA9BkI,EAAcb,MAAM,EAAG,IACI,QAA3B,EAAC3I,EAAQkG,0BAAkB,OAA1B,EAA4B+C,IAAIO,KAEjC1D,EAAMhD,GAAQQ,EAAQR,UACfQ,EAAQR,GAEvB,CAEA,OAAO,EAAP,KACOsG,GAAW,IACd9F,QAAAA,EACAwC,MAAAA,GAER,GAEA,sCAOA,SAAiCA,EAA0B2D,GACvD,IAG2C,EAHrCjG,EAAsB,GACtB6E,EAAqC,CAAC,EAAC,cAGzC,GAAIoB,SAAAA,EAAYC,SAASpB,EAAIhH,eAAgB,iBAI7CkC,EAAKoE,KAAKU,GACV,IAAMC,EAAQzC,EAAMwC,GAEC,iBAAVC,EACPF,EAAWC,GAAO,GAAH,OAAME,EAAUF,GAAI,YAAIE,EAAUD,IAC1CE,MAAMC,QAAQH,KACrBF,EAAWC,GAAOC,EACbI,MAAM,GACNlD,OACAmD,QACG,SAACC,EAAwBN,GAAa,OAClCM,EAAQC,OAAO,CAAC,GAAD,OAAIN,EAAUF,GAAI,YAAIE,EAAUD,KAAU,GAC7D,IAEH7C,KAAK,KAElB,EAAC,IArBiBnC,OAAOC,KAAKsC,GAAOL,QAAM,IAA3C,IAAK,EAAL,qBAAc,UAqBb,+BAED,OAAOjC,EACFkD,KAAI,SAAC4B,GAAG,OAAKD,EAAWC,EAAI,IAC5BS,QAAO,SAACV,GAAU,OAAKA,CAAU,IACjC3C,KAAK,IACd,KAAC,EAlmBmB,GA6mBXS,EAAqB,a,qRAAA,iBAM9B,WAAYxF,EAAiBkC,GAAe,MAEL,OAFK,WACxC,cAAMlC,EAASkC,IACVC,KAAO,wBAAuB,CACvC,CAAC,YAT6B,CAASF,EAAAA,GA+I3C,SAAS4F,EAAUT,GAKf,OAAOI,mBAAmBJ,GAAKK,QAAQ,YAJrB,SAACuB,GACf,MAAO,IAAP,OAAWA,EAAEC,WAAW,GAAGvD,SAAS,IAAIwD,cAC5C,GAGJ,CASA,SAASvF,EAAWwF,GAChB,IAeaC,EAfPxF,GAeOwF,EAfYD,EA2B7B,SAAgBC,GACZ,MAAoB,iBAATA,EACA,IAAI/F,KAAY,IAAP+F,GAGA,iBAATA,EACHC,OAAOD,GACA,IAAI/F,KAAoB,IAAfgG,OAAOD,IAGpB,IAAI/F,KAAK+F,GAGbA,CACX,CAzBWE,CAAOF,GACTG,cACA9B,QAAQ,YAAa,MAlBKA,QAAQ,SAAU,IACjD,MAAO,CACH7D,SAAAA,EACAC,UAAWD,EAASoE,MAAM,EAAG,GAErC,C,4BC7xBO,SAASQ,EAAcZ,GAC1B,MAC2B,mBAAhB1D,cACN0D,aAAiB1D,aAC4B,yBAA1CtB,OAAO4G,UAAU9D,SAAS+D,KAAK7B,GAE3C,CAEO,SAAS8B,EAAiBC,GAC7B,OAAO/G,OAAOC,KAAK8G,GAAM1B,QAAO,SAAC2B,EAAQjC,GACrC,IAAIC,EAAQ+B,EAAKhC,GAIjB,OAHIC,SACAgC,EAAO3C,KAAK,GAAD,OAAIO,mBAAmBG,GAAI,YAAIH,mBAAmBI,KAE1DgC,CACX,GAAG,IAAgB7E,KAAK,IAC5B,C,m9FCbA,IAAM8E,EAAc,aAEPC,EAAS,8BAIlB,WAAYpL,GAAsB,MAiB7B,OAjB6B,UACP,IAAvB,cAAMA,EAAW,QAAM,mDAEvB,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQ,EAAKL,UAAUK,OACvBiE,YAAa,CACTzD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCuD,eAAe,EACfC,eAAe,IAGnB,EAAK6G,cAAgB,CACjB,eAAgB,qCACnB,CACL,CA2IC,OAzID,8BAUA,SAAYC,EAAkBC,GAAyG,IAApF5K,EAAuE,UAAH,6CAAG,CAAC,EACjH4G,EAAS,OAEX7B,EAAY,CACZ8F,OAAQ,cACRC,QAASN,EACTO,SAAUJ,EACVK,YAAaJ,QAG8B,IAApC5K,EAAQiL,yBACflG,EAAO,EAAH,KAAQA,GAAI,IACZmG,uBAAwBlL,EAAQiL,+BAID,IAA5BjL,EAAQmL,iBACfpG,EAAO,EAAH,KAAQA,GAAI,IACZqG,eAAgBpL,EAAQmL,kBAIhC,IAAME,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,OACRhB,SAAU,QACVjB,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,GACA/D,KAAKmL,eAEZ3F,MAAMsF,EAAAA,EAAAA,GAAiBtF,IAE3B,CAAC,GAGCwG,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKkM,aAAa,cAAeF,GAEjC,IAAMG,EAASH,EAAII,KAAK,2CACxB,OAAO,IAAIC,EACPF,EAAOxI,KAAK,aAAaC,OACzBuI,EAAOxI,KAAK,oBAAoBC,OAExC,GAEA,wBAWA,WAA6E,IAAlE0I,EAA0C,UAAH,6CAAG,CAAC,EAC5CjF,EAAS,OAEX7B,EAAY,CACZ8F,OAAQ,aACRC,QAASN,QAG0B,KAA5BqB,aAAU,EAAVA,EAAYC,cACnB/G,EAAO,EAAH,KAAQA,GAAI,IACZgH,WAAYF,EAAWC,mBAIO,KAA3BD,aAAU,EAAVA,EAAYG,aACnBjH,EAAO,EAAH,KAAQA,GAAI,IACZkH,UAAWJ,EAAWG,kBAIc,KAAjCH,aAAU,EAAVA,EAAYK,mBACnBnH,EAAO,EAAH,KAAQA,GAAI,IACZoH,gBAAiBN,EAAWK,mBAIpC,IAAMb,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,OACRhB,SAAU,QACVjB,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,KACA/D,KAAKmL,eAAa,IACrB,KAAQnL,KAAKK,OAEjBmF,MAAMsF,EAAAA,EAAAA,GAAiBtF,IAE3B,CAAC,GAGCwG,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKkM,aAAa,aAAcF,GAEhC,IAAIG,EAASH,EAAII,OACjB,MAAO,CACHS,KAAMV,EAAOxI,KAAK,YAAYmJ,UAAU3F,KAAI,SAAA4F,GAAC,OAAIA,EAAEnJ,MAAM,IACzD6I,UAAWN,EAAOxI,KAAK,aAAaC,aAAU3D,EAEtD,GAAC,0BAED,SAAqB+M,EAAyBC,GAC1C,IAAMC,EAAoBD,EAASE,WAGnC,GAAoB,IAFSF,EAASG,OAEE,IAAdF,EAA1B,CAIA,IAAMG,EAAWhK,EAAAA,EAAAA,SAAkB4J,EAASzH,MAC5C,GACS,iCADD6H,EAAS/J,KAET,MAAM,IAAIsD,EAAAA,EAAsByG,EAASjM,QAASiM,EAAS/J,MAE3D,MAAM,IAAIgK,EAAgBD,EAASjM,QAASiM,EAAS/J,MAAQ,UAAW0J,EAPhF,CASJ,KAAC,EAjKiB,CAASnN,EAAAA,GAuKlBwM,EAAO,GAkBhB,WAAYkB,EAAYC,GAAiB,uDACrCxN,KAAKuN,GAAKA,EACVvN,KAAKwN,QAAUA,CACnB,IAMSF,EAAe,8BAGxB,WAAYlM,EAAiBkC,EAAc0J,GAAyB,MAGtC,OAHsC,UAC5C,IAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,kBACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,YAPuB,CAAS3J,EAAAA,E,gBC5MrC,IAAIoK,EAAK,EAAQ,KACbC,EAAK,EAAQ,KAEbC,EAAOD,EACXC,EAAKF,GAAKA,EACVE,EAAKD,GAAKA,EAEVE,EAAOC,QAAUF,C,UCFjB,IADA,IAAIG,EAAY,GACPC,EAAI,EAAGA,EAAI,MAAOA,EACzBD,EAAUC,IAAMA,EAAI,KAAOjH,SAAS,IAAIkH,OAAO,GAmBjDJ,EAAOC,QAhBP,SAAqBI,EAAKC,GACxB,IAAIH,EAAIG,GAAU,EACdC,EAAML,EAEV,MAAO,CACLK,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MACvBI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MAAO,IAC9BI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MACvBI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,MACvBI,EAAIF,EAAIF,MAAOI,EAAIF,EAAIF,OACtB5H,KAAK,GACV,C,UChBA,IAAIiI,EAAqC,oBAAZ,QAA2B1G,OAAO0G,iBAAmB1G,OAAO0G,gBAAgBC,KAAK3G,SACnE,oBAAd,UAAuE,mBAAnC4G,OAAOC,SAASH,iBAAiCG,SAASH,gBAAgBC,KAAKE,UAEhJ,GAAIH,EAAiB,CAEnB,IAAII,EAAQ,IAAIC,WAAW,IAE3Bb,EAAOC,QAAU,WAEf,OADAO,EAAgBI,GACTA,CACT,CACF,KAAO,CAKL,IAAIE,EAAO,IAAIxF,MAAM,IAErB0E,EAAOC,QAAU,WACf,IAAK,IAAWc,EAAPZ,EAAI,EAAMA,EAAI,GAAIA,IACN,IAAV,EAAJA,KAAiBY,EAAoB,WAAhBC,KAAKC,UAC/BH,EAAKX,GAAKY,MAAY,EAAJZ,IAAa,GAAK,IAGtC,OAAOW,CACT,CACF,C,gBCjCA,IAQII,EACAC,EATAC,EAAM,EAAQ,KACdC,EAAc,EAAQ,KAWtBC,EAAa,EACbC,EAAa,EA+FjBvB,EAAOC,QA5FP,SAAYpN,EAASwN,EAAKC,GACxB,IAAIH,EAAIE,GAAOC,GAAU,EACrBkB,EAAInB,GAAO,GAGXoB,GADJ5O,EAAUA,GAAW,CAAC,GACH4O,MAAQP,EACvBQ,OAAgCrP,IAArBQ,EAAQ6O,SAAyB7O,EAAQ6O,SAAWP,EAKnE,GAAY,MAARM,GAA4B,MAAZC,EAAkB,CACpC,IAAIC,EAAYP,IACJ,MAARK,IAEFA,EAAOP,EAAU,CACA,EAAfS,EAAU,GACVA,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,GAAIA,EAAU,KAGtD,MAAZD,IAEFA,EAAWP,EAAiD,OAApCQ,EAAU,IAAM,EAAIA,EAAU,IAE1D,CAMA,IAAIC,OAA0BvP,IAAlBQ,EAAQ+O,MAAsB/O,EAAQ+O,OAAQ,IAAI/K,MAAOgL,UAIjEC,OAA0BzP,IAAlBQ,EAAQiP,MAAsBjP,EAAQiP,MAAQP,EAAa,EAGnEQ,EAAMH,EAAQN,GAAeQ,EAAQP,GAAY,IAcrD,GAXIQ,EAAK,QAA0B1P,IAArBQ,EAAQ6O,WACpBA,EAAWA,EAAW,EAAI,QAKvBK,EAAK,GAAKH,EAAQN,SAAiCjP,IAAlBQ,EAAQiP,QAC5CA,EAAQ,GAINA,GAAS,IACX,MAAM,IAAIrO,MAAM,mDAGlB6N,EAAaM,EACbL,EAAaO,EACbX,EAAYO,EAMZ,IAAIM,GAA4B,KAAb,WAHnBJ,GAAS,cAG+BE,GAAS,WACjDN,EAAErB,KAAO6B,IAAO,GAAK,IACrBR,EAAErB,KAAO6B,IAAO,GAAK,IACrBR,EAAErB,KAAO6B,IAAO,EAAI,IACpBR,EAAErB,KAAY,IAAL6B,EAGT,IAAIC,EAAOL,EAAQ,WAAc,IAAS,UAC1CJ,EAAErB,KAAO8B,IAAQ,EAAI,IACrBT,EAAErB,KAAa,IAAN8B,EAGTT,EAAErB,KAAO8B,IAAQ,GAAK,GAAM,GAC5BT,EAAErB,KAAO8B,IAAQ,GAAK,IAGtBT,EAAErB,KAAOuB,IAAa,EAAI,IAG1BF,EAAErB,KAAkB,IAAXuB,EAGT,IAAK,IAAIQ,EAAI,EAAGA,EAAI,IAAKA,EACvBV,EAAErB,EAAI+B,GAAKT,EAAKS,GAGlB,OAAO7B,GAAYgB,EAAYG,EACjC,C,gBC1GA,IAAIJ,EAAM,EAAQ,KACdC,EAAc,EAAQ,KA2B1BrB,EAAOC,QAzBP,SAAYpN,EAASwN,EAAKC,GACxB,IAAIH,EAAIE,GAAOC,GAAU,EAEF,iBAAb,IACRD,EAAkB,WAAZxN,EAAuB,IAAIyI,MAAM,IAAM,KAC7CzI,EAAU,MAIZ,IAAIiO,GAFJjO,EAAUA,GAAW,CAAC,GAEHoO,SAAWpO,EAAQuO,KAAOA,KAO7C,GAJAN,EAAK,GAAgB,GAAVA,EAAK,GAAa,GAC7BA,EAAK,GAAgB,GAAVA,EAAK,GAAa,IAGzBT,EACF,IAAK,IAAI8B,EAAK,EAAGA,EAAK,KAAMA,EAC1B9B,EAAIF,EAAIgC,GAAMrB,EAAKqB,GAIvB,OAAO9B,GAAOgB,EAAYP,EAC5B,C,uBC1BAd,EAAOC,QAAUmC,QAAQ,Y,uBCAzBpC,EAAOC,QAAUmC,QAAQ,U,uBCAzBpC,EAAOC,QAAUmC,QAAQ,U,GCCrBC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBlQ,IAAjBmQ,EACH,OAAOA,EAAavC,QAGrB,IAAID,EAASqC,EAAyBE,GAAY,CAGjDtC,QAAS,CAAC,GAOX,OAHAwC,EAAoBF,GAAUvC,EAAQA,EAAOC,QAASqC,GAG/CtC,EAAOC,OACf,CCrBAqC,EAAoBJ,EAAKlC,IACxB,IAAI0C,EAAS1C,GAAUA,EAAO2C,WAC7B,IAAO3C,EAAiB,QACxB,IAAM,EAEP,OADAsC,EAAoBM,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdJ,EAAoBM,EAAI,CAAC3C,EAAS6C,KACjC,IAAI,IAAI3H,KAAO2H,EACXR,EAAoBS,EAAED,EAAY3H,KAASmH,EAAoBS,EAAE9C,EAAS9E,IAC5E/E,OAAO4M,eAAe/C,EAAS9E,EAAK,CAAE8H,YAAY,EAAMC,IAAKJ,EAAW3H,IAE1E,ECNDmH,EAAoBS,EAAI,CAACI,EAAKC,IAAUhN,OAAO4G,UAAUqG,eAAepG,KAAKkG,EAAKC,GCClFd,EAAoBvB,EAAKd,IACH,oBAAXqD,QAA0BA,OAAOC,aAC1CnN,OAAO4M,eAAe/C,EAASqD,OAAOC,YAAa,CAAEnI,MAAO,WAE7DhF,OAAO4M,eAAe/C,EAAS,aAAc,CAAE7E,OAAO,GAAO,E,i5GCQvD,IA0NFoI,EAQAC,EAlOQC,EAAS,8BAUlB,WAAYxR,GAAsB,MAoB7B,OApB6B,UACP,IAAvB,cAAMA,EAAW,QAAM,2EAEvB,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQL,EAAUK,OAClBiE,YAAa,CACTzD,YAAab,EAAUa,YACvBE,gBAAiBf,EAAUe,iBAE/BwD,eAAe,EACfC,eAAe,IAKnB,EAAK+C,OAAS,OAEd,EAAK8D,cAAgB,CACjB,eAAgB,8BACnB,CACL,CAyGC,OAvGD,2BAMA,WACI,IAAMW,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,KACA/D,KAAKmL,eAAa,QAEpBlJ,EAAAA,GAAiB,0BAEtBuD,KAAMsE,KAAKE,UAAU,CAAC,IAE1B,CAAC,GAGCgC,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAK3B,OAHA/D,KAAKuR,cAAcH,EAAaI,SAAUxF,GAElBA,EAAIyF,KAAK,QACrBtK,KAAI,SAACuK,GAAC,OAAKC,EAAOC,SAASF,EAAgB,GAC3D,GAEA,6BAiBA,SAAgBnE,GAA2E,IAA/DsE,EAAmB,UAAH,6CAAGR,EAAWS,QAChDhG,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,EAAF,KACA/D,KAAKmL,eAAa,QAEpBlJ,EAAAA,GAAiB,iCAEtBuD,KAAMsE,KAAKE,UAAU,CAAE+H,MAAOxE,EAAIyE,cAAeH,KAErD,CAAC,GAGC7F,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAcH,EAAaa,gBAAiBjG,GAE1CkG,EAAWN,SAAS5F,EAAIyF,OACnC,GAAC,2BAED,SAAczE,EAAyBC,GACnC,IAAMC,EAAYD,EAASE,WAC3B,GAAkB,IAAdD,EAAJ,CAIA,IAAME,EAAQH,EAASwE,OACvB,GAAIvE,GAAa,MAAQA,GAAa,KAAM,CAGxC,IAAMiF,EACD/E,EAAMf,SAAuBe,EAAMhM,SAAuBgM,EAAMgF,OAGrE,GAAqB,8BAAjBhF,EAAMgF,OACN,MAAM,IAAIxL,EAAAA,EAAsBuL,EAAc/E,EAAMgF,QAIxD,MAAM,IAAIC,EAAgBF,EAAc/E,EAAMgF,OAAkBpF,EACpE,CAEA,GAAkB,OAAdE,EACA,MAAM,IAAImF,EACN,sCACA,uBACArF,EAtBR,CAyBJ,KAAC,EAxIiB,CAASnN,EAAAA,GA8IlB8R,EAAM,WAWf,WAAYW,EAAgBP,GAAe,yDACvC/R,KAAKsS,OAASA,EACdtS,KAAKuS,MAAQR,CACjB,CAIC,OAJA,gCAED,SAAgBN,GACZ,OAAO,IAAIE,EAAOF,EAAKe,OAAkBf,EAAKM,MAClD,KAAC,EAlBc,GAwBNG,EAAU,WAiBnB,WAAYO,EAAwBV,EAAeW,GAAmB,yFAClE1S,KAAK2S,eAAiBF,EACtBzS,KAAKuN,GAAKwE,EACV/R,KAAK4S,UAAYF,CACrB,CAQC,OARA,gCAED,SAAgBjB,GACZ,OAAO,IAAIS,EACPT,EAAKgB,eACLhB,EAAKM,MACLN,EAAKiB,UAEb,KAAC,EA7BkB,GAgCVL,EAAe,8BAUxB,WAAYjR,EAAiBkC,EAAc0J,GAAyB,MAGtC,OAHsC,UAC5C,IAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,kBACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,YAduB,CAAS3J,EAAAA,IAyBrC,SALK+N,GAAAA,EAAY,kCAAZA,EAAY,oBAKjB,CALKA,IAAAA,EAAY,KAQF,SAAVC,GAAAA,EAAAA,EAAU,sBAAVA,EAAAA,EAAU,uBAAVA,IAAAA,EAAU,K,oxECnOR,IAAMwB,EAAQ,8BAQjB,WAAY/S,GAAsB,MAa5B,OAb4B,UACR,IAAtB,cAAMA,EAAW,OAAK,oBAEtB,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQ,EAAKL,UAAUK,OACvBiE,YAAa,CACTzD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCuD,eAAe,EACfC,eAAe,IACjB,CACN,CA4aC,OA1aD,8BASA,WACI,IAEMwH,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,MACRhB,SAAUrG,KAAKO,OACf6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAbG,MAakBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,cAAevF,GAElC,IAAI8G,EAA2B,GAwB/B,OAtBYpP,EAAAA,EAAAA,WAAUsI,EAAIxG,MAEtB7B,KAAK,WACJoP,WACAC,MAAK,SAACC,EAAGC,GACN,IAAIC,EAAS,CAAC,EAEdD,EAAiBH,WAAWK,SAAQ,SAACC,GACjC,OAAQA,EAAMC,YACV,IAAK,OACDtP,OAAOuP,OAAOJ,EAAQ,CAAE5P,KAAM8P,EAAMG,gBACpC,MACJ,IAAK,eACDxP,OAAOuP,OAAOJ,EAAQ,CAClBM,aAAchP,KAAKsF,MAAMsJ,EAAMG,iBAG/C,IAEAV,EAAQzK,KAAK8K,EACjB,IAEGL,CACX,GAEA,yBAUA,SAAYY,EAAoBC,GAE5B,IACMtT,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAmC9L,KAAK8F,UAAUiG,KACpD,CACI1E,OAAQ,MACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,KACpBnN,MAAO,CACH,YAAa,IACboN,OAAQA,GAAU,IAEtB5P,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAlBG,MAkBkBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,gBAAiBvF,GAEpC,IAAI4H,EAA2B,GA+B/B,OA3BAlQ,EAAAA,EAAAA,WAAUsI,EAAIxG,MACT7B,KAAK,YACLqP,MAAK,SAACC,EAAGY,GACN,IAAI9C,EAAM,CAAC,EAEX8C,EAAiBd,WAAWK,SAAQ,SAACC,GACjC,OAAQA,EAAMC,YACV,IAAK,MACDtP,OAAOuP,OAAOxC,EAAK,CAAEhI,IAAKsK,EAAMG,gBAChC,MACJ,IAAK,eACDxP,OAAOuP,OAAOxC,EAAK,CAAE+C,aAAcrP,KAAKsF,MAAMsJ,EAAMG,iBACpD,MACJ,IAAK,OACDxP,OAAOuP,OAAOxC,EAAK,CAAEgD,KAAMV,EAAMG,gBACjC,MACJ,IAAK,OACDxP,OAAOuP,OAAOxC,EAAK,CAAEc,KAAMmC,SAASX,EAAMG,iBAC1C,MACJ,IAAK,eACDxP,OAAOuP,OAAOxC,EAAK,CAAEkD,aAAcZ,EAAMG,gBAErD,IAEAI,EAAQvL,KAAK0I,EACjB,IAEG6C,CACX,GACA,uBAWA,SAAUF,EAAoBQ,GAA6B,MAGjD7T,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQ,MACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,YAAIQ,GACxBnQ,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAdG,MAckBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc,YAAavF,GAEzB,IAAImI,EACPD,EACAzP,KAAKsF,MAAMiC,EAAIjI,QAAQ,kBACvBiI,EAAIjI,QAAc,KAClBiQ,SAAShI,EAAIjI,QAAQ,mBAIc,QADnC,EACCiI,EAAIjI,QAAQ,8BAAsB,QAAI,WAEvCiI,EAAIxG,KAEZ,GACA,uBAWA,SAAUkO,EAAoBQ,EAAmBE,GAE7C,IACM/T,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OALO,MAMPhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,YAAIQ,GACxBnQ,QAAS,CACLsQ,KAAMhU,GAEVmF,KAAM4O,GAEV,CAAC,GAGCpI,EAAMC,IAAAA,QAjBG,MAiBkBH,EAAc1F,IAAK0F,EAActG,KAAM,CACpEzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,YAAavF,EACpC,GAEA,0BASA,SAAa0H,EAAoBQ,GAE7B,IAAM7M,EAAS,SACThH,EAAO,GAAH,OAAML,KAAKK,MAEfyL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAMoN,EAAU,YAAIQ,GACxBnQ,QAAS,CAAC,GAEd,CAAC,GAGCiI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,eAAgBvF,EACvC,GAEA,mCAUA,SAAsB0H,EAAoBQ,GAEtC,IAAM7M,EAAS,OACThH,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAE7ByL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,GACVnQ,QAAS,CAAC,EACVwC,MAAO,CAAE+N,QAAS,KAEtB,CAAC,GAGCtI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc,wBAAyBvF,GAErC,IAAIuI,EACPL,GACAxQ,EAAAA,EAAAA,WAAUsI,EAAIxG,MACT7B,KAAK,YACLC,OAEb,GAEA,wBAUA,SACI8P,EACAQ,EACAM,EACAC,EACAL,GAGA,IACM/T,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAC7ByL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAJO,MAKPhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,GACVnQ,QAAS,CAAC,EACVyB,KAAM4O,EACN7N,MAAO,CACHkO,WAAY,GAAF,OAAKA,GACfD,SAAU,GAAF,OAAKA,KAGrB,CAAC,GAGCxI,EAAMC,IAAAA,QAlBG,MAkBkBH,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc,aAAcvF,GAE1B,IAAI0I,EAAOD,EAAYzI,EAAIjI,QAAc,KACpD,GAEA,qCAUA,SACI2P,EACAQ,EACAM,EACAG,GAGA,IAAMtN,EAAS,OACThH,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAC7BmF,EAAO,4BAAH,OAA+BmP,EACpCxN,KACG,SAACyN,GAAI,kCACoBA,EAAKH,WAAU,8BAAsBG,EAAKC,KAAI,qBAE1E1O,KAAK,IAAG,8BACP2F,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,GACVnQ,QAAS,CAAC,EACVyB,KAAMA,EACNe,MAAO,CACHiO,SAAU,GAAF,OAAKA,KAGrB,CAAC,GAGCxI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAG3B/D,KAAKuR,cAAc,0BAA2BvF,EAClD,GAEA,kCASA,SAAqB0H,EAAoBQ,EAAmBM,GAExD,IAAMnN,EAAS,SACThH,EAAO,GAAH,OAAMqT,EAAU,YAAI1T,KAAKK,MAC7ByL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQA,EACRhB,SAAUrG,KAAKO,OACf6E,SAAU/E,EACViG,KAAM,IAAF,OAAM4N,GACVnQ,QAAS,CAAC,EACVwC,MAAO,CACHiO,SAAU,GAAF,OAAKA,KAGrB,CAAC,GAGCxI,EAAMC,IAAAA,QAAa5E,EAAQyE,EAAc1F,IAAK0F,EAActG,MAAQ,GAAI,CAC1EzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc,uBAAwBvF,EAC/C,GAAC,2BAED,SAAcgB,EAAwBC,GAClC,IAAM6H,EAAiB7H,EAAS6H,OAC1B5H,EAAoBD,EAASE,WAC7BgF,EAAuBlF,EAASG,MAGtC,KAAI0H,GAAU,KAAOA,EAAS,KAAuB,IAAhB3C,GAAoC,IAAdjF,GAA3D,CAUA,GAAc,KAAV4H,GAAkB3C,GAAgBA,EAAa5J,WAAW,OAC1D,MAAM,IAAIwM,EAAe,qBAAsB,mBAAoB/H,GAGvE,IAAMK,EAAWhK,EAAAA,EAAAA,SAAkB4J,EAASzH,MAC5C,GACS,iCADD6H,EAAS/J,KAET,MAAM,IAAIsD,EAAAA,EAAsByG,EAASjM,QAASiM,EAAS/J,MAE3D,MAAM,IAAIyR,EAAe1H,EAASjM,QAASiM,EAAS/J,MAAQ,UAAW0J,EAjB/E,CAmBJ,KAAC,EAlcgB,CAASnN,EAAAA,GAscjBmV,EAAQ,GAUjB,WAAYzR,EAAckQ,GAAoB,8DAC1CzT,KAAKuD,KAAOA,EACZvD,KAAKyT,aAAeA,CACxB,IAISU,EAAQ,GAkBjB,WACIpL,EACA+K,EACAC,EACAlC,EACAoC,EACAG,GACF,6JACEpU,KAAK+I,IAAMA,EACX/I,KAAK8T,aAAeA,EACpB9T,KAAK+T,KAAOA,EACZ/T,KAAK6R,KAAOA,EACZ7R,KAAKiU,aAAeA,EACpBjU,KAAKoU,KAAOA,CAChB,IAISG,EAAiB,GAU1B,WAAYxL,EAAayL,GAAkB,yDACvCxU,KAAK+I,IAAMA,EACX/I,KAAKwU,SAAWA,CACpB,IAISE,EAAM,GAUf,WAAYD,EAAoBI,GAAc,4DAC1C7U,KAAKyU,WAAaA,EAClBzU,KAAK6U,KAAOA,CAChB,IAWSE,EAAc,8BAUvB,WAAY3T,EAAiBkC,EAAc0J,GAAmB,MAGhC,OAHgC,UACtC,IAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,iBACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,YAdsB,CAAS3J,EAAAA,G,o2FCliB7B,IAsXF4R,GAtXQC,GAAoB,gCAiB7B,WAAYpV,GAAsB,MAoB7B,OApB6B,UACI,MAAlC,cAAMA,EAAW,mBAAiB,+EAElC,EAAKgG,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQ,EAAKL,UAAUK,OACvBiE,YAAa,CACTzD,YAAa,EAAKb,UAAUa,YAC5BE,gBAAiB,EAAKf,UAAUe,gBAChCC,aAAc,EAAKhB,UAAUgB,cAEjCuD,eAAe,EACfC,eAAe,IAKnB,EAAK+C,OAAS,OACd,EAAK8D,cAAgB,CACjB,eAAgB,8BACnB,CACL,CAyPC,OAvPD,+BAQA,WACI,IAAMW,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,kBAE5CyF,KAAMsE,KAAKE,UAAU,CAAC,IAE1B,CAAC,GAGCgC,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAK3B,OAHA/D,KAAKuR,cAAc0D,GAAwBE,YAAanJ,GAChCA,EAAIyF,KAAK,cAErBtK,KAAI,SAACiO,GAAC,OAAKC,GAAOzD,SAASwD,EAAgB,GAC3D,GAEA,uBAQA,SAAU7H,GACN,IAAMzB,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,qBAE5CyF,KAAMsE,KAAKE,UAAU,CAAEsL,SAAU/H,KAErC,CAAC,GAGCvB,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAK3B,OAFA/D,KAAKuR,cAAc0D,GAAwBM,eAAgBvJ,GAEpDqJ,GAAOzD,SAAS5F,EAAIyF,OAC/B,GAEA,0BAkBA,SACIlO,EACAiS,EACAC,EACAC,EACAC,GAEAD,EAAYA,IAAaE,EAAAA,EAAAA,MAEzB,IAAM9J,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,mBAE5CyF,KAAMsE,KAAKE,UAAU,CACjB6L,KAAMtS,EACNuS,YAAaL,EACbM,aAAcP,EACdQ,mBAAoBN,EACpBO,KAAMN,KAGd,CAAC,GAOC3J,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc0D,GAAwBiB,aAAclK,GAElDqJ,GAAOzD,SAAS5F,EAAIyF,OAC/B,GACA,4BAYA,SAAelE,EAAYiI,EAAgBE,GACvCA,EAAYA,IAAaE,EAAAA,EAAAA,MAEzB,IAAM9J,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,qBAE5CyF,KAAMsE,KAAKE,UAAU,CACjBsL,SAAU/H,EACVwI,aAAcP,EACdQ,mBAAoBN,KAG5B,CAAC,GAGC1J,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc0D,GAAwBkB,eAAgBnK,GAEpDqJ,GAAOzD,SAAS5F,EAAIyF,OAC/B,GAEA,0BAYA,SACIlE,EAAU,GAEZ,QADI6I,eAAAA,OAAc,IAAG,KAAE,MAAEC,WAEjBC,EAAwD,CAC1DhB,SAAU/H,IAIK,UAPc,IAAG,GAAK,GAQrC+I,EAAoC,4BAAI,EAExCA,EAA8B,qBAAIF,EAGtC,IAAMtK,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,OACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,UAAMjC,KAAKD,YAAW,mBAE5CyF,KAAMsE,KAAKE,UAAUsM,IAEzB,CAAC,GAGCtK,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAE3B/D,KAAKuR,cAAc0D,GAAwBsB,aAAcvK,EAC7D,GAAC,2BAED,SACIgB,EACAC,GAEA,IAAMC,EAAYD,EAASE,WAC3B,GAAkB,IAAdD,EAAJ,CAIA,IAAME,EAAQH,EAASwE,OACvB,GAAIvE,GAAa,MAAQA,GAAa,KAAM,CAGxC,IAAMiF,EACD/E,EAAMf,SAAuBe,EAAMhM,SAAuBgM,EAAMgF,OAGrE,GAAqB,8BAAjBhF,EAAMgF,OACN,MAAM,IAAIxL,EAAAA,EAAsBuL,EAAc/E,EAAMgF,QAIxD,MAAM,IAAIoE,GAA2BrE,EAAc/E,EAAMgF,OAAkBpF,EAC/E,CAEA,GAAkB,OAAdE,EACA,MAAM,IAAIsJ,GACN,sCACA,uBACAxJ,EAtBR,CAyBJ,KAAC,EA/R4B,CAASnN,EAAAA,GAuS7BwV,GAAM,WAoBf,WACI9R,EACAkT,EACAC,EACAC,EACAC,EACAC,GAEF,IADElB,EAAyC,UAAH,6CAAG,GAAE,0MAE3C3V,KAAKuD,KAAOA,EACZvD,KAAKyW,IAAMA,EACXzW,KAAKwV,OAASkB,EACd1W,KAAK2W,YAAcA,EACnB3W,KAAK4W,iBAAmBA,EACxB5W,KAAK6W,gBAAkBA,EACvB7W,KAAK2V,KAAOA,CAChB,CAoBC,OAlBD,iCAQA,SAAgBlE,GACZ,OAAO,IAAI4D,EACP5D,EAAKoE,KACLpE,EAAKqF,IACLrF,EAAKsE,aACLtE,EAAKsF,YACLtF,EAAKuF,iBACLvF,EAAKwF,gBACLxF,EAAKwE,KAEb,KAAC,EAxDc,GA2DNO,GAA0B,gCAUnC,WAAYpV,EAAiBkC,EAAc0J,GAAoC,MAGjD,OAHiD,UACvD,MAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,6BACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,aAdkC,CAAS3J,EAAAA,G,22FAoBpB,SAAvB4R,GAAAA,EAAuB,0BAAvBA,EAAuB,gCAAvBA,EAAuB,4BAAvBA,EAAuB,gCAAvBA,EAAuB,6BAAvBA,KAAAA,GAAuB,KCvXrB,IA4OFiC,GA5OQC,GAAoB,gCAS7B,WAAYrX,GAAsB,MAmB5B,OAnB4B,WAI9B,MAHA,cAAMA,EAAW,QAGjB,+EACA,EAAKuH,OAAS,OACd,EAAK8D,cAAgB,CACjB,eAAgB,8BAGpB,EAAKrF,UAAY,IAAI5B,EAAAA,EAAY,CAC7BC,QAAS,EAAKpE,YACdI,OAAQL,EAAUK,OAClBiE,YAAa,CACTzD,YAAab,EAAUa,YACvBE,gBAAiBf,EAAUe,iBAE/BwD,eAAe,EACfC,eAAe,IACjB,CACN,CAsEC,OApED,gCASA,SACIf,GAEmC,IADnC6T,EAA0B,UAAH,8CAEjBtL,EAAgB9L,KAAK8F,UAAUiG,KACjC,CACI1E,OAAQrH,KAAKqH,OACbhB,SAAUrG,KAAKF,UAAUS,OACzB6E,SAAUpF,KAAKK,KACfiG,KAAM,IACNvC,QAAS,SACF/D,KAAKmL,eAAa,SACpBlJ,EAAAA,GAAiB,2BAEtBuD,KAAMsE,KAAKE,UAAU,CAAE6L,KAAMtS,EAAM8T,eAAgBD,KAEvD,CAAC,GAGCpL,EAAMC,IAAAA,QAAajM,KAAKqH,OAAQyE,EAAc1F,IAAK0F,EAActG,KAAM,CACzEzB,QAAS+H,EAAc/H,UAI3B,OAFA/D,KAAKuR,cAAc2F,GAAwBI,aAActL,GAElDuL,GAAwB3F,SAAS5F,EAAIyF,OAChD,GAAC,2BAED,SACIzE,EACAC,GAEA,IAAMC,EAAYD,EAASE,WAC3B,GAAkB,IAAdD,EAAJ,CAIA,IAAME,EAAQH,EAASwE,OACvB,GAAIvE,GAAa,MAAQA,GAAa,KAAM,CAGxC,IAAMiF,EACD/E,EAAMf,SAAuBe,EAAMhM,SAAuBgM,EAAMgF,OAGrE,GAAqB,8BAAjBhF,EAAMgF,OACN,MAAM,IAAIxL,EAAAA,EAAsBuL,EAAc/E,EAAMgF,QAIxD,MAAM,IAAIoF,GAA2BrF,EAAc/E,EAAMgF,OAAkBpF,EAC/E,CAEA,GAAkB,OAAdE,EACA,MAAM,IAAIsK,GACN,sCACA,uBACAxK,EAtBR,CAyBJ,KAAC,EAnG4B,CAASnN,EAAAA,GAyG7B0X,GAAuB,WAgEhC,WACId,EACAgB,EACAC,EACAnU,EACAoU,EACAC,EACAC,EACA7O,EACA8O,GACF,yPACE9X,KAAKyW,IAAMA,EACXzW,KAAKyX,SAAWA,EAChBzX,KAAK0X,iBAAmBA,EACxB1X,KAAKuD,KAAOA,EACZvD,KAAK2X,SAAWA,EAChB3X,KAAK4X,aAAeA,EACpB5X,KAAK6X,KAAOA,EACZ7X,KAAKgJ,MAAQA,EACbhJ,KAAK8X,QAAUA,CACnB,CAwBC,OAtBD,iCAQA,SAAgBrG,GACZ,IAAMsG,EAAYtG,EAAKuG,UAEvB,OAAO,IAAIT,EACPQ,EAAUjB,IACViB,EAAUE,SACVF,EAAUG,iBACVH,EAAUlC,KACVkC,EAAUI,SACVJ,EAAUK,aACVL,EAAUM,KACVN,EAAUO,MACVP,EAAUxM,QAElB,KAAC,EA5G+B,GA+GvBiM,GAA0B,gCAUnC,WAAYpW,EAAiBkC,EAAc0J,GAAoC,MAGjD,OAHiD,WACvD,MAApB,cAAM5L,EAASkC,IAAK,oBACpB,EAAKC,KAAO,6BACZ,EAAKyJ,UAAYA,EAAS,CAC9B,CAAC,aAdkC,CAAS3J,EAAAA,IAoBpB,SAAvB6T,GAAAA,EAAuB,6BAAvBA,KAAAA,GAAuB,K","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { uploads: '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","uploads","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map index d1dce49..646d01f 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { 'uploads': '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.js","mappings":"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","sources":["webpack://k6-jslib-aws/./src/internal/client.ts","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/./src/internal/sqs.ts","webpack://k6-jslib-aws/./node_modules/uuid/index.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/bytesToUuid.js","webpack://k6-jslib-aws/./node_modules/uuid/lib/rng-browser.js","webpack://k6-jslib-aws/./node_modules/uuid/v1.js","webpack://k6-jslib-aws/./node_modules/uuid/v4.js","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/kms.ts","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/secrets-manager.ts","webpack://k6-jslib-aws/./src/internal/ssm.ts"],"sourcesContent":["import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","import { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { SignatureV4, InvalidSignatureError } from './signature'\nimport { HTTPHeaders, SignedHTTPRequest } from './http'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\nimport { toFormUrlEncoded } from './utils'\nimport { AWSError } from './error'\n\nconst API_VERSION = '2012-11-05'\n\nexport class SQSClient extends AWSClient {\n private readonly signature: SignatureV4\n private readonly commonHeaders: HTTPHeaders\n\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'sqs')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken\n },\n uriEscapePath: true,\n applyChecksum: true\n })\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n }\n }\n\n /**\n * Delivers a message to the specified queue.\n *\n * @param {string} queueUrl - The URL of the Amazon SQS queue to which a message is sent. Queue URLs and names are case-sensitive.\n * @param {string} messageBody - The message to send. The minimum size is one character. The maximum size is 256 KB.\n * @param {Object} options - Options for the request\n * @param {string} [options.messageDeduplicationId] - The message deduplication id.\n * @param {string} [options.messageGroupId] - The message group ID for FIFO queues\n * @returns {Message} - The message that was sent.\n */\n sendMessage(queueUrl: string, messageBody: string, options: { messageDeduplicationId?: string; messageGroupId?: string} = {}): Message {\n const method = 'POST'\n\n let body: any = {\n Action: 'SendMessage',\n Version: API_VERSION,\n QueueUrl: queueUrl,\n MessageBody: messageBody,\n }\n\n if (typeof(options.messageDeduplicationId) !== 'undefined') {\n body = { ...body,\n MessageDeduplicationId: options.messageDeduplicationId\n }\n }\n\n if (typeof(options.messageGroupId) !== 'undefined') {\n body = { ...body,\n MessageGroupId: options.messageGroupId\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('SendMessage', res)\n\n const parsed = res.html('SendMessageResponse > SendMessageResult')\n return new Message(\n parsed.find('MessageId').text(),\n parsed.find('MD5OfMessageBody').text()\n )\n }\n\n /**\n * Returns a list of your queues in the current region.\n *\n * @param {ListQueuesRequestParameters} [parameters={}] request parameters\n * @param {number} [ListQueuesRequestParameters.maxResults] Maximum number of results to include in the response. Value range is 1 to 1000. You must set maxResults to receive a value for nextToken in the response.\n * @param {string} [ListQueuesRequestParameters.nextToken] Pagination token to request the next set of results.\n * @param {string} [ListQueuesRequestParameters.queueNamePrefix] A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * @returns {Object}\n * @returns {string[]} Object.queueUrls - A list of queue URLs, up to 1000 entries.\n * @returns {string} [Object.nextToken] - In the future, you can use NextToken to request the next set of results.\n */\n listQueues(parameters: ListQueuesRequestParameters = {}): ListQueuesResponse {\n const method = 'POST'\n\n let body: any = {\n Action: 'ListQueues',\n Version: API_VERSION,\n }\n\n if (typeof(parameters?.maxResults) !== 'undefined') {\n body = { ...body,\n MaxResults: parameters.maxResults\n }\n }\n\n if (typeof(parameters?.nextToken) !== 'undefined') {\n body = { ...body,\n NextToken: parameters.nextToken\n }\n }\n\n if (typeof(parameters?.queueNamePrefix) !== 'undefined') {\n body = { ...body,\n QueueNamePrefix: parameters.queueNamePrefix\n }\n }\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'POST',\n protocol: 'https',\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n 'Host': this.host\n },\n body: toFormUrlEncoded(body)\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers\n })\n this._handleError('ListQueues', res)\n\n let parsed = res.html()\n return {\n urls: parsed.find('QueueUrl').toArray().map(e => e.text()),\n nextToken: parsed.find('NextToken').text() || undefined\n }\n }\n\n private _handleError(operation: SQSOperation, response: RefinedResponse) {\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n if (errorMessage == '' && errorCode === 0) {\n return\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new SQSServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/**\n * An Amazon SQS message.\n */\nexport class Message {\n /**\n * A unique identifier for the message.\n * A MessageIdis considered unique across all AWS accounts for an extended period of time.\n */\n id: string\n\n /**\n * An MD5 digest of the non-URL-encoded message body string.\n */\n bodyMD5: string\n\n /**\n * Instantiates a new Message object.\n *\n * @param id\n * @param md5Ofbody\n */\n constructor(id: string, bodyMD5: string) {\n this.id = id\n this.bodyMD5 = bodyMD5\n }\n}\n\n/**\n * SQSServiceError indicates an error occurred while interacting with the SQS API.\n */\nexport class SQSServiceError extends AWSError {\n operation: SQSOperation;\n\n constructor(message: string, code: string, operation: SQSOperation) {\n super(message, code)\n this.name = 'SQSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SQSOperation describes possible SQS operations.\n */\ntype SQSOperation = 'ListQueues' | 'SendMessage'\n\nexport interface SendMessageOptions {\n /*\n * The message deduplication ID for FIFO queues\n */\n messageDeduplicationId?: string\n\n /*\n * The message group ID for FIFO queues\n */\n messageGroupId?: string\n}\n\nexport interface ListQueuesRequestParameters {\n /**\n * Maximum number of results to include in the response. Value range is 1 to 1000.\n */\n maxResults?: number\n /**\n * Pagination token to request the next set of results.\n */\n nextToken?: string\n /**\n * A string to use for filtering the list results. Only those queues whose name begins with the specified string are returned.\n * Queue URLs and names are case-sensitive.\n */\n queueNamePrefix?: string\n}\n\nexport interface ListQueuesResponse {\n /**\n * A list of queue URLs, up to 1,000 entries, or the value of MaxResults you sent in the request.\n */\n urls: string[]\n /**\n * Pagination token to include in the next request.\n */\n nextToken?: string\n}","var v1 = require('./v1');\nvar v4 = require('./v4');\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n","/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n var i = offset || 0;\n var bth = byteToHex;\n // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n return ([\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]], '-',\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]],\n bth[buf[i++]], bth[buf[i++]]\n ]).join('');\n}\n\nmodule.exports = bytesToUuid;\n","// Unique ID creation requires a high quality random # generator. In the\n// browser this is a little complicated due to unknown quality of Math.random()\n// and inconsistent support for the `crypto` API. We do the best we can via\n// feature-detection\n\n// getRandomValues needs to be invoked in a context where \"this\" is a Crypto\n// implementation. Also, find the complete implementation of crypto on IE11.\nvar getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto)) ||\n (typeof(msCrypto) != 'undefined' && typeof window.msCrypto.getRandomValues == 'function' && msCrypto.getRandomValues.bind(msCrypto));\n\nif (getRandomValues) {\n // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto\n var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef\n\n module.exports = function whatwgRNG() {\n getRandomValues(rnds8);\n return rnds8;\n };\n} else {\n // Math.random()-based (RNG)\n //\n // If all else fails, use Math.random(). It's fast, but is of unspecified\n // quality.\n var rnds = new Array(16);\n\n module.exports = function mathRNG() {\n for (var i = 0, r; i < 16; i++) {\n if ((i & 0x03) === 0) r = Math.random() * 0x100000000;\n rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;\n }\n\n return rnds;\n };\n}\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/uuidjs/uuid for API details\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || [];\n\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n if (node == null || clockseq == null) {\n var seedBytes = rng();\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [\n seedBytes[0] | 0x01,\n seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n ];\n }\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n }\n\n // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n // Time since last uuid creation (in msecs)\n var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n // Per 4.2.1.2, Bump clockseq on clock regression\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n }\n\n // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n }\n\n // Per 4.2.1.2 Throw error if too many uuids are requested\n if (nsecs >= 10000) {\n throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq;\n\n // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n msecs += 12219292800000;\n\n // `time_low`\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff;\n\n // `time_mid`\n var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff;\n\n // `time_high_and_version`\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n b[i++] = tmh >>> 16 & 0xff;\n\n // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n b[i++] = clockseq >>> 8 | 0x80;\n\n // `clock_seq_low`\n b[i++] = clockseq & 0xff;\n\n // `node`\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n","var rng = require('./lib/rng');\nvar bytesToUuid = require('./lib/bytesToUuid');\n\nfunction v4(options, buf, offset) {\n var i = buf && offset || 0;\n\n if (typeof(options) == 'string') {\n buf = options === 'binary' ? new Array(16) : null;\n options = null;\n }\n options = options || {};\n\n var rnds = options.random || (options.rng || rng)();\n\n // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n // Copy bytes to buffer, if provided\n if (buf) {\n for (var ii = 0; ii < 16; ++ii) {\n buf[i + ii] = rnds[ii];\n }\n }\n\n return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n","module.exports = require(\"k6/crypto\");","module.exports = require(\"k6/html\");","module.exports = require(\"k6/http\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's KMS service\n */\nexport class KMSClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a KMSClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'kms')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the KMS service\n // are made via the GET or POST method.\n this.method = 'POST'\n\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Gets a list of all the KMS keys in the caller's AWS\n * account and region.\n *\n * @returns an array of all the available keys\n */\n listKeys(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.ListKeys`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.ListKeys, res)\n\n const json: JSONArray = res.json('Keys') as JSONArray\n return json.map((k) => KMSKey.fromJSON(k as JSONObject))\n }\n\n /**\n * GenerateDataKey returns a unique symmetric data key for use outside of AWS KMS.\n *\n * This operation returns a plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS key that you specify.\n * The bytes in the plaintext key are random; they are not related to the caller or the KMS key.\n * You can use the plaintext key to encrypt your data outside of AWS KMS and store the encrypted data key with the encrypted data.\n *\n * To generate a data key, specify the symmetric encryption KMS key that will be used to encrypt the data key.\n * You cannot use an asymmetric KMS key to encrypt data keys.\n *\n * Used to generate data key with the KMS key defined\n * @param {string} id - Specifies the symmetric encryption KMS key that encrypts the data key. Use its key ID, key ARN, alias name, or alias ARN.\n * @param {KMKeySize} size - Specifies the length of the data key in bytes. For example, use the value 64 to generate a 512-bit data key (64 bytes is 512 bits). Default is 32, and generates a 256-bit data key.\n * @throws {KMSServiceError}\n * @throws {InvalidSignatureError}\n * @returns {KMSDataKey} - The generated data key.\n */\n generateDataKey(id: string, size: KMSKeySize = KMSKeySize.Size256): KMSDataKey | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n // For some reason, the base target is not kms...\n [AMZ_TARGET_HEADER]: `TrentService.GenerateDataKey`,\n },\n body: JSON.stringify({ KeyId: id, NumberOfBytes: size }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(KMSOperation.GenerateDataKey, res)\n\n return KMSDataKey.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(operation: KMSOperation, response: RefinedResponse) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new KMSServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new KMSServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a KMS key\n */\nexport class KMSKey {\n /**\n * ARN of the key\n */\n keyArn: string\n\n /**\n * Unique identifier of the key\n */\n keyId: string\n\n constructor(keyArn: string, KeyId: string) {\n this.keyArn = keyArn\n this.keyId = KeyId\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSKey(json.KeyArn as string, json.KeyId as string)\n }\n}\n\n/**\n * Class representing a data key\n */\nexport class KMSDataKey {\n /**\n * The Amazon Resource Name (key ARN) of the KMS key that encrypted the data key.\n */\n id: string\n\n /**\n * The (base64-encoded) encrypted copy of the data key.\n */\n ciphertextBlob: string\n\n /**\n * The plaintext data key.\n * Use this data key to encrypt your data outside of KMS. Then, remove it from memory as soon as possible.\n */\n plaintext: string\n\n constructor(CiphertextBlob: string, KeyId: string, Plaintext: string) {\n this.ciphertextBlob = CiphertextBlob\n this.id = KeyId\n this.plaintext = Plaintext\n }\n\n static fromJSON(json: JSONObject) {\n return new KMSDataKey(\n json.CiphertextBlob as string,\n json.KeyId as string,\n json.Plaintext as string\n )\n }\n}\n\nexport class KMSServiceError extends AWSError {\n operation: KMSOperation\n\n /**\n * Constructs a KMSServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: KMSOperation) {\n super(message, code)\n this.name = 'KMSServiceError'\n this.operation = operation\n }\n}\n\n/**\n * KMSOperation defines all currently implemented KMS Service operations.\n */\nenum KMSOperation {\n GenerateDataKey = 'GenerateDataKey',\n ListKeys = 'ListKeys',\n}\n\n/**\n * KMSKeyLength describes possible key lenght values for KMS API data key operations.\n */\nenum KMSKeySize {\n Size256 = 32,\n Size512 = 64,\n}\n","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { uploads: '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { JSONArray, JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { v4 as uuidv4 } from 'uuid'\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's SecretsManager service\n */\nexport class SecretsManagerClient extends AWSClient {\n /**\n * HTTP Method to use when interacting with the Secrets Manager service.\n */\n method: HTTPMethod\n\n /**\n * HTTP headers to use accross all requests to the Secrets Manager service.\n */\n commonHeaders: HTTPHeaders\n\n signature: SignatureV4\n\n /**\n * Create a SecretsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'secretsmanager')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n\n // All interactions with the Secrets Manager service\n // are made via the GET or POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n }\n\n /**\n * Returns a list of all secrets owned by the authenticated sender of the request.\n * To use this operation, you must have the secretsmanager:ListSecrets permission.\n *\n * @return {Array.} secrets - An array of objects describing Secret Manager's secrets\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n listSecrets(): Array {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.ListSecrets`,\n },\n body: JSON.stringify({}),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.ListSecrets, res)\n const json: JSONArray = res.json('SecretList') as JSONArray\n\n return json.map((s) => Secret.fromJSON(s as JSONObject))\n }\n\n /**\n * Retrieves a secret from Amazon Sercets Manager\n *\n * @param {string} id - The ARN or name of the secret to retrieve.\n * @returns {Secret} - returns the content of the fetched Secret object.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getSecret(id: string): Secret | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.GetSecretValue`,\n },\n body: JSON.stringify({ SecretId: id }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n\n this._handle_error(SecretsManagerOperation.GetSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Creates a new secret\n *\n * Note that this method only supports string-based values at the moment.\n *\n * @param {string} name - The name of the new secret.\n * The secret name can contain ASCII letters, numbers, and the following characters: /_+=.@\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {string} description - The description of the secret.\n * @param {string} versionID=null - Version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * algorithm.\n * @param {Array.} tags=[] - A list of tags to attach to the secret. Each tag is a key and\n * value pair of strings in a JSON text string. Note that tag key names are case sensitive.\n * @returns {Secret} - returns the created secret\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n createSecret(\n name: string,\n secret: string,\n description: string,\n versionID?: string,\n tags?: Array\n ): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.CreateSecret`,\n },\n body: JSON.stringify({\n Name: name,\n Description: description,\n SecretString: secret,\n ClientRequestToken: versionID,\n Tags: tags,\n }),\n },\n {}\n )\n\n // Ensure to include the desired 'Action' in the X-Amz-Target\n // header field, as documented by the AWS API docs.\n // headers['X-Amz-Target'] = `${this.serviceName}.CreateSecret`\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.CreateSecret, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n /**\n * Update a secret's value.\n *\n * Note that this method only support string-based values at the moment.\n *\n * @param {string} id - The ARN or name of the secret to update.\n * @param {string} secret - The text data to encrypt and store in this new version of the secret.\n * @param {} versionID=null - A unique identifier for the new version of the secret. This value helps ensure idempotency.\n * As a default, if no versionID is provided, one will be created for you using the UUID v4\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n putSecretValue(id: string, secret: string, versionID?: string): Secret {\n versionID = versionID || uuidv4()\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.PutSecretValue`,\n },\n body: JSON.stringify({\n SecretId: id,\n SecretString: secret,\n ClientRequestToken: versionID,\n }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.PutSecretValue, res)\n\n return Secret.fromJSON(res.json() as JSONObject)\n }\n\n /**\n * Deletes a secret and all of its versions.\n *\n * You can specify a recovery window during which you can restore the secret.\n * The minimum recovery window is 7 days. The default recovery window is 30 days.\n *\n * @param {string} secretID - The ARN or name of the secret to delete.\n * @param {number} recoveryWindow - The number of days from 7 to 30 that Secrets Manager\n * waits before permanently deleting the secret.\n * @throws {SecretsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteSecret(\n id: string,\n { recoveryWindow = 30, noRecovery = false }: { recoveryWindow: number; noRecovery: boolean }\n ) {\n const payload: { [key: string]: string | boolean | number } = {\n SecretId: id,\n }\n\n // noRecovery and recoveryWindow are exclusive parameters\n if (noRecovery === true) {\n payload['ForceDeleteWithoutRecovery'] = true\n } else {\n payload['RecoveryWindowInDays'] = recoveryWindow\n }\n\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `${this.serviceName}.DeleteSecret`,\n },\n body: JSON.stringify(payload),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SecretsManagerOperation.DeleteSecret, res)\n }\n\n _handle_error(\n operation: SecretsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SecretsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SecretsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n// TODO: create a Tags type\n\n/**\n * Class representing a Secret Manager's secret\n */\nexport class Secret {\n name: string\n arn: string\n secret: string\n createdDate: number\n lastAccessedDate: number\n lastChangedDate: number\n tags: Array<{ [key: string]: string }>\n\n /**\n * Constructs a Secret Manager's Secret\n *\n * @param {string} name - The friendly name of the secret.\n * @param {string} arn - The ARN of the secret.\n * @param {number} createdDate - The date and time that this version of the secret was created.\n * @param {number} lastAccessedDate - The last date that this secret was accessed. This value is\n * truncated to midnight of the date and therefore shows only the date, not the time.\n * @param {number} lastChangedDate - The last date and time that this secret was modified in any way.\n * @param {Array.} tags - The list of user-defined tags associated with the secret.\n */\n constructor(\n name: string,\n arn: string,\n secretString: string,\n createdDate: number,\n lastAccessedDate: number,\n lastChangedDate: number,\n tags: Array<{ [key: string]: string }> = []\n ) {\n this.name = name\n this.arn = arn\n this.secret = secretString\n this.createdDate = createdDate\n this.lastAccessedDate = lastAccessedDate\n this.lastChangedDate = lastChangedDate\n this.tags = tags\n }\n\n /**\n * Parses and constructs a Secret Manager's Secret from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {Secret}\n */\n static fromJSON(json: JSONObject) {\n return new Secret(\n json.Name as string,\n json.ARN as string,\n json.SecretString as string,\n json.CreatedDate as number,\n json.LastAccessedDate as number,\n json.LastChangedDate as number,\n json.Tags as Array<{ [key: string]: string }>\n )\n }\n}\n\nexport class SecretsManagerServiceError extends AWSError {\n operation: SecretsManagerOperation\n\n /**\n * Constructs a SecretsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SecretsManagerOperation) {\n super(message, code)\n this.name = 'SecretsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SecretsManagerOperation defines all currently implemented Secrets Manager Service operations.\n */\nenum SecretsManagerOperation {\n ListSecrets = 'ListSecrets',\n GetSecretValue = 'GetSecretValue',\n CreateSecret = 'CreateSecret',\n PutSecretValue = 'PutSecretValue',\n DeleteSecret = 'DeleteSecret',\n}\n","import { JSONObject } from 'k6'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AMZ_TARGET_HEADER } from './constants'\nimport { AWSError } from './error'\nimport { HTTPHeaders, HTTPMethod } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n/**\n * Class allowing to interact with Amazon AWS's Systems Manager service\n */\nexport class SystemsManagerClient extends AWSClient {\n method: HTTPMethod\n commonHeaders: HTTPHeaders\n signature: SignatureV4\n\n /**\n * Create a SystemsManagerClient\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 'ssm')\n\n // All interactions with the Systems Manager service\n // are made via the POST method.\n this.method = 'POST'\n this.commonHeaders = {\n 'Content-Type': 'application/x-amz-json-1.1',\n }\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: awsConfig.region,\n credentials: {\n accessKeyId: awsConfig.accessKeyId,\n secretAccessKey: awsConfig.secretAccessKey,\n },\n uriEscapePath: true,\n applyChecksum: false,\n })\n }\n\n /**\n * Retrieves a parameter from Amazon Systems Manager\n *\n * @param {string} name - The ARN or name of the parameter to retrieve.\n * @param {boolean} withDecryption - whether returned secure string parameters should be decrypted.\n * @returns {SystemsManagerParameter} - returns the fetched Parameter object.\n * @throws {SystemsManagerServiceError}\n * @throws {InvalidSignatureError}\n */\n getParameter(\n name: string,\n withDecryption: boolean = false\n ): SystemsManagerParameter | undefined {\n const signedRequest = this.signature.sign(\n {\n method: this.method,\n protocol: this.awsConfig.scheme,\n hostname: this.host,\n path: '/',\n headers: {\n ...this.commonHeaders,\n [AMZ_TARGET_HEADER]: `AmazonSSM.GetParameter`,\n },\n body: JSON.stringify({ Name: name, WithDecryption: withDecryption }),\n },\n {}\n )\n\n const res = http.request(this.method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error(SystemsManagerOperation.GetParameter, res)\n\n return SystemsManagerParameter.fromJSON(res.json() as JSONObject)\n }\n\n _handle_error(\n operation: SystemsManagerOperation,\n response: RefinedResponse\n ) {\n const errorCode = response.error_code\n if (errorCode === 0) {\n return\n }\n\n const error = response.json() as JSONObject\n if (errorCode >= 1400 && errorCode <= 1499) {\n // In the event of certain errors, the message is not set.\n // Also, note the inconsistency in casing...\n const errorMessage: string =\n (error.Message as string) || (error.message as string) || (error.__type as string)\n\n // Handle specifically the case of an invalid signature\n if (error.__type === 'InvalidSignatureException') {\n throw new InvalidSignatureError(errorMessage, error.__type)\n }\n\n // Otherwise throw a standard service error\n throw new SystemsManagerServiceError(errorMessage, error.__type as string, operation)\n }\n\n if (errorCode === 1500) {\n throw new SystemsManagerServiceError(\n 'An error occured on the server side',\n 'InternalServiceError',\n operation\n )\n }\n }\n}\n\n/**\n * Class representing a Systems Manager's Parameter\n */\nexport class SystemsManagerParameter {\n /**\n * The Amazon Resource Name (ARN) of the parameter.\n */\n arn: string\n\n /**\n * The data type of the parameter, such as text or aws:ec2:image.\n * The default is text.\n */\n dataType: string\n\n /**\n * Date the parameter was last changed or updated and the parameter version was created.\n */\n lastModifiedDate: number\n\n /**\n * The friendly name of the parameter.\n */\n name: string\n\n /**\n * Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n */\n selector: string\n\n /**\n * plies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n */\n sourceResult: string\n\n /**\n * The type of parameter. Valid values include the following: String, StringList, and SecureString.\n */\n type: string\n\n /**\n * The parameter value.\n */\n value: string\n\n /**\n * The parameter version.\n */\n version: number\n\n /**\n * Constructs a Systems Manager's Parameter\n *\n * @param {string} arn - The Amazon Resource Name (ARN) of the parameter.\n * @param {string} dataType - The data type of the parameter, such as text or aws:ec2:image. The default is text.\n * @param {number} lastModifiedDate - Date the parameter was last changed or updated and the parameter version was created.\n * @param {string} name - The friendly name of the parameter.\n * @param {string} selector - Either the version number or the label used to retrieve the parameter value. Specify selectors by using one of the following formats:\n * parameter_name:version\n * parameter_name:label\n * @param {string} sourceResult - Applies to parameters that reference information in other AWS services. SourceResult is the raw result or response from the source.\n * @param {string} type - The type of parameter. Valid values include the following: String, StringList, and SecureString.\n * @param {string} value - The parameter value.\n * @param {number} version - The parameter version.\n */\n constructor(\n arn: string,\n dataType: string,\n lastModifiedDate: number,\n name: string,\n selector: string,\n sourceResult: string,\n type: string,\n value: string,\n version: number\n ) {\n this.arn = arn\n this.dataType = dataType\n this.lastModifiedDate = lastModifiedDate\n this.name = name\n this.selector = selector\n this.sourceResult = sourceResult\n this.type = type\n this.value = value\n this.version = version\n }\n\n /**\n * Parses and constructs a Systems Manager's Parameter from the content\n * of a JSON response returned by the AWS service\n *\n * @param {Object} json - JSON object as returned and parsed from\n * the AWS service's API call.\n * @returns {SystemsManagerParameter}\n */\n static fromJSON(json: JSONObject): SystemsManagerParameter {\n const parameter = json.Parameter as JSONObject\n\n return new SystemsManagerParameter(\n parameter.ARN as string,\n parameter.DataType as string,\n parameter.LastModifiedDate as number,\n parameter.Name as string,\n parameter.Selector as string,\n parameter.SourceResult as string,\n parameter.Type as string,\n parameter.Value as string,\n parameter.Version as number\n )\n }\n}\n\nexport class SystemsManagerServiceError extends AWSError {\n operation: SystemsManagerOperation\n\n /**\n * Constructs a SystemsManagerServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {SystemsManagerOperation} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: SystemsManagerOperation) {\n super(message, code)\n this.name = 'SystemsManagerServiceError'\n this.operation = operation\n }\n}\n\n/**\n * SystemsManagerOperation defines all currently implemented Systems Manager operations.\n */\nenum SystemsManagerOperation {\n GetParameter = 'GetParameter',\n}\n"],"names":["AWSClient","awsConfig","serviceName","this","undefined","_host","region","endpoint","host","_scheme","scheme","AWSConfig","options","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","sessionToken","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TARGET_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","EMPTY_SHA256","UNSIGNED_PAYLOAD","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","hasHeader","soughtHeader","headers","Object","keys","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","hostname","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","key","value","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","isArrayBuffer","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","prototype","call","toFormUrlEncoded","form","params","API_VERSION","SQSClient","commonHeaders","queueUrl","messageBody","Action","Version","QueueUrl","MessageBody","messageDeduplicationId","MessageDeduplicationId","messageGroupId","MessageGroupId","signedRequest","sign","res","http","_handleError","parsed","html","Message","parameters","maxResults","MaxResults","nextToken","NextToken","queueNamePrefix","QueueNamePrefix","urls","toArray","e","operation","response","errorCode","error_code","error","awsError","SQSServiceError","id","bodyMD5","v1","v4","uuid","module","exports","byteToHex","i","substr","buf","offset","bth","getRandomValues","bind","window","msCrypto","rnds8","Uint8Array","rnds","r","Math","random","_nodeId","_clockseq","rng","bytesToUuid","_lastMSecs","_lastNSecs","b","node","clockseq","seedBytes","msecs","getTime","nsecs","dt","tl","tmh","n","ii","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","Symbol","toStringTag","KMSOperation","KMSKeySize","KMSClient","_handle_error","ListKeys","json","k","KMSKey","fromJSON","size","Size256","KeyId","NumberOfBytes","GenerateDataKey","KMSDataKey","errorMessage","__type","KMSServiceError","keyArn","keyId","KeyArn","CiphertextBlob","Plaintext","ciphertextBlob","plaintext","S3Client","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","parseInt","storageClass","objectKey","S3Object","data","Host","uploads","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","status","S3ServiceError","S3Bucket","SecretsManagerOperation","SecretsManagerClient","ListSecrets","s","Secret","SecretId","GetSecretValue","secret","description","versionID","tags","uuidv4","Name","Description","SecretString","ClientRequestToken","Tags","CreateSecret","PutSecretValue","recoveryWindow","noRecovery","payload","DeleteSecret","SecretsManagerServiceError","arn","secretString","createdDate","lastAccessedDate","lastChangedDate","ARN","CreatedDate","LastAccessedDate","LastChangedDate","SystemsManagerOperation","SystemsManagerClient","withDecryption","WithDecryption","GetParameter","SystemsManagerParameter","SystemsManagerServiceError","dataType","lastModifiedDate","selector","sourceResult","type","version","parameter","Parameter","DataType","LastModifiedDate","Selector","SourceResult","Type","Value"],"sourceRoot":""} \ No newline at end of file diff --git a/build/s3.js.map b/build/s3.js.map index f11f39f..72cb32e 100644 --- a/build/s3.js.map +++ b/build/s3.js.map @@ -1 +1 @@ -{"version":3,"file":"s3.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { 'uploads': '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","S3Client","awsConfig","serviceName","signedRequest","sign","host","res","http","_handle_error","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","size","parseInt","storageClass","objectKey","S3Object","data","Host","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","operation","response","status","errorCode","error_code","errorMessage","error","S3ServiceError","awsError","parseXML","_host","_scheme","S3Bucket"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"s3.js","mappings":"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","sources":["webpack://k6-jslib-aws/webpack/bootstrap","webpack://k6-jslib-aws/webpack/runtime/compat get default export","webpack://k6-jslib-aws/webpack/runtime/define property getters","webpack://k6-jslib-aws/webpack/runtime/hasOwnProperty shorthand","webpack://k6-jslib-aws/webpack/runtime/make namespace object","webpack://k6-jslib-aws/./src/internal/config.ts","webpack://k6-jslib-aws/external commonjs \"k6/crypto\"","webpack://k6-jslib-aws/./src/internal/constants.ts","webpack://k6-jslib-aws/external commonjs \"k6/html\"","webpack://k6-jslib-aws/./src/internal/error.ts","webpack://k6-jslib-aws/./src/internal/signature.ts","webpack://k6-jslib-aws/./src/internal/http.ts","webpack://k6-jslib-aws/./src/internal/utils.ts","webpack://k6-jslib-aws/external commonjs \"k6/http\"","webpack://k6-jslib-aws/./src/internal/s3.ts","webpack://k6-jslib-aws/./src/internal/client.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { HTTPScheme } from './http'\n\n/** Class holding an AWS connection information */\nexport class AWSConfig {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme} ['https']\n */\n scheme: HTTPScheme = 'https'\n\n // FIXME: Should really be called \"host\" instead. When used\n // with localstack we pass a complete host (hostname:port) here.\n /**\n * The AWS hostname to connect to.\n *\n * @type {string} ['amazonaws.com']\n */\n endpoint: string = 'amazonaws.com'\n\n /**\n * fromEnvironment creates an AWSConfig from the environment variables.\n *\n * It expects to find the following compulsory environment variables:\n * * AWS_REGION\n * * AWS_ACCESS_KEY_ID\n * * AWS_SECRET_ACCESS_KEY\n *\n * If set, the following optional environment variables are also used:\n * * AWS_SESSION_TOKEN\n *\n * Finally, the options parameter allows to explicitly set the scheme and endpoint\n * to use when connecting to AWS.\n *\n * @param options {AWSConnectionOptions}\n * @returns\n */\n static fromEnvironment(options?: AWSConnectionOptions): AWSConfig {\n const region = __ENV.AWS_REGION;\n const accessKeyId = __ENV.AWS_ACCESS_KEY_ID;\n const secretAccessKey = __ENV.AWS_SECRET_ACCESS_KEY;\n const sessionToken: string | undefined = __ENV.AWS_SESSION_TOKEN;\n const scheme: HTTPScheme | undefined = options?.scheme;\n const endpoint: string | undefined = options?.endpoint;\n\n return new AWSConfig({\n region,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n scheme: scheme,\n endpoint: endpoint,\n })\n }\n\n /**\n * Create an AWSConfig.\n *\n * @param {AWSConfigOptions} options - configuration attributes to use when interacting with AWS' APIs\n * @throws {InvalidArgumentException}\n */\n constructor(options: AWSConfigOptions) {\n if (!options.region || options.region === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS region; reason: expected a valid AWS region name (e.g. \"us-east-1\"), got \\`${options.region}\\``\n )\n }\n\n if (!options.accessKeyId || options.accessKeyId === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: expected a non empty string, got \\`${options.accessKeyId}\\``\n )\n }\n\n if (options.accessKeyId.length < 16 || options.accessKeyId.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS access key ID; reason: size should be between 16 and 128 characters, got ${options.accessKeyId.length}`\n )\n }\n\n if (!options.secretAccessKey || options.secretAccessKey === '') {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: expected a non empty string, got \\`${options.secretAccessKey}\\``\n )\n }\n\n if (options.secretAccessKey.length < 16 || options.secretAccessKey.length > 128) {\n throw new InvalidAWSConfigError(\n `invalid AWS secret access key; reason: size should be between 16 and 128 characters, got ${options.secretAccessKey.length}`\n )\n }\n\n this.region = options.region\n this.accessKeyId = options.accessKeyId\n this.secretAccessKey = options.secretAccessKey\n\n if (options.sessionToken !== undefined) {\n this.sessionToken = options.sessionToken\n }\n\n if (options.scheme !== undefined) {\n this.scheme = options.scheme\n }\n\n if (options.endpoint !== undefined) {\n this.endpoint = options.endpoint\n }\n }\n}\n\n/**\n * Interface representing AWSConfig options\n */\nexport interface AWSConfigOptions extends AWSConnectionOptions {\n /**\n * The AWS region to connect to, as listed: https://docs.aws.amazon.com/general/latest/gr/rande.html\n *\n * @type {string}\n */\n region: string\n\n /**\n * Your user's AWS access key id credential.\n *\n * @type {string}\n */\n accessKeyId: string\n\n /**\n * Your user's AWS secret access key credential.\n *\n * @type {string}\n */\n secretAccessKey: string\n\n /**\n * Your user's AWS session token credential.\n *\n * @type {string}\n */\n sessionToken?: string\n}\n\n/**\n * Interface representing AWS connection options\n */\nexport interface AWSConnectionOptions {\n /**\n * The HTTP scheme to use when connecting to AWS.\n *\n * @type {HTTPScheme}\n */\n scheme?: HTTPScheme\n\n /**\n * The AWS hostname to connect to.\n *\n * @type {string}\n */\n endpoint?: string\n}\n\n/** Class representing an invalid AWS configuration */\nexport class InvalidAWSConfigError extends Error {\n constructor(message: string) {\n super(message)\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/crypto\");","/**\n * Standard Amazon AWS query parameter names\n */\nexport const AMZ_ALGORITHM_QUERY_PARAM = 'X-Amz-Algorithm'\nexport const AMZ_CREDENTIAL_QUERY_PARAM = 'X-Amz-Credential'\nexport const AMZ_DATE_QUERY_PARAM = 'X-Amz-Date'\nexport const AMZ_EXPIRES_QUERY_PARAM = 'X-Amz-Expires'\nexport const AMZ_SIGNATURE_QUERY_PARAM = 'X-Amz-Signature'\nexport const AMZ_SIGNED_HEADERS_QUERY_PARAM = 'X-Amz-SignedHeaders'\nexport const AMZ_TARGET_QUERY_PARAM = 'X-Amz-Target'\nexport const AMZ_TOKEN_QUERY_PARAM = 'X-Amz-Security-Token'\n\n/**\n * Standard Amazon AWS header names\n */\nexport const AMZ_CONTENT_SHA256_HEADER = 'x-amz-content-sha256'\nexport const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase()\nexport const AMZ_SIGNATURE_HEADER = AMZ_SIGNATURE_QUERY_PARAM.toLowerCase()\nexport const AMZ_TARGET_HEADER = AMZ_TARGET_QUERY_PARAM.toLowerCase()\nexport const AMZ_TOKEN_HEADER = AMZ_TOKEN_QUERY_PARAM.toLowerCase()\n\n/**\n * Common HTTP headers we rely on in the signing process\n */\nexport const AUTHORIZATION_HEADER = 'authorization'\nexport const DATE_HEADER = 'date'\n\n/**\n * Lists the headers that are generated as part of the signature process.\n */\nexport const GENERATED_HEADERS = [AUTHORIZATION_HEADER, AMZ_DATE_HEADER, DATE_HEADER]\nexport const HOST_HEADER = 'host'\n\n/**\n * Lists the headers that should never be included in the\n * request signature signature process.\n */\nexport const ALWAYS_UNSIGNABLE_HEADERS = {\n authorization: true,\n 'cache-control': true,\n connection: true,\n expect: true,\n from: true,\n 'keep-alive': true,\n 'max-forwards': true,\n pragma: true,\n referer: true,\n te: true,\n trailer: true,\n 'transfer-encoding': true,\n upgrade: true,\n 'user-agent': true,\n 'x-amzn-trace-id': true,\n}\n\n/**\n * Signature specific constants included in the signing process\n */\nexport const KEY_TYPE_IDENTIFIER = 'aws4_request'\nexport const SIGNING_ALGORITHM_IDENTIFIER = 'AWS4-HMAC-SHA256'\n\n/**\n * Maximum time to live of a signed request in seconds: 7 days.\n */\nexport const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7\n\n/**\n * SHA256 hash of an empty string (so we don't waste cycles recomputing it)\n */\nexport const EMPTY_SHA256 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'\n\n/**\n * SHA256 hash of the unsigned payload constant (so we don't waste cycles recomputing it)\n */\nexport const UNSIGNED_PAYLOAD_SHA256 =\n '5a41b0751e4537c6ff868564ab44a4d4ecceec2ec5b1c5f74d97422968e04237'\n\nexport const UNSIGNED_PAYLOAD = 'UNSIGNED-PAYLOAD'\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/html\");","import { parseHTML } from 'k6/html'\n\n/**\n * Base class to derive errors from\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class AWSError extends Error {\n /**\n * Error code issued by the service (if any)\n */\n code?: string\n\n /**\n * Create an AWSError\n *\n * @param {string} message - A longer human readable error message.\n * @param {string?} code - A unique short code representing the error that was emitted\n */\n constructor(message: string, code?: string) {\n super(message)\n this.name = 'AWSError'\n this.code = code\n }\n\n /**\n * Parse an AWSError from an XML document\n *\n * @param {string} xmlDocument - Serialized XML document to parse the error from\n */\n static parseXML(xmlDocument: string): AWSError {\n const doc = parseHTML(xmlDocument)\n return new AWSError(doc.find('Message').text(), doc.find('Code').text())\n }\n}\n","import crypto from 'k6/crypto'\n\nimport * as constants from './constants'\nimport { AWSError } from './error'\nimport { hasHeader, HTTPHeaderBag, HTTPRequest, QueryParameterBag, SignedHTTPRequest } from './http'\nimport { isArrayBuffer } from './utils'\n\n/**\n * SignatureV4 can be used to sign HTTP requests and presign URLs using the AWS Signature\n * Version 4 signing process.\n *\n * It offers two signing methods:\n * - sign: signs the request headers and payload\n * - presign: returns a presigned (authorization information contained in the query string) URL\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\n */\nexport class SignatureV4 {\n /**\n * The name of the service to sign for.\n */\n private readonly service: string\n\n /**\n * The name of the region to sign for.\n */\n private readonly region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n private readonly credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n private readonly uriEscapePath: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n private readonly applyChecksum: boolean\n\n // TODO: uriEscapePath and applyChecksum should not be present in the constructor\n constructor({\n service,\n region,\n credentials,\n uriEscapePath,\n applyChecksum,\n }: SignatureV4Options) {\n this.service = service\n this.region = region\n this.credentials = credentials\n this.uriEscapePath = typeof uriEscapePath === 'boolean' ? uriEscapePath : true\n this.applyChecksum = typeof applyChecksum === 'boolean' ? applyChecksum : true\n }\n\n /**\n * Includes AWS v4 signing information to the provided HTTP request.\n *\n * This method adds an Authorization header to the request, containing\n * the signature and other signing information. It also returns a preformatted\n * URL that can be used to make the k6 http request.\n *\n * This method mutates the request object.\n *\n * @param request {HTTPRequest} The request to sign.\n * @param param1 {SignOptions} Options for signing the request.\n * @returns {SignedHTTPRequest} The signed request.\n */\n sign(\n request: HTTPRequest,\n {\n signingDate = new Date(),\n signingService,\n signingRegion,\n unsignableHeaders = new Set(),\n signableHeaders = new Set(),\n }: RequestSigningOptions\n ): SignedHTTPRequest {\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const service = signingService || this.service\n const region = signingRegion || this.region\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = request.hostname\n\n // Filter out headers that will be generated and managed by the signing process.\n // If the user provide any of those as part of the HTTPRequest's headers, they\n // will be ignored.\n for (const headerName of Object.keys(request.headers)) {\n if (constants.GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) {\n delete request.headers[headerName]\n }\n }\n\n request.headers[constants.AMZ_DATE_HEADER] = longDate\n if (this.credentials.sessionToken) {\n request.headers[constants.AMZ_TOKEN_HEADER] = this.credentials.sessionToken\n }\n\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n if (ArrayBuffer.isView(request.body)) {\n request.body = request.body.buffer\n }\n\n // Ensure we avoid passing undefined to the crypto hash function.\n if (!request.body) {\n request.body = ''\n }\n\n let payloadHash = this.computePayloadHash(request)\n if (!hasHeader(constants.AMZ_CONTENT_SHA256_HEADER, request.headers) && this.applyChecksum) {\n request.headers[constants.AMZ_CONTENT_SHA256_HEADER] = payloadHash\n }\n\n const canonicalHeaders = this.computeCanonicalHeaders(request, unsignableHeaders, signableHeaders);\n const signature = this.calculateSignature(\n longDate,\n scope,\n this.deriveSigningKey(this.credentials, service, region, shortDate),\n this.createCanonicalRequest(request, canonicalHeaders, payloadHash),\n );\n\n /**\n * Step 4 of the signing process: add the signature to the HTTP request's headers.\n *\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n */\n request.headers[constants.AUTHORIZATION_HEADER] =\n `${constants.SIGNING_ALGORITHM_IDENTIFIER} ` +\n `Credential=${this.credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${Object.keys(canonicalHeaders).sort().join(';')}, ` +\n `Signature=${signature}`\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n // We exclude the signature from the query string\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return {\n url: url,\n ...request,\n }\n }\n\n /**\n * Produces a presigned URL with AWS v4 signature information for the provided HTTP request.\n *\n * A presigned URL is a URL that contains the authorization information\n * (signature and other signing information) in the query string. This method\n * returns a preformatted URL that can be used to make the k6 http request.\n *\n * @param originalRequest - The original request to presign.\n * @param options - Options controlling the signing of the request.\n * @returns A signed request, including the presigned URL.\n */\n presign(originalRequest: HTTPRequest, options: PresignOptions = {}): SignedHTTPRequest {\n const {\n signingDate = new Date(),\n expiresIn = 3600,\n unsignableHeaders,\n unhoistableHeaders,\n signableHeaders,\n signingRegion,\n signingService,\n } = options\n const { longDate, shortDate }: DateInfo = formatDate(signingDate)\n const region = signingRegion || this.region\n const service = signingService || this.service\n\n if (expiresIn > constants.MAX_PRESIGNED_TTL) {\n throw new InvalidSignatureError(\n \"Signature version 4 presigned URLs can't be valid for more than 7 days\"\n )\n }\n\n const scope = `${shortDate}/${region}/${service}/${constants.KEY_TYPE_IDENTIFIER}`\n const request = this.moveHeadersToQuery(originalRequest, { unhoistableHeaders })\n\n // Required by the specification:\n // \"For HTTP/1.1 requests, you must include the host header at a minimum.\n // Standard headers like content-type are optional.\n // For HTTP/2 requests, you must include the :authority header instead of\n // the host header. Different services might require other headers.\"\n request.headers[constants.HOST_HEADER] = originalRequest.hostname\n\n // If the user provided a session token, include it in the signed url query string.\n if (this.credentials.sessionToken) {\n request.query[constants.AMZ_TOKEN_QUERY_PARAM] = this.credentials.sessionToken\n }\n\n // Add base signing query parameters to the request, as described in the documentation\n // @see https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html\n request.query[constants.AMZ_ALGORITHM_QUERY_PARAM] = constants.SIGNING_ALGORITHM_IDENTIFIER\n request.query[\n constants.AMZ_CREDENTIAL_QUERY_PARAM\n ] = `${this.credentials.accessKeyId}/${scope}`\n request.query[constants.AMZ_DATE_QUERY_PARAM] = longDate\n request.query[constants.AMZ_EXPIRES_QUERY_PARAM] = expiresIn.toString(10)\n\n const canonicalHeaders = this.computeCanonicalHeaders(\n request,\n unsignableHeaders,\n signableHeaders\n )\n request.query[constants.AMZ_SIGNED_HEADERS_QUERY_PARAM] = Object.keys(canonicalHeaders)\n .sort()\n .join(';')\n\n const signingKey = this.deriveSigningKey(this.credentials, service, region, shortDate)\n\n // Computing the payload from the original request. This is required\n // in the event the user attempts to produce a presigned URL for s3,\n // which requires the payload hash to be 'UNSIGNED-PAYLOAD'.\n //\n // To that effect, users need to set the 'x-amz-content-sha256' header,\n // and mark it as unhoistable and unsignable. When setup this way,\n // the computePayloadHash method will then return the string 'UNSIGNED-PAYLOAD'.\n const payloadHash = this.computePayloadHash(originalRequest)\n const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash)\n\n request.query[constants.AMZ_SIGNATURE_QUERY_PARAM] = this.calculateSignature(\n longDate,\n scope,\n signingKey,\n canonicalRequest\n )\n\n // If a request path was provided, add it to the URL\n let url = `${request.protocol}://${request.hostname}`\n if (request.path) {\n url += request.path\n }\n\n // If a request query string was provided, add it to the URL\n if (request.query) {\n url += `?${this.serializeQueryParameters(request.query)}`\n }\n\n return { url: url, ...request }\n }\n\n /**\n * Create a string including information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * Step 1 of the signing process: create the canonical request string.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n *\n * @param request {HTTPRequest} The request to sign.\n * @param canonicalHeaders {HTTPHeaderBag} The request's canonical headers.\n * @param payloadHash {string} The hexadecimally encoded request's payload hash .\n * @returns {string} The canonical request string.\n */\n private createCanonicalRequest(\n request: HTTPRequest,\n canonicalHeaders: HTTPHeaderBag,\n payloadHash: string\n ): string {\n const sortedHeaders = Object.keys(canonicalHeaders).sort()\n const sortedCanonicalHeaders = sortedHeaders\n .map((name) => `${name}:${canonicalHeaders[name]}`)\n .join('\\n')\n const signedHeaders = sortedHeaders.join(';')\n\n return (\n `${request.method}\\n` +\n `${this.computeCanonicalURI(request)}\\n` +\n `${this.computeCanonicalQuerystring(request)}\\n` +\n `${sortedCanonicalHeaders}\\n\\n` +\n `${signedHeaders}\\n` +\n `${payloadHash}`\n )\n }\n\n /**\n * Create the \"string to sign\" part of the signature Version 4 protocol.\n *\n * The \"string to sign\" includes meta information about your request and\n * about the canonical request that you created with `createCanonicalRequest`.\n * It is used hand in hand with the signing key to create the request signature.\n * Step 2 of the signing process: create the string to sign.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The \"string to sign\".\n */\n private createStringToSign(\n longDate: string,\n credentialScope: string,\n canonicalRequest: string\n ): string {\n const hashedCanonicalRequest = crypto.sha256(canonicalRequest, 'hex')\n\n return (\n `${constants.SIGNING_ALGORITHM_IDENTIFIER}\\n` +\n `${longDate}\\n` +\n `${credentialScope}\\n` +\n `${hashedCanonicalRequest}`\n )\n }\n\n /**\n * Calculte the signature for AWS signature version 4.\n *\n * Step 3 of the signing process: create the signature.\n * @see https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html\n *\n * @param longDate {string} The request's date in iso 8601 format.\n * @param credentialScope {string} The request's credential scope.\n * @param signingKey {string} the signing key as computed by the deriveSigningKey method.\n * @param canonicalRequest {string} The request's canonical request.\n * @returns {string} The signature.\n */\n private calculateSignature(\n longDate: string,\n credentialScope: string,\n signingKey: Uint8Array,\n canonicalRequest: string\n ): string {\n const stringToSign = this.createStringToSign(longDate, credentialScope, canonicalRequest)\n return crypto.hmac('sha256', signingKey, stringToSign, 'hex')\n }\n\n /**\n * Derives the signing key for authenticating requests signed with\n * the Signature version 4 authentication protocol.\n *\n * deriveSigningKey produces a signing key by creating a series of\n * hash-based message authentication codes (HMACs) represented in\n * a binary format.\n *\n * The derived signing key is specific to the date it's made at, as well as\n * the service and region it targets.\n *\n * @param credentials {AWSCredentials} The credentials to use for signing.\n * @param service {string} The service the request is targeted at.\n * @param region {string} The region the request is targeted at.\n * @param shortDate {string} The request's date in YYYYMMDD format.\n * @returns {Uint8Array} The derived signing key.\n */\n private deriveSigningKey(\n credentials: Credentials,\n service: string,\n region: string,\n shortDate: string\n ): Uint8Array {\n const kSecret: string = credentials.secretAccessKey\n const kDate: any = crypto.hmac('sha256', 'AWS4' + kSecret, shortDate, 'binary')\n const kRegion: any = crypto.hmac('sha256', kDate, region, 'binary')\n const kService: any = crypto.hmac('sha256', kRegion, service, 'binary')\n const kSigning: any = crypto.hmac('sha256', kService, 'aws4_request', 'binary')\n\n return kSigning\n }\n\n /**\n * Create a string that includes information from your request\n * in a AWS signature v4 standardized (canonical) format.\n *\n * @param param0 {HTTPRequest} The request to sign.\n * @returns {string} The canonical URI.\n */\n private computeCanonicalURI({ path }: HTTPRequest): string {\n if (this.uriEscapePath) {\n // Non-S3 services, we normalize the path and then double URI encode it.\n // Ref: \"Remove Dot Segments\" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n const normalizedURISegments = []\n\n for (const URISegment of path.split('/')) {\n if (URISegment?.length === 0) {\n continue\n }\n\n if (URISegment === '.') {\n continue\n }\n\n if (URISegment === '..') {\n normalizedURISegments.pop()\n } else {\n normalizedURISegments.push(URISegment)\n }\n }\n\n // Normalize the URI\n const leading = path?.startsWith('/') ? '/' : ''\n const URI = normalizedURISegments.join('/')\n const trailing = normalizedURISegments.length > 0 && path?.endsWith('/') ? '/' : ''\n const normalizedURI = `${leading}${URI}${trailing}`\n\n const doubleEncoded = encodeURIComponent(normalizedURI)\n\n return doubleEncoded.replace(/%2F/g, '/')\n }\n\n // For S3, we shouldn't normalize the path. For example, object name\n // my-object//example//photo.user should not be normalized to\n // my-object/example/photo.user\n return path\n }\n\n /**\n * Serializes the request's query parameters into their canonical\n * string version. If the request does not include a query parameters,\n * returns an empty string.\n *\n * @param param0 {HTTPRequest} The request containing the query parameters.\n * @returns {string} The canonical query string.\n */\n private computeCanonicalQuerystring({ query = {} }: HTTPRequest): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (key.toLowerCase() === constants.AMZ_SIGNATURE_HEADER) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n\n /**\n * Create the canonical form of the request's headers.\n * Canonical headers consist of all the HTTP headers you\n * are including with the signed request.\n *\n * @param param0 {HTTPRequest} The request to compute the canonical headers of.\n * @param unsignableHeaders {Set} The headers that should not be signed.\n * @param signableHeaders {Set} The headers that should be signed.\n * @returns {string} The canonical headers.\n */\n private computeCanonicalHeaders(\n { headers }: HTTPRequest,\n unsignableHeaders?: Set,\n signableHeaders?: Set\n ): HTTPHeaderBag {\n const canonicalHeaders: HTTPHeaderBag = {}\n\n for (const headerName of Object.keys(headers).sort()) {\n if (headers[headerName] == undefined) {\n continue\n }\n\n const canonicalHeaderName = headerName.toLowerCase()\n if (\n canonicalHeaderName in constants.ALWAYS_UNSIGNABLE_HEADERS ||\n unsignableHeaders?.has(canonicalHeaderName)\n ) {\n if (\n !signableHeaders ||\n (signableHeaders && !signableHeaders.has(canonicalHeaderName))\n ) {\n continue\n }\n }\n\n canonicalHeaders[canonicalHeaderName] = headers[headerName].trim().replace(/\\s+/g, ' ')\n }\n\n return canonicalHeaders\n }\n\n /**\n * Computes the SHA256 cryptographic hash of the request's body.\n *\n * If the headers contain the 'X-Amz-Content-Sha256' header, then\n * the value of that header is returned instead. This proves useful\n * when, for example, presiging a URL for S3, as the payload hash\n * must always be equal to 'UNSIGNED-PAYLOAD'.\n *\n * @param param0 {HTTPRequest} The request to compute the payload hash of.\n * @returns {string} The hex encoded SHA256 payload hash, or the value of the 'X-Amz-Content-Sha256' header.\n */\n private computePayloadHash({ headers, body }: HTTPRequest): string {\n // for (const headerName of Object.keys(headers)) {\n // // If the header is present, return its value.\n // // So that we let the 'UNSIGNED-PAYLOAD' value pass through.\n // if (headerName.toLowerCase() === constants.AMZ_CONTENT_SHA256_HEADER) {\n // return headers[headerName]\n // }\n // }\n\n if (headers[constants.AMZ_CONTENT_SHA256_HEADER]) {\n return headers[constants.AMZ_CONTENT_SHA256_HEADER]\n }\n\n if (body == undefined) {\n return constants.EMPTY_SHA256\n }\n\n if (typeof body === 'string' || isArrayBuffer(body)) {\n return crypto.sha256(body, 'hex').toLowerCase()\n }\n\n if (ArrayBuffer.isView(body)) {\n // If the request body is a typed array, we need to convert it to a buffer\n // so that we can calculate the checksum.\n return crypto.sha256((body as DataView).buffer, 'hex').toLowerCase()\n }\n\n return constants.UNSIGNED_PAYLOAD\n }\n\n /**\n * Moves a request's headers to its query parameters.\n *\n * The operation will ignore any amazon standard headers, prefixed\n * with 'X-Amz-'. It will also ignore any headers specified as unhoistable\n * by the options.\n *\n * The operation will delete the headers from the request.\n *\n * @param request {HTTPRequest} The request to move the headers from.\n * @param options\n * @returns {HTTPRequest} The request with the headers moved to the query parameters.\n */\n private moveHeadersToQuery(\n request: HTTPRequest,\n options: { unhoistableHeaders?: Set } = {}\n ): HTTPRequest & { query: QueryParameterBag } {\n const requestCopy = JSON.parse(JSON.stringify(request))\n const { headers, query = {} as QueryParameterBag } = requestCopy\n\n for (const name of Object.keys(headers)) {\n const lowerCaseName = name.toLowerCase()\n if (\n lowerCaseName.slice(0, 6) === 'x-amz-' &&\n !options.unhoistableHeaders?.has(lowerCaseName)\n ) {\n query[name] = headers[name]\n delete headers[name]\n }\n }\n\n return {\n ...requestCopy,\n headers,\n query,\n }\n }\n\n /**\n * Serializes a HTTPRequest's query parameter bag into a string.\n *\n * @param query {QueryParameterBag} The query parameters to serialize.\n * @param ignoreKeys {Set} The keys to ignore.\n * @returns {string} The serialized, and ready to use in a URL, query parameters.\n */\n private serializeQueryParameters(query: QueryParameterBag, ignoreKeys?: string[]): string {\n const keys: Array = []\n const serialized: Record = {}\n\n for (const key of Object.keys(query).sort()) {\n if (ignoreKeys?.includes(key.toLowerCase())) {\n continue\n }\n\n keys.push(key)\n const value = query[key]\n\n if (typeof value === 'string') {\n serialized[key] = `${escapeURI(key)}=${escapeURI(value)}`\n } else if (Array.isArray(value)) {\n serialized[key] = value\n .slice(0)\n .sort()\n .reduce(\n (encoded: Array, value: string) =>\n encoded.concat([`${escapeURI(key)}=${escapeURI(value)}`]),\n []\n )\n .join('&')\n }\n }\n\n return keys\n .map((key) => serialized[key])\n .filter((serialized) => serialized)\n .join('&')\n }\n}\n\n/**\n * Error indicating an Invalid signature has been sent to AWS services\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class InvalidSignatureError extends AWSError {\n /**\n * Constructs an InvalidSignatureError\n *\n * @param {string} message - human readable error message\n */\n constructor(message: string, code?: string) {\n super(message, code)\n this.name = 'InvalidSignatureError'\n }\n}\n\nexport interface SignatureV4Options {\n /**\n * The name of the service to sign for.\n */\n service: string\n\n /**\n * The name of the region to sign for.\n */\n region: string\n\n /**\n * The credentials with which the request should be signed.\n */\n credentials: Credentials\n\n /**\n * Whether to uri-escape the request URI path as part of computing the\n * canonical request string. This is required for every AWS service, except\n * Amazon S3, as of late 2017.\n *\n * @default [true]\n */\n uriEscapePath?: boolean\n\n /**\n * Whether to calculate a checksum of the request body and include it as\n * either a request header (when signing) or as a query string parameter\n * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for\n * every other AWS service as of late 2017.\n *\n * @default [true]\n */\n applyChecksum?: boolean\n}\n\nexport interface SignOptions {\n /**\n * The date and time to be used as signature metadata. This value should be\n * a Date object, a unix (epoch) timestamp, or a string that can be\n * understood by the JavaScript `Date` constructor.If not supplied, the\n * value returned by `new Date()` will be used.\n */\n signingDate?: Date\n\n /**\n * The service signing name. It will override the service name of the signer\n * in current invocation\n */\n signingService?: string\n\n /**\n * The region name to sign the request. It will override the signing region of the\n * signer in current invocation\n */\n signingRegion?: string\n}\n\nexport interface RequestSigningOptions extends SignOptions {\n /**\n * A set of strings whose members represents headers that cannot be signed.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unsignableHeaders set.\n */\n unsignableHeaders?: Set\n\n /**\n * A set of strings whose members represents headers that should be signed.\n * Any values passed here will override those provided via unsignableHeaders,\n * allowing them to be signed.\n *\n * All headers in the provided request will have their names converted to\n * lower case before signing.\n */\n signableHeaders?: Set\n}\n\nexport interface PresignOptions extends RequestSigningOptions {\n /**\n * The number of seconds before the presigned URL expires\n */\n expiresIn?: number\n\n /**\n * A set of strings whose representing headers that should not be hoisted\n * to presigned request's query string. If not supplied, the presigner\n * moves all the AWS-specific headers (starting with `x-amz-`) to the request\n * query string. If supplied, these headers remain in the presigned request's\n * header.\n * All headers in the provided request will have their names converted to\n * lower case and then checked for existence in the unhoistableHeaders set.\n */\n unhoistableHeaders?: Set\n}\n\nexport interface Credentials {\n /**\n * AWS access key ID\n */\n readonly accessKeyId: string\n\n /**\n * AWS secret access key\n */\n readonly secretAccessKey: string\n\n /**\n * A security or session token to use with these credentials. Usually\n * present for temporary credentials.\n */\n readonly sessionToken?: string\n}\n\nexport interface DateInfo {\n /**\n * ISO8601 formatted date string\n */\n longDate: string\n\n /**\n * String in the format YYYYMMDD\n */\n shortDate: string\n}\n\n/**\n * Escapes a URI following the AWS signature v4 escaping rules.\n *\n * @param URI {string} The URI to escape.\n * @returns {string} The escaped URI.\n */\nfunction escapeURI(URI: string): string {\n const hexEncode = (c: string): string => {\n return `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n }\n\n return encodeURIComponent(URI).replace(/[!'()*]/g, hexEncode)\n}\n\n/**\n * formatDate formats a Date object into a ISO8601 formatted date string\n * and a string in the format YYYYMMDD.\n *\n * @param date {Date} The date to format.\n * @returns {DateInfo} The formatted date.\n */\nfunction formatDate(date: Date): DateInfo {\n const longDate = iso8601(date).replace(/[\\-:]/g, '')\n return {\n longDate,\n shortDate: longDate.slice(0, 8),\n }\n}\n\n/**\n * Formats a time into an ISO 8601 string.\n *\n * @see https://en.wikipedia.org/wiki/ISO_8601\n *\n * @param time {number | string | Date} The time to format.\n * @returns {string} The ISO 8601 formatted time.\n */\nfunction iso8601(time: number | string | Date): string {\n return toDate(time)\n .toISOString()\n .replace(/\\.\\d{3}Z$/, 'Z')\n}\n\n/**\n * Converts a time value into a Date object.\n *\n * @param time {number | string | Date} The time to convert.\n * @returns {Date} The resulting Date object.\n */\nfunction toDate(time: number | string | Date): Date {\n if (typeof time === 'number') {\n return new Date(time * 1000)\n }\n\n if (typeof time === 'string') {\n if (Number(time)) {\n return new Date(Number(time) * 1000)\n }\n\n return new Date(time)\n }\n\n return time\n}\n","/**\n * Type representing HTTP schemes\n */\nexport type HTTPScheme = 'http' | 'https'\n\n/**\n * Type representing HTTP Methods\n *\n */\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE'\n\n/**\n * Type alias representing HTTP Headers\n */\nexport type HTTPHeaders = { [key: string]: string }\n\n/**\n * HTTPHeaderBag is a type alias representing HTTP Headers\n */\nexport type HTTPHeaderBag = Record\n\nexport function hasHeader(soughtHeader: string, headers: HTTPHeaderBag): boolean {\n soughtHeader = soughtHeader.toLowerCase()\n\n for (const headerName of Object.keys(headers)) {\n if (soughtHeader === headerName.toLowerCase()) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * QueryParameterBag is a type alias representing HTTP Query Parameters\n */\nexport type QueryParameterBag = Record>\n\n/**\n * HTTPRequest represents an HTTP request\n */\nexport interface HTTPRequest {\n /**\n * The HTTP method to use\n */\n method: HTTPMethod\n\n /**\n * The protocol to use (http or https)\n */\n protocol: HTTPScheme\n\n /**\n * The hostname (domain name or IP address) the request targets\n */\n hostname: string\n\n /**\n * The port to the request targets\n */\n port?: number\n\n /**\n * The path to the resource\n */\n path: string\n\n /**\n * The query parameters to include in the request\n */\n query?: QueryParameterBag\n\n /**\n * The headers to include in the request\n */\n headers: HTTPHeaderBag\n\n /**\n * The body of the request\n */\n body?: string | ArrayBuffer | null\n}\n\n/**\n * SignedHTTPRequest represents an HTTP request that has been signed\n * with an AWS signature. It is a superset of HTTPRequest adding\n * the following fields:\n * - url: the fully qualified URL of the request that can be used in a k6 http.request.\n */\nexport interface SignedHTTPRequest extends HTTPRequest {\n url: string\n}\n","/**\n *\n * @param value\n * @returns\n */\nexport function isArrayBuffer(value: any): value is ArrayBuffer {\n return (\n typeof ArrayBuffer === 'function' &&\n (value instanceof ArrayBuffer ||\n Object.prototype.toString.call(value) === '[object ArrayBuffer]')\n )\n}\n\nexport function toFormUrlEncoded(form: any): string {\n return Object.keys(form).reduce((params, key) => {\n let value = form[key]\n if (value !== undefined && value !== null) {\n params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n }\n return params;\n }, [] as string[]).join('&')\n}","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"k6/http\");","import { bytes } from 'k6'\nimport { parseHTML } from 'k6/html'\nimport http, { RefinedResponse, ResponseType } from 'k6/http'\n\nimport { AWSClient } from './client'\nimport { AWSConfig } from './config'\nimport { AWSError } from './error'\nimport { SignedHTTPRequest } from './http'\nimport { InvalidSignatureError, SignatureV4 } from './signature'\n\n\n/** Class allowing to interact with Amazon AWS's S3 service */\nexport class S3Client extends AWSClient {\n signature: SignatureV4\n\n /**\n * Create a S3Client\n *\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n */\n constructor(awsConfig: AWSConfig) {\n super(awsConfig, 's3')\n\n this.signature = new SignatureV4({\n service: this.serviceName,\n region: this.awsConfig.region,\n credentials: {\n accessKeyId: this.awsConfig.accessKeyId,\n secretAccessKey: this.awsConfig.secretAccessKey,\n sessionToken: this.awsConfig.sessionToken,\n },\n uriEscapePath: false,\n applyChecksum: true,\n })\n }\n\n /**\n * Returns a list of all buckets owned by the authenticated sender of the request.\n * To use this operation, you must have the s3:ListAllMyBuckets permission.\n *\n * @return {Array.} buckets - An array of objects describing S3 buckets\n * with the following fields: name, and creationDate.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listBuckets(): Array {\n const method = 'GET'\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: this.host,\n path: '/',\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListBuckets', res)\n\n let buckets: Array = []\n\n const doc = parseHTML(res.body as string)\n\n doc.find('Buckets')\n .children()\n .each((_, bucketDefinition) => {\n let bucket = {}\n\n bucketDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'name':\n Object.assign(bucket, { name: child.textContent() })\n break\n case 'creationdate':\n Object.assign(bucket, {\n creationDate: Date.parse(child.textContent()),\n })\n }\n })\n\n buckets.push(bucket as S3Bucket)\n })\n\n return buckets\n }\n\n /**\n * Returns some or all (up to 1,000) of the objects in a bucket.\n *\n * @param {string} bucketName - Bucket name to list.\n * @param {string?} prefix='' - Limits the response to keys that begin with the specified prefix.\n * @return {Array.} - returns an array of objects describing S3 objects\n * with the following fields: key, lastModified, etag, size and storageClass.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n listObjects(bucketName: string, prefix?: string): Array {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest: SignedHTTPRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/`,\n query: {\n 'list-type': '2',\n prefix: prefix || '',\n },\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('ListObjectsV2', res)\n\n let objects: Array = []\n\n // Extract the objects definition from\n // the XML response\n parseHTML(res.body as string)\n .find('Contents')\n .each((_, objectDefinition) => {\n let obj = {}\n\n objectDefinition.children().forEach((child) => {\n switch (child.nodeName()) {\n case 'key':\n Object.assign(obj, { key: child.textContent() })\n break\n case 'lastmodified':\n Object.assign(obj, { lastModified: Date.parse(child.textContent()) })\n break\n case 'etag':\n Object.assign(obj, { etag: child.textContent() })\n break\n case 'size':\n Object.assign(obj, { size: parseInt(child.textContent()) })\n break\n case 'storageclass':\n Object.assign(obj, { storageClass: child.textContent() })\n }\n })\n\n objects.push(obj as S3Object)\n })\n\n return objects\n }\n /**\n * Retrieves an Object from Amazon S3.\n *\n * To use getObject, you must have `READ` access to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to get.\n * @return {S3Object} - returns the content of the fetched S3 Object.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n getObject(bucketName: string, objectKey: string): S3Object {\n // Prepare request\n const method = 'GET'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: 'GET',\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('GetObject', res)\n\n return new S3Object(\n objectKey,\n Date.parse(res.headers['Last-Modified']),\n res.headers['ETag'],\n parseInt(res.headers['Content-Length']),\n\n // The X-Amz-Storage-Class header is only set if the storage class is\n // not the default 'STANDARD' one.\n (res.headers['X-Amz-Storage-Class'] ?? 'STANDARD') as StorageClass,\n\n res.body\n )\n }\n /**\n * Adds an object to a bucket.\n *\n * You must have WRITE permissions on a bucket to add an object to it.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to put.\n * @param {string | ArrayBuffer} data - the content of the S3 Object to upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n putObject(bucketName: string, objectKey: string, data: string | ArrayBuffer) {\n // Prepare request\n const method = 'PUT'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {\n Host: host,\n },\n body: data,\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body, {\n headers: signedRequest.headers,\n })\n this._handle_error('PutObject', res)\n }\n\n /**\n * Removes the null version (if there is one) of an object and inserts a delete marker,\n * which becomes the latest version of the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n deleteObject(bucketName: string, objectKey: string): void {\n // Prepare request\n const method = 'DELETE'\n const host = `${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${bucketName}/${objectKey}`,\n headers: {},\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('DeleteObject', res)\n }\n\n /**\n * Creates a new multipart upload for a given objectKey.\n * The uploadId returned can be used to upload parts to the object.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @return {S3MultipartUpload} - returns the uploadId of the newly created multipart upload.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n createMultipartUpload(bucketName: string, objectKey: string): S3MultipartUpload {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: { uploads: '' },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('CreateMultipartUpload', res)\n\n return new S3MultipartUpload(\n objectKey,\n parseHTML(res.body as string)\n .find('UploadId')\n .text()\n )\n }\n\n /**\n * Uploads a part in a multipart upload.\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to upload.\n * @param {string} uploadId - The uploadId of the multipart upload.\n * @param {number} partNumber - The part number of the part to upload.\n * @param {string | ArrayBuffer} data - The content of the part to upload.\n * @return {S3Part} - returns the ETag of the uploaded part.\n * @throws {S3ServiceError}\n */\n uploadPart(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n partNumber: number,\n data: string | ArrayBuffer\n ): S3Part {\n // Prepare request\n const method = 'PUT'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: data,\n query: {\n partNumber: `${partNumber}`,\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('UploadPart', res)\n\n return new S3Part(partNumber, res.headers['Etag'])\n }\n\n /**\n * Completes a multipart upload by assembling previously uploaded parts.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to complete.\n * @param {S3Part[]} parts - The parts to assemble.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n completeMultipartUpload(\n bucketName: string,\n objectKey: string,\n uploadId: string,\n parts: S3Part[]\n ) {\n // Prepare request\n const method = 'POST'\n const host = `${bucketName}.${this.host}`\n const body = `${parts\n .map(\n (part) =>\n `${part.partNumber}${part.eTag}`\n )\n .join('')}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n body: body,\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n\n this._handle_error('CompleteMultipartUpload', res)\n }\n\n /**\n * Aborts a multipart upload.\n *\n * @param {string} bucketName - The bucket name containing the object.\n * @param {string} objectKey - Key of the object to delete.\n * @param {string} uploadId - The uploadId of the multipart upload to abort.\n * @throws {S3ServiceError}\n * @throws {InvalidSignatureError}\n */\n abortMultipartUpload(bucketName: string, objectKey: string, uploadId: string) {\n // Prepare request\n const method = 'DELETE'\n const host = `${bucketName}.${this.host}`\n const signedRequest = this.signature.sign(\n {\n method: method,\n protocol: this.scheme,\n hostname: host,\n path: `/${objectKey}`,\n headers: {},\n query: {\n uploadId: `${uploadId}`,\n },\n },\n {}\n )\n\n const res = http.request(method, signedRequest.url, signedRequest.body || '', {\n headers: signedRequest.headers,\n })\n this._handle_error('AbortMultipartUpload', res)\n }\n\n _handle_error(operation: S3Operation, response: RefinedResponse) {\n const status: number = response.status\n const errorCode: number = response.error_code\n const errorMessage: string = response.error\n\n // We consider codes 200-299 as success\n if (status >= 200 && status < 300 && errorMessage == '' && errorCode === 0) {\n return\n }\n\n // A 301 response is returned when the bucket is not found.\n // Generally meaning that either the bucket name is wrong or the\n // region is wrong.\n //\n // See: https://github.com/grafana/k6/issues/2474\n // See: https://github.com/golang/go/issues/49281\n if (status == 301 || (errorMessage && errorMessage.startsWith('301'))) {\n throw new S3ServiceError('Resource not found', 'ResourceNotFound', operation)\n }\n\n const awsError = AWSError.parseXML(response.body as string)\n switch (awsError.code) {\n case 'AuthorizationHeaderMalformed':\n throw new InvalidSignatureError(awsError.message, awsError.code)\n default:\n throw new S3ServiceError(awsError.message, awsError.code || 'unknown', operation)\n }\n }\n}\n\n/** Class representing a S3 Bucket */\nexport class S3Bucket {\n name: string\n creationDate: Date\n\n /**\n * Create an S3 Bucket\n *\n * @param {string} name - S3 bucket's name\n * @param {Date} creationDate - S3 bucket's creation date\n */\n constructor(name: string, creationDate: Date) {\n this.name = name\n this.creationDate = creationDate\n }\n}\n\n/** Class representing an S3 Object */\nexport class S3Object {\n key: string\n lastModified: number\n etag: string\n size: number\n storageClass: StorageClass\n data?: string | bytes | null\n\n /**\n * Create an S3 Object\n *\n * @param {string} key - S3 object's key\n * @param {Date} lastModified - S3 object last modification date\n * @param {string} etag - S3 object's etag\n * @param {number} size - S3 object's size\n * @param {StorageClass} storageClass - S3 object's storage class\n * @param {string | bytes | null} data=null - S3 Object's data\n */\n constructor(\n key: string,\n lastModified: number,\n etag: string,\n size: number,\n storageClass: StorageClass,\n data?: string | bytes | null\n ) {\n this.key = key\n this.lastModified = lastModified\n this.etag = etag\n this.size = size\n this.storageClass = storageClass\n this.data = data\n }\n}\n\n/** Class representing a S3 Multipart Upload */\nexport class S3MultipartUpload {\n key: string\n uploadId: string\n\n /**\n * Create an S3 Multipart Upload\n * @param {string} key - S3 object's key\n * @param {string} uploadId - S3 multipart upload id\n */\n\n constructor(key: string, uploadId: string) {\n this.key = key\n this.uploadId = uploadId\n }\n}\n\n/** Class representing a S3 Part */\nexport class S3Part {\n partNumber: number\n eTag: string\n\n /**\n * Create an S3 Part\n * @param {number} partNumber - Part number\n * @param {string} eTag - Part's etag\n */\n\n constructor(partNumber: number, eTag: string) {\n this.partNumber = partNumber\n this.eTag = eTag\n }\n}\n\n/**\n * Error indicating a S3 operation failed\n *\n * Inspired from AWS official error types, as\n * described in:\n * * https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/\n * * https://github.com/aws/aws-sdk-js/blob/master/lib/error.d.ts\n */\nexport class S3ServiceError extends AWSError {\n operation: string\n\n /**\n * Constructs a S3ServiceError\n *\n * @param {string} message - human readable error message\n * @param {string} code - A unique short code representing the error that was emitted\n * @param {string} operation - Name of the failed Operation\n */\n constructor(message: string, code: string, operation: string) {\n super(message, code)\n this.name = 'S3ServiceError'\n this.operation = operation\n }\n}\n\n/**\n * S3Operation describes possible values for S3 API operations,\n * as defined by AWS APIs.\n */\ntype S3Operation =\n | 'ListBuckets'\n | 'ListObjectsV2'\n | 'GetObject'\n | 'PutObject'\n | 'DeleteObject'\n | 'CreateMultipartUpload'\n | 'CompleteMultipartUpload'\n | 'UploadPart'\n | 'AbortMultipartUpload'\n\n/**\n * Describes the class of storage used to store a S3 object.\n */\ntype StorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'GLACIER'\n | 'STANDARD_IA'\n | 'INTELLIGENT_TIERING'\n | 'DEEP_ARCHIVE'\n | 'OUTPOSTS'\n | 'GLACIER_IR'\n | undefined\n","import { AWSConfig } from './config'\nimport { HTTPHeaders } from './http'\nimport { HTTPScheme } from './http'\n/**\n * Class allowing to build requests targeting AWS APIs\n *\n * This class is meant to be used as a base class for specific\n * services clients. See S3Client or SecretsManagerClient for\n * usage examples.\n */\nexport class AWSClient {\n awsConfig: AWSConfig\n serviceName: string\n\n private _host?: string\n private _scheme?: HTTPScheme\n /**\n * @param {AWSConfig} awsConfig - configuration attributes to use when interacting with AWS' APIs\n * @param {string} serviceName - name of the service to target.\n * @param {URIEncodingConfig} URIencodingConfig - configures how requests URIs should be encoded.\n */\n constructor(awsConfig: AWSConfig, serviceName: string) {\n this.awsConfig = awsConfig\n this.serviceName = serviceName\n }\n\n /**\n * Property computing the URL to send the requests to when interacting with\n * the specific AWS service the child class implements the functionalities of.\n */\n public get host() {\n if (this._host == undefined) {\n this._host = `${this.serviceName}.${this.awsConfig.region}.${this.awsConfig.endpoint}`\n }\n return this._host\n }\n\n public set host(host: string) {\n this._host = host\n }\n\n /**\n * Property computing the scheme to use http or https. Defaults to https as per AWSConfig Defaults\n * the specific AWS service the child class implements the functionalities of.\n */\n \n public get scheme() {\n\n if (this._scheme == undefined) {\n this._scheme = this.awsConfig.scheme;\n }\n return this._scheme\n }\n \n // Validatiuon should be done by the type declaration \n public set scheme(scheme: HTTPScheme) {\n this._scheme = scheme\n }\n\n}\n\n/**\n * Type alias representing the result of an AWSClient.buildRequest call\n */\nexport interface AWSRequest {\n url: string\n headers: HTTPHeaders\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","AWSConfig","options","region","InvalidAWSConfigError","accessKeyId","length","secretAccessKey","this","undefined","sessionToken","scheme","endpoint","__ENV","AWS_REGION","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","message","Error","require","AMZ_ALGORITHM_QUERY_PARAM","AMZ_CREDENTIAL_QUERY_PARAM","AMZ_DATE_QUERY_PARAM","AMZ_EXPIRES_QUERY_PARAM","AMZ_SIGNATURE_QUERY_PARAM","AMZ_SIGNED_HEADERS_QUERY_PARAM","AMZ_TOKEN_QUERY_PARAM","AMZ_CONTENT_SHA256_HEADER","AMZ_DATE_HEADER","toLowerCase","AMZ_SIGNATURE_HEADER","AMZ_TOKEN_HEADER","AUTHORIZATION_HEADER","GENERATED_HEADERS","HOST_HEADER","ALWAYS_UNSIGNABLE_HEADERS","authorization","connection","expect","from","pragma","referer","te","trailer","upgrade","KEY_TYPE_IDENTIFIER","SIGNING_ALGORITHM_IDENTIFIER","MAX_PRESIGNED_TTL","AWSError","code","name","xmlDocument","doc","parseHTML","find","text","SignatureV4","service","credentials","uriEscapePath","applyChecksum","request","signingDate","Date","signingService","signingRegion","unsignableHeaders","Set","signableHeaders","formatDate","longDate","shortDate","scope","constants","headers","hostname","keys","headerName","ArrayBuffer","isView","body","buffer","payloadHash","computePayloadHash","soughtHeader","hasHeader","canonicalHeaders","computeCanonicalHeaders","signature","calculateSignature","deriveSigningKey","createCanonicalRequest","sort","join","url","protocol","path","query","serializeQueryParameters","originalRequest","expiresIn","unhoistableHeaders","InvalidSignatureError","moveHeadersToQuery","toString","signingKey","canonicalRequest","sortedHeaders","sortedCanonicalHeaders","map","signedHeaders","method","computeCanonicalURI","computeCanonicalQuerystring","credentialScope","hashedCanonicalRequest","crypto","stringToSign","createStringToSign","kSecret","kDate","kRegion","kService","normalizedURISegments","split","URISegment","pop","push","leading","startsWith","URI","trailing","endsWith","normalizedURI","encodeURIComponent","replace","serialized","escapeURI","Array","isArray","slice","reduce","encoded","concat","filter","canonicalHeaderName","has","trim","requestCopy","JSON","parse","stringify","lowerCaseName","ignoreKeys","includes","c","charCodeAt","toUpperCase","date","time","Number","toDate","toISOString","S3Client","awsConfig","serviceName","signedRequest","sign","host","res","http","_handle_error","buckets","children","each","_","bucketDefinition","bucket","forEach","child","nodeName","assign","textContent","creationDate","bucketName","prefix","objects","objectDefinition","lastModified","etag","size","parseInt","storageClass","objectKey","S3Object","data","Host","uploads","S3MultipartUpload","uploadId","partNumber","S3Part","parts","part","eTag","operation","response","status","errorCode","error_code","errorMessage","error","S3ServiceError","awsError","parseXML","_host","_scheme","S3Bucket"],"sourceRoot":""} \ No newline at end of file diff --git a/src/internal/s3.ts b/src/internal/s3.ts index 5b7fd5c..10f715f 100644 --- a/src/internal/s3.ts +++ b/src/internal/s3.ts @@ -291,7 +291,7 @@ export class S3Client extends AWSClient { hostname: host, path: `/${objectKey}`, headers: {}, - query: { 'uploads': '' }, + query: { uploads: '' }, }, {} ) From 5badee418fdb9493c643bc25533c6541eefd3295 Mon Sep 17 00:00:00 2001 From: Imma Valls Date: Tue, 9 May 2023 17:47:58 +0200 Subject: [PATCH 3/4] add @oleiade's example --- examples/s3-multipart.js | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 examples/s3-multipart.js diff --git a/examples/s3-multipart.js b/examples/s3-multipart.js new file mode 100644 index 0000000..02a6ef5 --- /dev/null +++ b/examples/s3-multipart.js @@ -0,0 +1,72 @@ +import crypto from 'k6/crypto' +import exec from 'k6/execution' + +import { AWSConfig, S3Client } from '../build/s3.js' + +/*const awsConfig = new AWSConfig({ + region: __ENV.AWS_REGION, + accessKeyId: __ENV.AWS_ACCESS_KEY_ID, + secretAccessKey: __ENV.AWS_SECRET_ACCESS_KEY, + sessionToken: __ENV.AWS_SESSION_TOKEN, +})*/ +const awsConfig = new AWSConfig({ + region: "eu-west-3", + accessKeyId: "ASIAZYJUID53S35IO6NP", + secretAccessKey: "hPS0QnSHi5MiOhwSM78fvpteimg2sVlawDbCDhZ0", + sessionToken: "IQoJb3JpZ2luX2VjEEYaCWV1LXdlc3QtMyJGMEQCIH9dP4H8wAOQ55+al+3j+8bBQVO9nO/sJaQsDFEgBDezAiAWSiTU8O1VXJtbKodtg7XCRknNvkevbi5fKK17xRJmOSrvAQhfEAAaDDY3MDY2MTM1MzMzNSIMwAsVxreryDzIE8acKswBpUzch3YqXv6Y92XscbKhlkLOwu8fSAdKC2BODF3LPpEb82I30mGxwkzY4PToMOt2htrmqGgj/MR6hyfIhKBdU/JYQGnbV045u40gS/qAvEhh69r9jKNS7UrGlrRtuKxpkQXBLIcRK+gycyJOfl5oBW4PS4HhGEWlPo3A92Xr7QSrao9P2D1sXQxEwkBHrmu49fEwf3kvkAMGrO4Sh2jRzrPOlQb+7Ql/XrNynymUpjJxSeOWByuv7OI1m0smcfpFPLNDlM0TlUMayAJmMOT946IGOpkBSUE1w+2hT2Qa1QU8gYRtmBQFMEiti9CHXwmmIjBUl1NCaekWkm4SoTX0EtBd9PjYOs2ts8m0FyuvHAt3ypTnjeciS+DQvtkS11J+w9x3QGvqBzCs+jn+jQ+7FxOPMYRpQEHULzrDQENL5o2PxNS9vdsv1KJ9ax71dUjsj2nrCTeOwldzkkiNdnUdNvx5e9BPE2bCPR+MIZ2/" +}); + +const s3 = new S3Client(awsConfig) + +//const testBucketName = 'test-jslib-aws' +const testBucketName = 'imma-test-jslib-aws' +const testFileKey = 'multipart.txt' + +export default function () { + // List the buckets the AWS authentication configuration + // gives us access to. + const buckets = s3.listBuckets() + + // If our test bucket does not exist, abort the execution. + if (buckets.filter((b) => b.name === testBucketName).length == 0) { + exec.test.abort() + } + + // Produce random bytes to upload of size ~12MB, that + // we will upload in two 6MB parts. This is done as the + // minimum part size supported by S3 is 5MB. + const bigFile = crypto.randomBytes(12 * 1024 * 1024) + + // Initialize a multipart upload + const multipartUpload = s3.createMultipartUpload(testBucketName, testFileKey) + + // Upload the first part + const firstPartData = bigFile.slice(0, 6 * 1024 * 1024) + const firstPart = s3.uploadPart( + testBucketName, + testFileKey, + multipartUpload.uploadId, + 1, + firstPartData + ) + + // Upload the second part + const secondPartData = bigFile.slice(6 * 1024 * 1024, 12 * 1024 * 1024) + const secondPart = s3.uploadPart( + testBucketName, + testFileKey, + multipartUpload.uploadId, + 2, + secondPartData + ) + + // Complete the multipart upload + s3.completeMultipartUpload(testBucketName, testFileKey, multipartUpload.uploadId, [ + firstPart, + secondPart, + ]) + + // Let's redownload it verify it's correct, and delete it + const obj = s3.getObject(testBucketName, testFileKey) + s3.deleteObject(testBucketName, testFileKey) +} \ No newline at end of file From ce4c00554cff124511086f27987e06e0ab1fefb7 Mon Sep 17 00:00:00 2001 From: Imma Valls Date: Tue, 9 May 2023 17:56:59 +0200 Subject: [PATCH 4/4] Update s3-multipart.js correct file --- examples/s3-multipart.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/examples/s3-multipart.js b/examples/s3-multipart.js index 02a6ef5..3732445 100644 --- a/examples/s3-multipart.js +++ b/examples/s3-multipart.js @@ -3,23 +3,17 @@ import exec from 'k6/execution' import { AWSConfig, S3Client } from '../build/s3.js' -/*const awsConfig = new AWSConfig({ +const awsConfig = new AWSConfig({ region: __ENV.AWS_REGION, accessKeyId: __ENV.AWS_ACCESS_KEY_ID, secretAccessKey: __ENV.AWS_SECRET_ACCESS_KEY, sessionToken: __ENV.AWS_SESSION_TOKEN, -})*/ -const awsConfig = new AWSConfig({ - region: "eu-west-3", - accessKeyId: "ASIAZYJUID53S35IO6NP", - secretAccessKey: "hPS0QnSHi5MiOhwSM78fvpteimg2sVlawDbCDhZ0", - sessionToken: "IQoJb3JpZ2luX2VjEEYaCWV1LXdlc3QtMyJGMEQCIH9dP4H8wAOQ55+al+3j+8bBQVO9nO/sJaQsDFEgBDezAiAWSiTU8O1VXJtbKodtg7XCRknNvkevbi5fKK17xRJmOSrvAQhfEAAaDDY3MDY2MTM1MzMzNSIMwAsVxreryDzIE8acKswBpUzch3YqXv6Y92XscbKhlkLOwu8fSAdKC2BODF3LPpEb82I30mGxwkzY4PToMOt2htrmqGgj/MR6hyfIhKBdU/JYQGnbV045u40gS/qAvEhh69r9jKNS7UrGlrRtuKxpkQXBLIcRK+gycyJOfl5oBW4PS4HhGEWlPo3A92Xr7QSrao9P2D1sXQxEwkBHrmu49fEwf3kvkAMGrO4Sh2jRzrPOlQb+7Ql/XrNynymUpjJxSeOWByuv7OI1m0smcfpFPLNDlM0TlUMayAJmMOT946IGOpkBSUE1w+2hT2Qa1QU8gYRtmBQFMEiti9CHXwmmIjBUl1NCaekWkm4SoTX0EtBd9PjYOs2ts8m0FyuvHAt3ypTnjeciS+DQvtkS11J+w9x3QGvqBzCs+jn+jQ+7FxOPMYRpQEHULzrDQENL5o2PxNS9vdsv1KJ9ax71dUjsj2nrCTeOwldzkkiNdnUdNvx5e9BPE2bCPR+MIZ2/" -}); +}) + const s3 = new S3Client(awsConfig) -//const testBucketName = 'test-jslib-aws' -const testBucketName = 'imma-test-jslib-aws' +const testBucketName = 'test-jslib-aws' const testFileKey = 'multipart.txt' export default function () { @@ -69,4 +63,4 @@ export default function () { // Let's redownload it verify it's correct, and delete it const obj = s3.getObject(testBucketName, testFileKey) s3.deleteObject(testBucketName, testFileKey) -} \ No newline at end of file +}