{"version":3,"sources":["webpack:///./node_modules/aws-sdk/lib/signers/request_signer.js","webpack:///./node_modules/aws-sdk/lib/signers/v2.js","webpack:///./node_modules/aws-sdk/lib/signers/v4_credentials.js","webpack:///./node_modules/aws-sdk/lib/services/iotdata.js","webpack:///./node_modules/aws-sdk/lib/signers/presign.js","webpack:///./node_modules/aws-sdk/lib/services/machinelearning.js","webpack:///./node_modules/aws-sdk/lib/services/cognitoidentity.js","webpack:///./node_modules/aws-sdk/lib/signers/v4.js","webpack:///./node_modules/aws-sdk/lib/services/ec2.js","webpack:///./node_modules/aws-sdk/lib/services/lambda.js","webpack:///./node_modules/aws-sdk/lib/signers/v3.js","webpack:///./node_modules/aws-sdk/lib/services/apigateway.js","webpack:///./node_modules/aws-sdk/lib/signers/s3.js","webpack:///./node_modules/aws-sdk/lib/services/s3.js","webpack:///./node_modules/aws-sdk/lib/signers/v3https.js","webpack:///./node_modules/aws-sdk/lib/services/route53.js","webpack:///./node_modules/aws-sdk/lib/services/cloudfront.js","webpack:///./node_modules/aws-sdk/lib/response.js","webpack:///./node_modules/aws-sdk/lib/sequential_executor.js","webpack:///./node_modules/aws-sdk/lib/request.js","webpack:///./node_modules/aws-sdk/lib/service.js","webpack:///./node_modules/aws-sdk/lib/services/sqs.js","webpack:///./node_modules/aws-sdk/lib/services/polly.js","webpack:///./node_modules/aws-sdk/lib/resource_waiter.js","webpack:///./node_modules/aws-sdk/lib/s3/managed_upload.js","webpack:///./node_modules/aws-sdk/lib/services/dynamodb.js","webpack:///./node_modules/aws-sdk/lib/services/sts.js","webpack:///./node_modules/aws-sdk/lib/services/rds.js","webpack:///./node_modules/aws-sdk/lib/state_machine.js"],"names":["AWS","inherit","util","Signers","RequestSigner","constructor","request","this","setServiceClientId","id","serviceClientId","getServiceClientId","getVersion","version","V2","V3","V4","S3","V3Https","Error","addAuthorization","credentials","date","getDate","r","params","Timestamp","iso8601","SignatureVersion","SignatureMethod","AWSAccessKeyId","accessKeyId","sessionToken","SecurityToken","Signature","signature","body","queryParamsToString","headers","length","crypto","hmac","secretAccessKey","stringToSign","parts","push","method","endpoint","host","toLowerCase","pathname","join","module","exports","cachedSecret","cacheQueue","maxCacheEntries","v4Identifier","createScope","region","serviceName","substr","getSigningKey","service","shouldCache","credsIdentifier","cacheKey","kDate","kRegion","kService","signingKey","shift","emptyCache","blobPayloadOutputOps","update","IotData","prototype","validateService","config","indexOf","msg","error","name","message","setupRequestListeners","addListener","validateResponseBody","operation","convertPayloadToString","resp","httpResponse","toString","bodyCheck","trim","charAt","expiresHeader","signedUrlBuilder","expires","httpRequest","signerClass","getSignerClass","code","retryable","now","getSkewCorrectedDate","parseInt","unixTimestamp","signedUrlSigner","parsedUrl","urlParse","path","queryParams","search","queryStringParse","auth","split","each","key","value","rest","match","Presign","sign","expireTime","callback","on","removeListener","EventListeners","Core","SET_CONTENT_LENGTH","COMPUTE_SHA256","emit","build","response","urlFormat","MachineLearning","buildEndpoint","url","PredictEndpoint","Endpoint","CognitoIdentity","getOpenIdToken","makeUnauthenticatedRequest","getId","getCredentialsForIdentity","v4Credentials","options","call","signatureCache","signatureVersion","algorithm","datetime","replace","isPresigned","updateForPresigned","addHeaders","authorization","credString","credentialString","qs","signedHeaders","isSignableHeader","lowerKey","sep","hexEncodedHash","canonicalString","uriEscapePath","canonicalHeaders","hexEncodedBodyHash","item","sort","a","b","arrayEach","canonicalHeaderValues","values","keys","string","sha256","unsignableHeaders","EC2","Query","EXTRACT_ERROR","extractError","onAsync","buildCopySnapshotPresignedUrl","req","done","PresignedUrl","_subRequest","copy","DestinationRegion","SourceRegion","svc","newReq","presign","err","data","XML","Parser","parse","Errors","Code","Message","statusCode","requestId","RequestID","Lambda","rfc822","headersToSign","h","String","k","APIGateway","setAcceptHeader","Accept","exportType","subResources","responseHeaders","canonicalizedAmzHeaders","canonicalizedResource","amzHeaders","querystring","resource","virtualHostedBucket","resources","param","subresource","undefined","decodeURIComponent","res","secret","operationsWith200StatusCodeError","regionRedirectErrorCodes","getSignatureVersion","defaultApiVersion","api","userDefinedVersion","_originalConfig","regionDefinedVersion","messages","s3BucketEndpoint","shouldDisableBodySigning","s3DisableBodySigning","protocol","prependListener","validateScheme","validateBucketEndpoint","correctBucketRegionFromCache","validateBucketName","addContentType","populateURI","computeContentMd5","computeSseCustomerKeyMd5","addExpect100Continue","VALIDATE_REGION","requestBucketRegion","extractData","hoistPayloadMember","prepareSignedUrl","isBrowser","reqRegionForNetworkingError","disableBodySigning","scheme","sensitive","SSECustomerKey","CopySourceSSECustomerKey","Bucket","bucket","Key","slashIndex","prefix","isValidAccelerateOperation","invalidOperations","pathStyleBucketName","useAccelerateEndpoint","useDualstack","hostname","port","removeVirtualHostedBucketFromPath","encodedS3Key","RegExp","len","isNode","Body","stream","Stream","contentType","replaceFn","_","charsetName","toUpperCase","charset","computableChecksumOperations","putBucketCors","putBucketLifecycle","putBucketLifecycleConfiguration","putBucketTagging","deleteObjects","putBucketReplication","putObjectLegalHold","putObjectRetention","putObjectLockConfiguration","willComputeChecksums","computeChecksums","Buffer","isBuffer","rules","operations","input","members","Object","hasOwnProperty","ContentMD5","required","md5","header","bucketName","s3ForcePathStyle","dnsCompatibleBucketName","sslEnabled","domain","ipAddress","dots","successfulResponse","retryableError","_requestRegionForBucket","bucketRegionCache","updateReqBucketRegion","_super","Service","s3Config","newConfig","Host","_asm","currentState","LocationConstraint","createBucketConfiguration","CreateBucketConfiguration","clearBucketRegionCache","extractRequestIds","cachedRegion","codes","304","403","400","404","Region","reqOperation","reqParams","MaxKeys","regionReq","send","getRegionReq","listObjects","buckets","i","requestRegion","extendedRequestId","cfId","getSignedUrl","Expires","makeRequest","defer","createPresignedPost","boundParams","self","finalizePost","fields","preparePostFields","Fields","Conditions","getCredentials","conditions","expiresInSeconds","slice","signingDate","shortDate","scope","credential","field","condition","Policy","preparePostPolicy","Date","valueOf","expiration","base64","encode","JSON","stringify","noPresignedContentLength","ContentLength","createBucket","globalEndpoint","upload","merge","uploader","ManagedUpload","Route53","sanitizeUrl","CloudFront","jmespath","Response","retryCount","redirectCount","HttpResponse","maxRetries","numRetries","maxRedirects","nextPage","paginationConfig","e","hasNextPage","nextPageTokens","inputTokens","inputToken","cacheNextPageTokens","moreResults","exprs","outputToken","expr","output","SequentialExecutor","_events","listeners","eventName","listener","toHead","unshift","_isAsync","position","splice","removeAllListeners","eventArgs","doneCallback","count","callListeners","args","prevError","callNextListener","_haltHandlersOnError","apply","concat","addListeners","event","callbacks","addNamedListener","addNamedAsyncListener","addNamedListeners","arguments","AcceptorStateMachine","hardErrorStates","success","complete","isTerminalState","machine","fsm","setupStates","transition","Domain","domainEmitter","domainThrown","addState","Request","customUserAgent","isGlobalEndpoint","active","HttpRequest","appendToUserAgent","startTime","states","emitEvent","runTo","state","abort","didCallback","_abortCallback","eachPage","wrappedCallback","result","fn","noop","makeAsync","eachItem","resultKey","Array","isArray","items","continueIteration","isPageable","createReadStream","streams","HttpClient","streamsApiVersion","PassThrough","process","nextTick","readable","sent","HTTP_DATA","HTTP_ERROR","expectedLen","shouldCheckContentLength","isNaN","receivedLen","checkContentLengthAndEmit","end","httpStream","createUnbufferedStream","lengthAccumulator","_write","chunk","unpipe","pipe","arg","eventParameters","origEmit","toGet","toUnauthenticated","_unAuthenticated","VALIDATE_CREDENTIALS","SIGN","buildAsGet","haltHandlersOnError","addPromisesToClass","PromiseDependency","promise","resolve","reject","defineProperty","deletePromisesFromClass","addPromises","mixin","Api","regionConfig","clientCount","loadServiceClass","ServiceClass","originalConfig","get","enumerable","configurable","_clientId","initialize","svcConfig","serviceIdentifier","Config","endpointFromTemplate","setEndpoint","addDefaultMonitoringListeners","clientSideMonitoring","_clientSideMonitoring","publisher","eventHandler","serviceConfig","isEmpty","apiConfig","defineServiceApi","services","apiVersions","apiVersion","getLatestServiceClass","getLatestServiceVersion","isType","selectedVersion","defaultRetryCount","customizeRequests","customRequestHandler","addAllRequestListeners","attachMonitoringEmitter","waitFor","waiter","ResourceWaiter","wait","list","events","serviceInterface","CorePost","paramValidation","VALIDATE_PARAMETERS","logger","Logger","apiCallEvent","monitoringEvent","Type","Version","serviceId","endpointPrefix","MaxRetriesExceeded","UserAgent","getUserAgent","FinalHttpStatusCode","FinalAwsException","FinalAwsExceptionMessage","FinalSdkException","FinalSdkExceptionMessage","apiAttemptEvent","Fqdn","HttpStatusCode","AccessKey","SessionToken","XAmznRequestId","XAmzRequestId","XAmzId2","attemptFailEvent","AwsException","AwsExceptionMessage","SdkException","SdkExceptionMessage","attemptTimestamp","attemptStartRealTime","attemptLatency","callStartRealTime","callTimestamp","attemptCount","addToHead","realClock","Math","round","AttemptLatency","AttemptCount","latency","Latency","authtype","Json","RestJson","RestXml","retryDelays","calculateRetryDelay","retryDelayOptions","timeoutError","networkingError","expiredCredentialsError","throttledError","clockSkewError","systemClockOffset","applyClockOffset","newServerTime","isClockSkewed","abs","getTime","throwException","paginator","defineMethods","defineService","versions","features","_serviceMap","addVersions","identifier","Publisher","configProvider","publisherConfig","enabled","superclass","setApi","isApi","apiLoader","hasService","attachOn","baseClass","getPrototypeOf","SQS","verifySendMessageChecksum","verifySendMessageBatchChecksum","verifyReceiveMessageChecksum","MD5OfMessageBody","MessageBody","calculatedMd5","calculateChecksum","throwInvalidChecksumError","MessageId","entries","errors","messageIds","Successful","entry","Id","Entries","isChecksumValid","Messages","MD5OfBody","ids","checksum","QueueUrl","matches","CHECK_ACCEPTORS","_waiter","acceptors","acceptorMatched","forEach","acceptor","matcher","matchers","expected","argument","setSuccess","setError","loadWaiterConfig","strictDeepEqual","pathAll","results","numResults","ind","pathAny","status","add","retryDelay","delay","$waiter","maxAttempts","waiters","byteLength","sliceFn","completeInfo","fillQueue","configure","partSize","minPartSize","queueSize","leavePartsOnError","tags","bindServiceObject","validateBody","adjustTotalBytes","maxTotalParts","failed","runFill","fillBuffer","fillStream","partBuffers","cleanup","isDoneChunking","numParts","totalPartNumbers","doneParts","finishMultiPart","singlePart","buffer","toBuffer","arraySliceFn","__super__","totalBytes","newPartSize","ceil","partPos","totalChunkedBytes","totalUploadedBytes","activeParts","multipartReq","partBufferLength","bodyLen","nextChunk","endPos","min","buf","read","pbuf","isDoneSending","partNumber","Tagging","getTaggingHeader","putObject","_managedUpload","progress","finishSinglePart","ETag","UploadId","uploadPart","queueChunks","createMultipartUpload","kvPairStrings","uriEscape","Value","partParams","PartNumber","partInfo","_lastUploadedBytes","resume","abortMultipartUpload","part","completeParams","MultipartUpload","Parts","completeMultipartUpload","Location","putObjectTagging","TagSet","d","httpReq","info","loaded","total","promisifyMethod","DynamoDB","dynamoDbCrc32","EXTRACT_DATA","checkCrc32","streaming","crc32IsValid","crc","crc32","base","STS","credentialsFrom","TemporaryCredentials","expired","Credentials","AccessKeyId","SecretAccessKey","Expiration","assumeRoleWithWebIdentity","assumeRoleWithSAML","crossRegionOperations","RDS","PreSignedUrl","doesParamValidation","buildCrossRegionPresignedUrl","destinationRegion","finalState","bindObject","inputError","fail","accept","acceptState","failState"],"mappings":"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","file":"js/chunk-vendors~2d49760b.6b48a735.js","sourcesContent":["var AWS = require('../core');\n\nvar inherit = AWS.util.inherit;\n\n/**\n * @api private\n */\nAWS.Signers.RequestSigner = inherit({\n constructor: function RequestSigner(request) {\n this.request = request;\n },\n\n setServiceClientId: function setServiceClientId(id) {\n this.serviceClientId = id;\n },\n\n getServiceClientId: function getServiceClientId() {\n return this.serviceClientId;\n }\n});\n\nAWS.Signers.RequestSigner.getVersion = function getVersion(version) {\n switch (version) {\n case 'v2': return AWS.Signers.V2;\n case 'v3': return AWS.Signers.V3;\n case 's3v4': return AWS.Signers.V4;\n case 'v4': return AWS.Signers.V4;\n case 's3': return AWS.Signers.S3;\n case 'v3https': return AWS.Signers.V3Https;\n }\n throw new Error('Unknown signing version ' + version);\n};\n\nrequire('./v2');\nrequire('./v3');\nrequire('./v3https');\nrequire('./v4');\nrequire('./s3');\nrequire('./presign');\n","var AWS = require('../core');\nvar inherit = AWS.util.inherit;\n\n/**\n * @api private\n */\nAWS.Signers.V2 = inherit(AWS.Signers.RequestSigner, {\n addAuthorization: function addAuthorization(credentials, date) {\n\n if (!date) date = AWS.util.date.getDate();\n\n var r = this.request;\n\n r.params.Timestamp = AWS.util.date.iso8601(date);\n r.params.SignatureVersion = '2';\n r.params.SignatureMethod = 'HmacSHA256';\n r.params.AWSAccessKeyId = credentials.accessKeyId;\n\n if (credentials.sessionToken) {\n r.params.SecurityToken = credentials.sessionToken;\n }\n\n delete r.params.Signature; // delete old Signature for re-signing\n r.params.Signature = this.signature(credentials);\n\n r.body = AWS.util.queryParamsToString(r.params);\n r.headers['Content-Length'] = r.body.length;\n },\n\n signature: function signature(credentials) {\n return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64');\n },\n\n stringToSign: function stringToSign() {\n var parts = [];\n parts.push(this.request.method);\n parts.push(this.request.endpoint.host.toLowerCase());\n parts.push(this.request.pathname());\n parts.push(AWS.util.queryParamsToString(this.request.params));\n return parts.join('\\n');\n }\n\n});\n\n/**\n * @api private\n */\nmodule.exports = AWS.Signers.V2;\n","var AWS = require('../core');\n\n/**\n * @api private\n */\nvar cachedSecret = {};\n\n/**\n * @api private\n */\nvar cacheQueue = [];\n\n/**\n * @api private\n */\nvar maxCacheEntries = 50;\n\n/**\n * @api private\n */\nvar v4Identifier = 'aws4_request';\n\n/**\n * @api private\n */\nmodule.exports = {\n /**\n * @api private\n *\n * @param date [String]\n * @param region [String]\n * @param serviceName [String]\n * @return [String]\n */\n createScope: function createScope(date, region, serviceName) {\n return [\n date.substr(0, 8),\n region,\n serviceName,\n v4Identifier\n ].join('/');\n },\n\n /**\n * @api private\n *\n * @param credentials [Credentials]\n * @param date [String]\n * @param region [String]\n * @param service [String]\n * @param shouldCache [Boolean]\n * @return [String]\n */\n getSigningKey: function getSigningKey(\n credentials,\n date,\n region,\n service,\n shouldCache\n ) {\n var credsIdentifier = AWS.util.crypto\n .hmac(credentials.secretAccessKey, credentials.accessKeyId, 'base64');\n var cacheKey = [credsIdentifier, date, region, service].join('_');\n shouldCache = shouldCache !== false;\n if (shouldCache && (cacheKey in cachedSecret)) {\n return cachedSecret[cacheKey];\n }\n\n var kDate = AWS.util.crypto.hmac(\n 'AWS4' + credentials.secretAccessKey,\n date,\n 'buffer'\n );\n var kRegion = AWS.util.crypto.hmac(kDate, region, 'buffer');\n var kService = AWS.util.crypto.hmac(kRegion, service, 'buffer');\n\n var signingKey = AWS.util.crypto.hmac(kService, v4Identifier, 'buffer');\n if (shouldCache) {\n cachedSecret[cacheKey] = signingKey;\n cacheQueue.push(cacheKey);\n if (cacheQueue.length > maxCacheEntries) {\n // remove the oldest entry (not the least recently used)\n delete cachedSecret[cacheQueue.shift()];\n }\n }\n\n return signingKey;\n },\n\n /**\n * @api private\n *\n * Empties the derived signing key cache. Made available for testing purposes\n * only.\n */\n emptyCache: function emptyCache() {\n cachedSecret = {};\n cacheQueue = [];\n }\n};\n","var AWS = require('../core');\n\n/**\n * @api private\n */\nvar blobPayloadOutputOps = [\n 'deleteThingShadow',\n 'getThingShadow',\n 'updateThingShadow'\n];\n\n/**\n * Constructs a service interface object. Each API operation is exposed as a\n * function on service.\n *\n * ### Sending a Request Using IotData\n *\n * ```javascript\n * var iotdata = new AWS.IotData({endpoint: 'my.host.tld'});\n * iotdata.getThingShadow(params, function (err, data) {\n * if (err) console.log(err, err.stack); // an error occurred\n * else console.log(data); // successful response\n * });\n * ```\n *\n * ### Locking the API Version\n *\n * In order to ensure that the IotData object uses this specific API,\n * you can construct the object by passing the `apiVersion` option to the\n * constructor:\n *\n * ```javascript\n * var iotdata = new AWS.IotData({\n * endpoint: 'my.host.tld',\n * apiVersion: '2015-05-28'\n * });\n * ```\n *\n * You can also set the API version globally in `AWS.config.apiVersions` using\n * the **iotdata** service identifier:\n *\n * ```javascript\n * AWS.config.apiVersions = {\n * iotdata: '2015-05-28',\n * // other service API versions\n * };\n *\n * var iotdata = new AWS.IotData({endpoint: 'my.host.tld'});\n * ```\n *\n * @note You *must* provide an `endpoint` configuration parameter when\n * constructing this service. See {constructor} for more information.\n *\n * @!method constructor(options = {})\n * Constructs a service object. This object has one method for each\n * API operation.\n *\n * @example Constructing a IotData object\n * var iotdata = new AWS.IotData({endpoint: 'my.host.tld'});\n * @note You *must* provide an `endpoint` when constructing this service.\n * @option (see AWS.Config.constructor)\n *\n * @service iotdata\n * @version 2015-05-28\n */\nAWS.util.update(AWS.IotData.prototype, {\n /**\n * @api private\n */\n validateService: function validateService() {\n if (!this.config.endpoint || this.config.endpoint.indexOf('{') >= 0) {\n var msg = 'AWS.IotData requires an explicit ' +\n '`endpoint\\' configuration option.';\n throw AWS.util.error(new Error(),\n {name: 'InvalidEndpoint', message: msg});\n }\n },\n\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n request.addListener('validateResponse', this.validateResponseBody);\n if (blobPayloadOutputOps.indexOf(request.operation) > -1) {\n request.addListener('extractData', AWS.util.convertPayloadToString);\n }\n },\n\n /**\n * @api private\n */\n validateResponseBody: function validateResponseBody(resp) {\n var body = resp.httpResponse.body.toString() || '{}';\n var bodyCheck = body.trim();\n if (!bodyCheck || bodyCheck.charAt(0) !== '{') {\n resp.httpResponse.body = '';\n }\n }\n\n});\n","var AWS = require('../core');\nvar inherit = AWS.util.inherit;\n\n/**\n * @api private\n */\nvar expiresHeader = 'presigned-expires';\n\n/**\n * @api private\n */\nfunction signedUrlBuilder(request) {\n var expires = request.httpRequest.headers[expiresHeader];\n var signerClass = request.service.getSignerClass(request);\n\n delete request.httpRequest.headers['User-Agent'];\n delete request.httpRequest.headers['X-Amz-User-Agent'];\n\n if (signerClass === AWS.Signers.V4) {\n if (expires > 604800) { // one week expiry is invalid\n var message = 'Presigning does not support expiry time greater ' +\n 'than a week with SigV4 signing.';\n throw AWS.util.error(new Error(), {\n code: 'InvalidExpiryTime', message: message, retryable: false\n });\n }\n request.httpRequest.headers[expiresHeader] = expires;\n } else if (signerClass === AWS.Signers.S3) {\n var now = request.service ? request.service.getSkewCorrectedDate() : AWS.util.date.getDate();\n request.httpRequest.headers[expiresHeader] = parseInt(\n AWS.util.date.unixTimestamp(now) + expires, 10).toString();\n } else {\n throw AWS.util.error(new Error(), {\n message: 'Presigning only supports S3 or SigV4 signing.',\n code: 'UnsupportedSigner', retryable: false\n });\n }\n}\n\n/**\n * @api private\n */\nfunction signedUrlSigner(request) {\n var endpoint = request.httpRequest.endpoint;\n var parsedUrl = AWS.util.urlParse(request.httpRequest.path);\n var queryParams = {};\n\n if (parsedUrl.search) {\n queryParams = AWS.util.queryStringParse(parsedUrl.search.substr(1));\n }\n\n var auth = request.httpRequest.headers['Authorization'].split(' ');\n if (auth[0] === 'AWS') {\n auth = auth[1].split(':');\n queryParams['AWSAccessKeyId'] = auth[0];\n queryParams['Signature'] = auth[1];\n\n AWS.util.each(request.httpRequest.headers, function (key, value) {\n if (key === expiresHeader) key = 'Expires';\n if (key.indexOf('x-amz-meta-') === 0) {\n // Delete existing, potentially not normalized key\n delete queryParams[key];\n key = key.toLowerCase();\n }\n queryParams[key] = value;\n });\n delete request.httpRequest.headers[expiresHeader];\n delete queryParams['Authorization'];\n delete queryParams['Host'];\n } else if (auth[0] === 'AWS4-HMAC-SHA256') { // SigV4 signing\n auth.shift();\n var rest = auth.join(' ');\n var signature = rest.match(/Signature=(.*?)(?:,|\\s|\\r?\\n|$)/)[1];\n queryParams['X-Amz-Signature'] = signature;\n delete queryParams['Expires'];\n }\n\n // build URL\n endpoint.pathname = parsedUrl.pathname;\n endpoint.search = AWS.util.queryParamsToString(queryParams);\n}\n\n/**\n * @api private\n */\nAWS.Signers.Presign = inherit({\n /**\n * @api private\n */\n sign: function sign(request, expireTime, callback) {\n request.httpRequest.headers[expiresHeader] = expireTime || 3600;\n request.on('build', signedUrlBuilder);\n request.on('sign', signedUrlSigner);\n request.removeListener('afterBuild',\n AWS.EventListeners.Core.SET_CONTENT_LENGTH);\n request.removeListener('afterBuild',\n AWS.EventListeners.Core.COMPUTE_SHA256);\n\n request.emit('beforePresign', [request]);\n\n if (callback) {\n request.build(function() {\n if (this.response.error) callback(this.response.error);\n else {\n callback(null, AWS.util.urlFormat(request.httpRequest.endpoint));\n }\n });\n } else {\n request.build();\n if (request.response.error) throw request.response.error;\n return AWS.util.urlFormat(request.httpRequest.endpoint);\n }\n }\n});\n\n/**\n * @api private\n */\nmodule.exports = AWS.Signers.Presign;\n","var AWS = require('../core');\n\nAWS.util.update(AWS.MachineLearning.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n if (request.operation === 'predict') {\n request.addListener('build', this.buildEndpoint);\n }\n },\n\n /**\n * Updates request endpoint from PredictEndpoint\n * @api private\n */\n buildEndpoint: function buildEndpoint(request) {\n var url = request.params.PredictEndpoint;\n if (url) {\n request.httpRequest.endpoint = new AWS.Endpoint(url);\n }\n }\n\n});\n","var AWS = require('../core');\n\nAWS.util.update(AWS.CognitoIdentity.prototype, {\n getOpenIdToken: function getOpenIdToken(params, callback) {\n return this.makeUnauthenticatedRequest('getOpenIdToken', params, callback);\n },\n\n getId: function getId(params, callback) {\n return this.makeUnauthenticatedRequest('getId', params, callback);\n },\n\n getCredentialsForIdentity: function getCredentialsForIdentity(params, callback) {\n return this.makeUnauthenticatedRequest('getCredentialsForIdentity', params, callback);\n }\n});\n","var AWS = require('../core');\nvar v4Credentials = require('./v4_credentials');\nvar inherit = AWS.util.inherit;\n\n/**\n * @api private\n */\nvar expiresHeader = 'presigned-expires';\n\n/**\n * @api private\n */\nAWS.Signers.V4 = inherit(AWS.Signers.RequestSigner, {\n constructor: function V4(request, serviceName, options) {\n AWS.Signers.RequestSigner.call(this, request);\n this.serviceName = serviceName;\n options = options || {};\n this.signatureCache = typeof options.signatureCache === 'boolean' ? options.signatureCache : true;\n this.operation = options.operation;\n this.signatureVersion = options.signatureVersion;\n },\n\n algorithm: 'AWS4-HMAC-SHA256',\n\n addAuthorization: function addAuthorization(credentials, date) {\n var datetime = AWS.util.date.iso8601(date).replace(/[:\\-]|\\.\\d{3}/g, '');\n\n if (this.isPresigned()) {\n this.updateForPresigned(credentials, datetime);\n } else {\n this.addHeaders(credentials, datetime);\n }\n\n this.request.headers['Authorization'] =\n this.authorization(credentials, datetime);\n },\n\n addHeaders: function addHeaders(credentials, datetime) {\n this.request.headers['X-Amz-Date'] = datetime;\n if (credentials.sessionToken) {\n this.request.headers['x-amz-security-token'] = credentials.sessionToken;\n }\n },\n\n updateForPresigned: function updateForPresigned(credentials, datetime) {\n var credString = this.credentialString(datetime);\n var qs = {\n 'X-Amz-Date': datetime,\n 'X-Amz-Algorithm': this.algorithm,\n 'X-Amz-Credential': credentials.accessKeyId + '/' + credString,\n 'X-Amz-Expires': this.request.headers[expiresHeader],\n 'X-Amz-SignedHeaders': this.signedHeaders()\n };\n\n if (credentials.sessionToken) {\n qs['X-Amz-Security-Token'] = credentials.sessionToken;\n }\n\n if (this.request.headers['Content-Type']) {\n qs['Content-Type'] = this.request.headers['Content-Type'];\n }\n if (this.request.headers['Content-MD5']) {\n qs['Content-MD5'] = this.request.headers['Content-MD5'];\n }\n if (this.request.headers['Cache-Control']) {\n qs['Cache-Control'] = this.request.headers['Cache-Control'];\n }\n\n // need to pull in any other X-Amz-* headers\n AWS.util.each.call(this, this.request.headers, function(key, value) {\n if (key === expiresHeader) return;\n if (this.isSignableHeader(key)) {\n var lowerKey = key.toLowerCase();\n // Metadata should be normalized\n if (lowerKey.indexOf('x-amz-meta-') === 0) {\n qs[lowerKey] = value;\n } else if (lowerKey.indexOf('x-amz-') === 0) {\n qs[key] = value;\n }\n }\n });\n\n var sep = this.request.path.indexOf('?') >= 0 ? '&' : '?';\n this.request.path += sep + AWS.util.queryParamsToString(qs);\n },\n\n authorization: function authorization(credentials, datetime) {\n var parts = [];\n var credString = this.credentialString(datetime);\n parts.push(this.algorithm + ' Credential=' +\n credentials.accessKeyId + '/' + credString);\n parts.push('SignedHeaders=' + this.signedHeaders());\n parts.push('Signature=' + this.signature(credentials, datetime));\n return parts.join(', ');\n },\n\n signature: function signature(credentials, datetime) {\n var signingKey = v4Credentials.getSigningKey(\n credentials,\n datetime.substr(0, 8),\n this.request.region,\n this.serviceName,\n this.signatureCache\n );\n return AWS.util.crypto.hmac(signingKey, this.stringToSign(datetime), 'hex');\n },\n\n stringToSign: function stringToSign(datetime) {\n var parts = [];\n parts.push('AWS4-HMAC-SHA256');\n parts.push(datetime);\n parts.push(this.credentialString(datetime));\n parts.push(this.hexEncodedHash(this.canonicalString()));\n return parts.join('\\n');\n },\n\n canonicalString: function canonicalString() {\n var parts = [], pathname = this.request.pathname();\n if (this.serviceName !== 's3' && this.signatureVersion !== 's3v4') pathname = AWS.util.uriEscapePath(pathname);\n\n parts.push(this.request.method);\n parts.push(pathname);\n parts.push(this.request.search());\n parts.push(this.canonicalHeaders() + '\\n');\n parts.push(this.signedHeaders());\n parts.push(this.hexEncodedBodyHash());\n return parts.join('\\n');\n },\n\n canonicalHeaders: function canonicalHeaders() {\n var headers = [];\n AWS.util.each.call(this, this.request.headers, function (key, item) {\n headers.push([key, item]);\n });\n headers.sort(function (a, b) {\n return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : 1;\n });\n var parts = [];\n AWS.util.arrayEach.call(this, headers, function (item) {\n var key = item[0].toLowerCase();\n if (this.isSignableHeader(key)) {\n var value = item[1];\n if (typeof value === 'undefined' || value === null || typeof value.toString !== 'function') {\n throw AWS.util.error(new Error('Header ' + key + ' contains invalid value'), {\n code: 'InvalidHeader'\n });\n }\n parts.push(key + ':' +\n this.canonicalHeaderValues(value.toString()));\n }\n });\n return parts.join('\\n');\n },\n\n canonicalHeaderValues: function canonicalHeaderValues(values) {\n return values.replace(/\\s+/g, ' ').replace(/^\\s+|\\s+$/g, '');\n },\n\n signedHeaders: function signedHeaders() {\n var keys = [];\n AWS.util.each.call(this, this.request.headers, function (key) {\n key = key.toLowerCase();\n if (this.isSignableHeader(key)) keys.push(key);\n });\n return keys.sort().join(';');\n },\n\n credentialString: function credentialString(datetime) {\n return v4Credentials.createScope(\n datetime.substr(0, 8),\n this.request.region,\n this.serviceName\n );\n },\n\n hexEncodedHash: function hash(string) {\n return AWS.util.crypto.sha256(string, 'hex');\n },\n\n hexEncodedBodyHash: function hexEncodedBodyHash() {\n var request = this.request;\n if (this.isPresigned() && this.serviceName === 's3' && !request.body) {\n return 'UNSIGNED-PAYLOAD';\n } else if (request.headers['X-Amz-Content-Sha256']) {\n return request.headers['X-Amz-Content-Sha256'];\n } else {\n return this.hexEncodedHash(this.request.body || '');\n }\n },\n\n unsignableHeaders: [\n 'authorization',\n 'content-type',\n 'content-length',\n 'user-agent',\n expiresHeader,\n 'expect',\n 'x-amzn-trace-id'\n ],\n\n isSignableHeader: function isSignableHeader(key) {\n if (key.toLowerCase().indexOf('x-amz-') === 0) return true;\n return this.unsignableHeaders.indexOf(key) < 0;\n },\n\n isPresigned: function isPresigned() {\n return this.request.headers[expiresHeader] ? true : false;\n }\n\n});\n\n/**\n * @api private\n */\nmodule.exports = AWS.Signers.V4;\n","var AWS = require('../core');\n\nAWS.util.update(AWS.EC2.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n request.removeListener('extractError', AWS.EventListeners.Query.EXTRACT_ERROR);\n request.addListener('extractError', this.extractError);\n\n if (request.operation === 'copySnapshot') {\n request.onAsync('validate', this.buildCopySnapshotPresignedUrl);\n }\n },\n\n /**\n * @api private\n */\n buildCopySnapshotPresignedUrl: function buildCopySnapshotPresignedUrl(req, done) {\n if (req.params.PresignedUrl || req._subRequest) {\n return done();\n }\n\n req.params = AWS.util.copy(req.params);\n req.params.DestinationRegion = req.service.config.region;\n\n var config = AWS.util.copy(req.service.config);\n delete config.endpoint;\n config.region = req.params.SourceRegion;\n var svc = new req.service.constructor(config);\n var newReq = svc[req.operation](req.params);\n newReq._subRequest = true;\n newReq.presign(function(err, url) {\n if (err) done(err);\n else {\n req.params.PresignedUrl = url;\n done();\n }\n });\n },\n\n /**\n * @api private\n */\n extractError: function extractError(resp) {\n // EC2 nests the error code and message deeper than other AWS Query services.\n var httpResponse = resp.httpResponse;\n var data = new AWS.XML.Parser().parse(httpResponse.body.toString() || '');\n if (data.Errors) {\n resp.error = AWS.util.error(new Error(), {\n code: data.Errors.Error.Code,\n message: data.Errors.Error.Message\n });\n } else {\n resp.error = AWS.util.error(new Error(), {\n code: httpResponse.statusCode,\n message: null\n });\n }\n resp.error.requestId = data.RequestID || null;\n }\n});\n","var AWS = require('../core');\n\nAWS.util.update(AWS.Lambda.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n if (request.operation === 'invoke') {\n request.addListener('extractData', AWS.util.convertPayloadToString);\n }\n }\n});\n\n","var AWS = require('../core');\nvar inherit = AWS.util.inherit;\n\n/**\n * @api private\n */\nAWS.Signers.V3 = inherit(AWS.Signers.RequestSigner, {\n addAuthorization: function addAuthorization(credentials, date) {\n\n var datetime = AWS.util.date.rfc822(date);\n\n this.request.headers['X-Amz-Date'] = datetime;\n\n if (credentials.sessionToken) {\n this.request.headers['x-amz-security-token'] = credentials.sessionToken;\n }\n\n this.request.headers['X-Amzn-Authorization'] =\n this.authorization(credentials, datetime);\n\n },\n\n authorization: function authorization(credentials) {\n return 'AWS3 ' +\n 'AWSAccessKeyId=' + credentials.accessKeyId + ',' +\n 'Algorithm=HmacSHA256,' +\n 'SignedHeaders=' + this.signedHeaders() + ',' +\n 'Signature=' + this.signature(credentials);\n },\n\n signedHeaders: function signedHeaders() {\n var headers = [];\n AWS.util.arrayEach(this.headersToSign(), function iterator(h) {\n headers.push(h.toLowerCase());\n });\n return headers.sort().join(';');\n },\n\n canonicalHeaders: function canonicalHeaders() {\n var headers = this.request.headers;\n var parts = [];\n AWS.util.arrayEach(this.headersToSign(), function iterator(h) {\n parts.push(h.toLowerCase().trim() + ':' + String(headers[h]).trim());\n });\n return parts.sort().join('\\n') + '\\n';\n },\n\n headersToSign: function headersToSign() {\n var headers = [];\n AWS.util.each(this.request.headers, function iterator(k) {\n if (k === 'Host' || k === 'Content-Encoding' || k.match(/^X-Amz/i)) {\n headers.push(k);\n }\n });\n return headers;\n },\n\n signature: function signature(credentials) {\n return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64');\n },\n\n stringToSign: function stringToSign() {\n var parts = [];\n parts.push(this.request.method);\n parts.push('/');\n parts.push('');\n parts.push(this.canonicalHeaders());\n parts.push(this.request.body);\n return AWS.util.crypto.sha256(parts.join('\\n'));\n }\n\n});\n\n/**\n * @api private\n */\nmodule.exports = AWS.Signers.V3;\n","var AWS = require('../core');\n\nAWS.util.update(AWS.APIGateway.prototype, {\n/**\n * Sets the Accept header to application/json.\n *\n * @api private\n */\n setAcceptHeader: function setAcceptHeader(req) {\n var httpRequest = req.httpRequest;\n if (!httpRequest.headers.Accept) {\n httpRequest.headers['Accept'] = 'application/json';\n }\n },\n\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n request.addListener('build', this.setAcceptHeader);\n if (request.operation === 'getExport') {\n var params = request.params || {};\n if (params.exportType === 'swagger') {\n request.addListener('extractData', AWS.util.convertPayloadToString);\n }\n }\n }\n});\n\n","var AWS = require('../core');\nvar inherit = AWS.util.inherit;\n\n/**\n * @api private\n */\nAWS.Signers.S3 = inherit(AWS.Signers.RequestSigner, {\n /**\n * When building the stringToSign, these sub resource params should be\n * part of the canonical resource string with their NON-decoded values\n */\n subResources: {\n 'acl': 1,\n 'accelerate': 1,\n 'analytics': 1,\n 'cors': 1,\n 'lifecycle': 1,\n 'delete': 1,\n 'inventory': 1,\n 'location': 1,\n 'logging': 1,\n 'metrics': 1,\n 'notification': 1,\n 'partNumber': 1,\n 'policy': 1,\n 'requestPayment': 1,\n 'replication': 1,\n 'restore': 1,\n 'tagging': 1,\n 'torrent': 1,\n 'uploadId': 1,\n 'uploads': 1,\n 'versionId': 1,\n 'versioning': 1,\n 'versions': 1,\n 'website': 1\n },\n\n // when building the stringToSign, these querystring params should be\n // part of the canonical resource string with their NON-encoded values\n responseHeaders: {\n 'response-content-type': 1,\n 'response-content-language': 1,\n 'response-expires': 1,\n 'response-cache-control': 1,\n 'response-content-disposition': 1,\n 'response-content-encoding': 1\n },\n\n addAuthorization: function addAuthorization(credentials, date) {\n if (!this.request.headers['presigned-expires']) {\n this.request.headers['X-Amz-Date'] = AWS.util.date.rfc822(date);\n }\n\n if (credentials.sessionToken) {\n // presigned URLs require this header to be lowercased\n this.request.headers['x-amz-security-token'] = credentials.sessionToken;\n }\n\n var signature = this.sign(credentials.secretAccessKey, this.stringToSign());\n var auth = 'AWS ' + credentials.accessKeyId + ':' + signature;\n\n this.request.headers['Authorization'] = auth;\n },\n\n stringToSign: function stringToSign() {\n var r = this.request;\n\n var parts = [];\n parts.push(r.method);\n parts.push(r.headers['Content-MD5'] || '');\n parts.push(r.headers['Content-Type'] || '');\n\n // This is the \"Date\" header, but we use X-Amz-Date.\n // The S3 signing mechanism requires us to pass an empty\n // string for this Date header regardless.\n parts.push(r.headers['presigned-expires'] || '');\n\n var headers = this.canonicalizedAmzHeaders();\n if (headers) parts.push(headers);\n parts.push(this.canonicalizedResource());\n\n return parts.join('\\n');\n\n },\n\n canonicalizedAmzHeaders: function canonicalizedAmzHeaders() {\n\n var amzHeaders = [];\n\n AWS.util.each(this.request.headers, function (name) {\n if (name.match(/^x-amz-/i))\n amzHeaders.push(name);\n });\n\n amzHeaders.sort(function (a, b) {\n return a.toLowerCase() < b.toLowerCase() ? -1 : 1;\n });\n\n var parts = [];\n AWS.util.arrayEach.call(this, amzHeaders, function (name) {\n parts.push(name.toLowerCase() + ':' + String(this.request.headers[name]));\n });\n\n return parts.join('\\n');\n\n },\n\n canonicalizedResource: function canonicalizedResource() {\n\n var r = this.request;\n\n var parts = r.path.split('?');\n var path = parts[0];\n var querystring = parts[1];\n\n var resource = '';\n\n if (r.virtualHostedBucket)\n resource += '/' + r.virtualHostedBucket;\n\n resource += path;\n\n if (querystring) {\n\n // collect a list of sub resources and query params that need to be signed\n var resources = [];\n\n AWS.util.arrayEach.call(this, querystring.split('&'), function (param) {\n var name = param.split('=')[0];\n var value = param.split('=')[1];\n if (this.subResources[name] || this.responseHeaders[name]) {\n var subresource = { name: name };\n if (value !== undefined) {\n if (this.subResources[name]) {\n subresource.value = value;\n } else {\n subresource.value = decodeURIComponent(value);\n }\n }\n resources.push(subresource);\n }\n });\n\n resources.sort(function (a, b) { return a.name < b.name ? -1 : 1; });\n\n if (resources.length) {\n\n querystring = [];\n AWS.util.arrayEach(resources, function (res) {\n if (res.value === undefined) {\n querystring.push(res.name);\n } else {\n querystring.push(res.name + '=' + res.value);\n }\n });\n\n resource += '?' + querystring.join('&');\n }\n\n }\n\n return resource;\n\n },\n\n sign: function sign(secret, string) {\n return AWS.util.crypto.hmac(secret, string, 'base64', 'sha1');\n }\n});\n\n/**\n * @api private\n */\nmodule.exports = AWS.Signers.S3;\n","var AWS = require('../core');\nvar v4Credentials = require('../signers/v4_credentials');\n\n// Pull in managed upload extension\nrequire('../s3/managed_upload');\n\n/**\n * @api private\n */\nvar operationsWith200StatusCodeError = {\n 'completeMultipartUpload': true,\n 'copyObject': true,\n 'uploadPartCopy': true\n};\n\n/**\n * @api private\n */\n var regionRedirectErrorCodes = [\n 'AuthorizationHeaderMalformed', // non-head operations on virtual-hosted global bucket endpoints\n 'BadRequest', // head operations on virtual-hosted global bucket endpoints\n 'PermanentRedirect', // non-head operations on path-style or regional endpoints\n 301 // head operations on path-style or regional endpoints\n ];\n\nAWS.util.update(AWS.S3.prototype, {\n /**\n * @api private\n */\n getSignatureVersion: function getSignatureVersion(request) {\n var defaultApiVersion = this.api.signatureVersion;\n var userDefinedVersion = this._originalConfig ? this._originalConfig.signatureVersion : null;\n var regionDefinedVersion = this.config.signatureVersion;\n var isPresigned = request ? request.isPresigned() : false;\n /*\n 1) User defined version specified:\n a) always return user defined version\n 2) No user defined version specified:\n a) default to lowest version the region supports\n b) If using presigned urls, default to lowest version the region supports\n */\n if (userDefinedVersion) {\n userDefinedVersion = userDefinedVersion === 'v2' ? 's3' : userDefinedVersion;\n return userDefinedVersion;\n }\n if (isPresigned !== true) {\n defaultApiVersion = 'v4';\n } else if (regionDefinedVersion) {\n defaultApiVersion = regionDefinedVersion;\n }\n return defaultApiVersion;\n },\n\n /**\n * @api private\n */\n getSignerClass: function getSignerClass(request) {\n var signatureVersion = this.getSignatureVersion(request);\n return AWS.Signers.RequestSigner.getVersion(signatureVersion);\n },\n\n /**\n * @api private\n */\n validateService: function validateService() {\n var msg;\n var messages = [];\n\n // default to us-east-1 when no region is provided\n if (!this.config.region) this.config.region = 'us-east-1';\n\n if (!this.config.endpoint && this.config.s3BucketEndpoint) {\n messages.push('An endpoint must be provided when configuring ' +\n '`s3BucketEndpoint` to true.');\n }\n if (messages.length === 1) {\n msg = messages[0];\n } else if (messages.length > 1) {\n msg = 'Multiple configuration errors:\\n' + messages.join('\\n');\n }\n if (msg) {\n throw AWS.util.error(new Error(),\n {name: 'InvalidEndpoint', message: msg});\n }\n },\n\n /**\n * @api private\n */\n shouldDisableBodySigning: function shouldDisableBodySigning(request) {\n var signerClass = this.getSignerClass();\n if (this.config.s3DisableBodySigning === true && signerClass === AWS.Signers.V4\n && request.httpRequest.endpoint.protocol === 'https:') {\n return true;\n }\n return false;\n },\n\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n var prependListener = true;\n request.addListener('validate', this.validateScheme);\n request.addListener('validate', this.validateBucketEndpoint);\n request.addListener('validate', this.correctBucketRegionFromCache);\n request.addListener('validate', this.validateBucketName, prependListener);\n\n request.addListener('build', this.addContentType);\n request.addListener('build', this.populateURI);\n request.addListener('build', this.computeContentMd5);\n request.addListener('build', this.computeSseCustomerKeyMd5);\n request.addListener('afterBuild', this.addExpect100Continue);\n request.removeListener('validate',\n AWS.EventListeners.Core.VALIDATE_REGION);\n request.addListener('extractError', this.extractError);\n request.onAsync('extractError', this.requestBucketRegion);\n request.addListener('extractData', this.extractData);\n request.addListener('extractData', AWS.util.hoistPayloadMember);\n request.addListener('beforePresign', this.prepareSignedUrl);\n if (AWS.util.isBrowser()) {\n request.onAsync('retry', this.reqRegionForNetworkingError);\n }\n if (this.shouldDisableBodySigning(request)) {\n request.removeListener('afterBuild', AWS.EventListeners.Core.COMPUTE_SHA256);\n request.addListener('afterBuild', this.disableBodySigning);\n }\n },\n\n /**\n * @api private\n */\n validateScheme: function(req) {\n var params = req.params,\n scheme = req.httpRequest.endpoint.protocol,\n sensitive = params.SSECustomerKey || params.CopySourceSSECustomerKey;\n if (sensitive && scheme !== 'https:') {\n var msg = 'Cannot send SSE keys over HTTP. Set \\'sslEnabled\\'' +\n 'to \\'true\\' in your configuration';\n throw AWS.util.error(new Error(),\n { code: 'ConfigError', message: msg });\n }\n },\n\n /**\n * @api private\n */\n validateBucketEndpoint: function(req) {\n if (!req.params.Bucket && req.service.config.s3BucketEndpoint) {\n var msg = 'Cannot send requests to root API with `s3BucketEndpoint` set.';\n throw AWS.util.error(new Error(),\n { code: 'ConfigError', message: msg });\n }\n },\n\n /**\n * @api private\n */\n validateBucketName: function validateBucketName(req) {\n var service = req.service;\n var signatureVersion = service.getSignatureVersion(req);\n var bucket = req.params && req.params.Bucket;\n var key = req.params && req.params.Key;\n var slashIndex = bucket && bucket.indexOf('/');\n if (bucket && slashIndex >= 0) {\n if (typeof key === 'string' && slashIndex > 0) {\n req.params = AWS.util.copy(req.params);\n // Need to include trailing slash to match sigv2 behavior\n var prefix = bucket.substr(slashIndex + 1) || '';\n req.params.Key = prefix + '/' + key;\n req.params.Bucket = bucket.substr(0, slashIndex);\n } else if (signatureVersion === 'v4') {\n var msg = 'Bucket names cannot contain forward slashes. Bucket: ' + bucket;\n throw AWS.util.error(new Error(),\n { code: 'InvalidBucket', message: msg });\n }\n }\n },\n\n /**\n * @api private\n */\n isValidAccelerateOperation: function isValidAccelerateOperation(operation) {\n var invalidOperations = [\n 'createBucket',\n 'deleteBucket',\n 'listBuckets'\n ];\n return invalidOperations.indexOf(operation) === -1;\n },\n\n\n /**\n * S3 prefers dns-compatible bucket names to be moved from the uri path\n * to the hostname as a sub-domain. This is not possible, even for dns-compat\n * buckets when using SSL and the bucket name contains a dot ('.'). The\n * ssl wildcard certificate is only 1-level deep.\n *\n * @api private\n */\n populateURI: function populateURI(req) {\n var httpRequest = req.httpRequest;\n var b = req.params.Bucket;\n var service = req.service;\n var endpoint = httpRequest.endpoint;\n if (b) {\n if (!service.pathStyleBucketName(b)) {\n if (service.config.useAccelerateEndpoint && service.isValidAccelerateOperation(req.operation)) {\n if (service.config.useDualstack) {\n endpoint.hostname = b + '.s3-accelerate.dualstack.amazonaws.com';\n } else {\n endpoint.hostname = b + '.s3-accelerate.amazonaws.com';\n }\n } else if (!service.config.s3BucketEndpoint) {\n endpoint.hostname =\n b + '.' + endpoint.hostname;\n }\n\n var port = endpoint.port;\n if (port !== 80 && port !== 443) {\n endpoint.host = endpoint.hostname + ':' +\n endpoint.port;\n } else {\n endpoint.host = endpoint.hostname;\n }\n\n httpRequest.virtualHostedBucket = b; // needed for signing the request\n service.removeVirtualHostedBucketFromPath(req);\n }\n }\n },\n\n /**\n * Takes the bucket name out of the path if bucket is virtual-hosted\n *\n * @api private\n */\n removeVirtualHostedBucketFromPath: function removeVirtualHostedBucketFromPath(req) {\n var httpRequest = req.httpRequest;\n var bucket = httpRequest.virtualHostedBucket;\n if (bucket && httpRequest.path) {\n if (req.params && req.params.Key) {\n var encodedS3Key = '/' + AWS.util.uriEscapePath(req.params.Key);\n if (httpRequest.path.indexOf(encodedS3Key) === 0 && (httpRequest.path.length === encodedS3Key.length || httpRequest.path[encodedS3Key.length] === '?')) {\n //path only contains key or path contains only key and querystring\n return;\n }\n }\n httpRequest.path = httpRequest.path.replace(new RegExp('/' + bucket), '');\n if (httpRequest.path[0] !== '/') {\n httpRequest.path = '/' + httpRequest.path;\n }\n }\n },\n\n /**\n * Adds Expect: 100-continue header if payload is greater-or-equal 1MB\n * @api private\n */\n addExpect100Continue: function addExpect100Continue(req) {\n var len = req.httpRequest.headers['Content-Length'];\n if (AWS.util.isNode() && (len >= 1024 * 1024 || req.params.Body instanceof AWS.util.stream.Stream)) {\n req.httpRequest.headers['Expect'] = '100-continue';\n }\n },\n\n /**\n * Adds a default content type if none is supplied.\n *\n * @api private\n */\n addContentType: function addContentType(req) {\n var httpRequest = req.httpRequest;\n if (httpRequest.method === 'GET' || httpRequest.method === 'HEAD') {\n // Content-Type is not set in GET/HEAD requests\n delete httpRequest.headers['Content-Type'];\n return;\n }\n\n if (!httpRequest.headers['Content-Type']) { // always have a Content-Type\n httpRequest.headers['Content-Type'] = 'application/octet-stream';\n }\n\n var contentType = httpRequest.headers['Content-Type'];\n if (AWS.util.isBrowser()) {\n if (typeof httpRequest.body === 'string' && !contentType.match(/;\\s*charset=/)) {\n var charset = '; charset=UTF-8';\n httpRequest.headers['Content-Type'] += charset;\n } else {\n var replaceFn = function(_, prefix, charsetName) {\n return prefix + charsetName.toUpperCase();\n };\n\n httpRequest.headers['Content-Type'] =\n contentType.replace(/(;\\s*charset=)(.+)$/, replaceFn);\n }\n }\n },\n\n /**\n * @api private\n */\n computableChecksumOperations: {\n putBucketCors: true,\n putBucketLifecycle: true,\n putBucketLifecycleConfiguration: true,\n putBucketTagging: true,\n deleteObjects: true,\n putBucketReplication: true,\n putObjectLegalHold: true,\n putObjectRetention: true,\n putObjectLockConfiguration: true\n },\n\n /**\n * Checks whether checksums should be computed for the request.\n * If the request requires checksums to be computed, this will always\n * return true, otherwise it depends on whether {AWS.Config.computeChecksums}\n * is set.\n *\n * @param req [AWS.Request] the request to check against\n * @return [Boolean] whether to compute checksums for a request.\n * @api private\n */\n willComputeChecksums: function willComputeChecksums(req) {\n if (this.computableChecksumOperations[req.operation]) return true;\n if (!this.config.computeChecksums) return false;\n\n // TODO: compute checksums for Stream objects\n if (!AWS.util.Buffer.isBuffer(req.httpRequest.body) &&\n typeof req.httpRequest.body !== 'string') {\n return false;\n }\n\n var rules = req.service.api.operations[req.operation].input.members;\n\n // Sha256 signing disabled, and not a presigned url\n if (req.service.shouldDisableBodySigning(req) && !Object.prototype.hasOwnProperty.call(req.httpRequest.headers, 'presigned-expires')) {\n if (rules.ContentMD5 && !req.params.ContentMD5) {\n return true;\n }\n }\n\n // V4 signer uses SHA256 signatures so only compute MD5 if it is required\n if (req.service.getSignerClass(req) === AWS.Signers.V4) {\n if (rules.ContentMD5 && !rules.ContentMD5.required) return false;\n }\n\n if (rules.ContentMD5 && !req.params.ContentMD5) return true;\n },\n\n /**\n * A listener that computes the Content-MD5 and sets it in the header.\n * @see AWS.S3.willComputeChecksums\n * @api private\n */\n computeContentMd5: function computeContentMd5(req) {\n if (req.service.willComputeChecksums(req)) {\n var md5 = AWS.util.crypto.md5(req.httpRequest.body, 'base64');\n req.httpRequest.headers['Content-MD5'] = md5;\n }\n },\n\n /**\n * @api private\n */\n computeSseCustomerKeyMd5: function computeSseCustomerKeyMd5(req) {\n var keys = {\n SSECustomerKey: 'x-amz-server-side-encryption-customer-key-MD5',\n CopySourceSSECustomerKey: 'x-amz-copy-source-server-side-encryption-customer-key-MD5'\n };\n AWS.util.each(keys, function(key, header) {\n if (req.params[key]) {\n var value = AWS.util.crypto.md5(req.params[key], 'base64');\n req.httpRequest.headers[header] = value;\n }\n });\n },\n\n /**\n * Returns true if the bucket name should be left in the URI path for\n * a request to S3. This function takes into account the current\n * endpoint protocol (e.g. http or https).\n *\n * @api private\n */\n pathStyleBucketName: function pathStyleBucketName(bucketName) {\n // user can force path style requests via the configuration\n if (this.config.s3ForcePathStyle) return true;\n if (this.config.s3BucketEndpoint) return false;\n\n if (this.dnsCompatibleBucketName(bucketName)) {\n return (this.config.sslEnabled && bucketName.match(/\\./)) ? true : false;\n } else {\n return true; // not dns compatible names must always use path style\n }\n },\n\n /**\n * Returns true if the bucket name is DNS compatible. Buckets created\n * outside of the classic region MUST be DNS compatible.\n *\n * @api private\n */\n dnsCompatibleBucketName: function dnsCompatibleBucketName(bucketName) {\n var b = bucketName;\n var domain = new RegExp(/^[a-z0-9][a-z0-9\\.\\-]{1,61}[a-z0-9]$/);\n var ipAddress = new RegExp(/(\\d+\\.){3}\\d+/);\n var dots = new RegExp(/\\.\\./);\n return (b.match(domain) && !b.match(ipAddress) && !b.match(dots)) ? true : false;\n },\n\n /**\n * @return [Boolean] whether response contains an error\n * @api private\n */\n successfulResponse: function successfulResponse(resp) {\n var req = resp.request;\n var httpResponse = resp.httpResponse;\n if (operationsWith200StatusCodeError[req.operation] &&\n httpResponse.body.toString().match('')) {\n return false;\n } else {\n return httpResponse.statusCode < 300;\n }\n },\n\n /**\n * @return [Boolean] whether the error can be retried\n * @api private\n */\n retryableError: function retryableError(error, request) {\n if (operationsWith200StatusCodeError[request.operation] &&\n error.statusCode === 200) {\n return true;\n } else if (request._requestRegionForBucket &&\n request.service.bucketRegionCache[request._requestRegionForBucket]) {\n return false;\n } else if (error && error.code === 'RequestTimeout') {\n return true;\n } else if (error &&\n regionRedirectErrorCodes.indexOf(error.code) != -1 &&\n error.region && error.region != request.httpRequest.region) {\n request.httpRequest.region = error.region;\n if (error.statusCode === 301) {\n request.service.updateReqBucketRegion(request);\n }\n return true;\n } else {\n var _super = AWS.Service.prototype.retryableError;\n return _super.call(this, error, request);\n }\n },\n\n /**\n * Updates httpRequest with region. If region is not provided, then\n * the httpRequest will be updated based on httpRequest.region\n *\n * @api private\n */\n updateReqBucketRegion: function updateReqBucketRegion(request, region) {\n var httpRequest = request.httpRequest;\n if (typeof region === 'string' && region.length) {\n httpRequest.region = region;\n }\n if (!httpRequest.endpoint.host.match(/s3(?!-accelerate).*\\.amazonaws\\.com$/)) {\n return;\n }\n var service = request.service;\n var s3Config = service.config;\n var s3BucketEndpoint = s3Config.s3BucketEndpoint;\n if (s3BucketEndpoint) {\n delete s3Config.s3BucketEndpoint;\n }\n var newConfig = AWS.util.copy(s3Config);\n delete newConfig.endpoint;\n newConfig.region = httpRequest.region;\n\n httpRequest.endpoint = (new AWS.S3(newConfig)).endpoint;\n service.populateURI(request);\n s3Config.s3BucketEndpoint = s3BucketEndpoint;\n httpRequest.headers.Host = httpRequest.endpoint.host;\n\n if (request._asm.currentState === 'validate') {\n request.removeListener('build', service.populateURI);\n request.addListener('build', service.removeVirtualHostedBucketFromPath);\n }\n },\n\n /**\n * Provides a specialized parser for getBucketLocation -- all other\n * operations are parsed by the super class.\n *\n * @api private\n */\n extractData: function extractData(resp) {\n var req = resp.request;\n if (req.operation === 'getBucketLocation') {\n var match = resp.httpResponse.body.toString().match(/>(.+)<\\/Location/);\n delete resp.data['_'];\n if (match) {\n resp.data.LocationConstraint = match[1];\n } else {\n resp.data.LocationConstraint = '';\n }\n }\n var bucket = req.params.Bucket || null;\n if (req.operation === 'deleteBucket' && typeof bucket === 'string' && !resp.error) {\n req.service.clearBucketRegionCache(bucket);\n } else {\n var headers = resp.httpResponse.headers || {};\n var region = headers['x-amz-bucket-region'] || null;\n if (!region && req.operation === 'createBucket' && !resp.error) {\n var createBucketConfiguration = req.params.CreateBucketConfiguration;\n if (!createBucketConfiguration) {\n region = 'us-east-1';\n } else if (createBucketConfiguration.LocationConstraint === 'EU') {\n region = 'eu-west-1';\n } else {\n region = createBucketConfiguration.LocationConstraint;\n }\n }\n if (region) {\n if (bucket && region !== req.service.bucketRegionCache[bucket]) {\n req.service.bucketRegionCache[bucket] = region;\n }\n }\n }\n req.service.extractRequestIds(resp);\n },\n\n /**\n * Extracts an error object from the http response.\n *\n * @api private\n */\n extractError: function extractError(resp) {\n var codes = {\n 304: 'NotModified',\n 403: 'Forbidden',\n 400: 'BadRequest',\n 404: 'NotFound'\n };\n\n var req = resp.request;\n var code = resp.httpResponse.statusCode;\n var body = resp.httpResponse.body || '';\n\n var headers = resp.httpResponse.headers || {};\n var region = headers['x-amz-bucket-region'] || null;\n var bucket = req.params.Bucket || null;\n var bucketRegionCache = req.service.bucketRegionCache;\n if (region && bucket && region !== bucketRegionCache[bucket]) {\n bucketRegionCache[bucket] = region;\n }\n\n var cachedRegion;\n if (codes[code] && body.length === 0) {\n if (bucket && !region) {\n cachedRegion = bucketRegionCache[bucket] || null;\n if (cachedRegion !== req.httpRequest.region) {\n region = cachedRegion;\n }\n }\n resp.error = AWS.util.error(new Error(), {\n code: codes[code],\n message: null,\n region: region\n });\n } else {\n var data = new AWS.XML.Parser().parse(body.toString());\n\n if (data.Region && !region) {\n region = data.Region;\n if (bucket && region !== bucketRegionCache[bucket]) {\n bucketRegionCache[bucket] = region;\n }\n } else if (bucket && !region && !data.Region) {\n cachedRegion = bucketRegionCache[bucket] || null;\n if (cachedRegion !== req.httpRequest.region) {\n region = cachedRegion;\n }\n }\n\n resp.error = AWS.util.error(new Error(), {\n code: data.Code || code,\n message: data.Message || null,\n region: region\n });\n }\n req.service.extractRequestIds(resp);\n },\n\n /**\n * If region was not obtained synchronously, then send async request\n * to get bucket region for errors resulting from wrong region.\n *\n * @api private\n */\n requestBucketRegion: function requestBucketRegion(resp, done) {\n var error = resp.error;\n var req = resp.request;\n var bucket = req.params.Bucket || null;\n\n if (!error || !bucket || error.region || req.operation === 'listObjects' ||\n (AWS.util.isNode() && req.operation === 'headBucket') ||\n (error.statusCode === 400 && req.operation !== 'headObject') ||\n regionRedirectErrorCodes.indexOf(error.code) === -1) {\n return done();\n }\n var reqOperation = AWS.util.isNode() ? 'headBucket' : 'listObjects';\n var reqParams = {Bucket: bucket};\n if (reqOperation === 'listObjects') reqParams.MaxKeys = 0;\n var regionReq = req.service[reqOperation](reqParams);\n regionReq._requestRegionForBucket = bucket;\n regionReq.send(function() {\n var region = req.service.bucketRegionCache[bucket] || null;\n error.region = region;\n done();\n });\n },\n\n /**\n * For browser only. If NetworkingError received, will attempt to obtain\n * the bucket region.\n *\n * @api private\n */\n reqRegionForNetworkingError: function reqRegionForNetworkingError(resp, done) {\n if (!AWS.util.isBrowser()) {\n return done();\n }\n var error = resp.error;\n var request = resp.request;\n var bucket = request.params.Bucket;\n if (!error || error.code !== 'NetworkingError' || !bucket ||\n request.httpRequest.region === 'us-east-1') {\n return done();\n }\n var service = request.service;\n var bucketRegionCache = service.bucketRegionCache;\n var cachedRegion = bucketRegionCache[bucket] || null;\n\n if (cachedRegion && cachedRegion !== request.httpRequest.region) {\n service.updateReqBucketRegion(request, cachedRegion);\n done();\n } else if (!service.dnsCompatibleBucketName(bucket)) {\n service.updateReqBucketRegion(request, 'us-east-1');\n if (bucketRegionCache[bucket] !== 'us-east-1') {\n bucketRegionCache[bucket] = 'us-east-1';\n }\n done();\n } else if (request.httpRequest.virtualHostedBucket) {\n var getRegionReq = service.listObjects({Bucket: bucket, MaxKeys: 0});\n service.updateReqBucketRegion(getRegionReq, 'us-east-1');\n getRegionReq._requestRegionForBucket = bucket;\n\n getRegionReq.send(function() {\n var region = service.bucketRegionCache[bucket] || null;\n if (region && region !== request.httpRequest.region) {\n service.updateReqBucketRegion(request, region);\n }\n done();\n });\n } else {\n // DNS-compatible path-style\n // (s3ForcePathStyle or bucket name with dot over https)\n // Cannot obtain region information for this case\n done();\n }\n },\n\n /**\n * Cache for bucket region.\n *\n * @api private\n */\n bucketRegionCache: {},\n\n /**\n * Clears bucket region cache.\n *\n * @api private\n */\n clearBucketRegionCache: function(buckets) {\n var bucketRegionCache = this.bucketRegionCache;\n if (!buckets) {\n buckets = Object.keys(bucketRegionCache);\n } else if (typeof buckets === 'string') {\n buckets = [buckets];\n }\n for (var i = 0; i < buckets.length; i++) {\n delete bucketRegionCache[buckets[i]];\n }\n return bucketRegionCache;\n },\n\n /**\n * Corrects request region if bucket's cached region is different\n *\n * @api private\n */\n correctBucketRegionFromCache: function correctBucketRegionFromCache(req) {\n var bucket = req.params.Bucket || null;\n if (bucket) {\n var service = req.service;\n var requestRegion = req.httpRequest.region;\n var cachedRegion = service.bucketRegionCache[bucket];\n if (cachedRegion && cachedRegion !== requestRegion) {\n service.updateReqBucketRegion(req, cachedRegion);\n }\n }\n },\n\n /**\n * Extracts S3 specific request ids from the http response.\n *\n * @api private\n */\n extractRequestIds: function extractRequestIds(resp) {\n var extendedRequestId = resp.httpResponse.headers ? resp.httpResponse.headers['x-amz-id-2'] : null;\n var cfId = resp.httpResponse.headers ? resp.httpResponse.headers['x-amz-cf-id'] : null;\n resp.extendedRequestId = extendedRequestId;\n resp.cfId = cfId;\n\n if (resp.error) {\n resp.error.requestId = resp.requestId || null;\n resp.error.extendedRequestId = extendedRequestId;\n resp.error.cfId = cfId;\n }\n },\n\n /**\n * Get a pre-signed URL for a given operation name.\n *\n * @note You must ensure that you have static or previously resolved\n * credentials if you call this method synchronously (with no callback),\n * otherwise it may not properly sign the request. If you cannot guarantee\n * this (you are using an asynchronous credential provider, i.e., EC2\n * IAM roles), you should always call this method with an asynchronous\n * callback.\n * @note Not all operation parameters are supported when using pre-signed\n * URLs. Certain parameters, such as `SSECustomerKey`, `ACL`, `Expires`,\n * `ContentLength`, or `Tagging` must be provided as headers when sending a\n * request. If you are using pre-signed URLs to upload from a browser and\n * need to use these fields, see {createPresignedPost}.\n * @note The default signer allows altering the request by adding corresponding\n * headers to set some parameters (e.g. Range) and these added parameters\n * won't be signed. You must use signatureVersion v4 to to include these\n * parameters in the signed portion of the URL and enforce exact matching\n * between headers and signed params in the URL.\n * @note This operation cannot be used with a promise. See note above regarding\n * asynchronous credentials and use with a callback.\n * @param operation [String] the name of the operation to call\n * @param params [map] parameters to pass to the operation. See the given\n * operation for the expected operation parameters. In addition, you can\n * also pass the \"Expires\" parameter to inform S3 how long the URL should\n * work for.\n * @option params Expires [Integer] (900) the number of seconds to expire\n * the pre-signed URL operation in. Defaults to 15 minutes.\n * @param callback [Function] if a callback is provided, this function will\n * pass the URL as the second parameter (after the error parameter) to\n * the callback function.\n * @return [String] if called synchronously (with no callback), returns the\n * signed URL.\n * @return [null] nothing is returned if a callback is provided.\n * @example Pre-signing a getObject operation (synchronously)\n * var params = {Bucket: 'bucket', Key: 'key'};\n * var url = s3.getSignedUrl('getObject', params);\n * console.log('The URL is', url);\n * @example Pre-signing a putObject (asynchronously)\n * var params = {Bucket: 'bucket', Key: 'key'};\n * s3.getSignedUrl('putObject', params, function (err, url) {\n * console.log('The URL is', url);\n * });\n * @example Pre-signing a putObject operation with a specific payload\n * var params = {Bucket: 'bucket', Key: 'key', Body: 'body'};\n * var url = s3.getSignedUrl('putObject', params);\n * console.log('The URL is', url);\n * @example Passing in a 1-minute expiry time for a pre-signed URL\n * var params = {Bucket: 'bucket', Key: 'key', Expires: 60};\n * var url = s3.getSignedUrl('getObject', params);\n * console.log('The URL is', url); // expires in 60 seconds\n */\n getSignedUrl: function getSignedUrl(operation, params, callback) {\n params = AWS.util.copy(params || {});\n var expires = params.Expires || 900;\n\n if (typeof expires !== 'number') {\n throw AWS.util.error(new Error(),\n { code: 'InvalidParameterException', message: 'The expiration must be a number, received ' + typeof expires });\n }\n\n delete params.Expires; // we can't validate this\n var request = this.makeRequest(operation, params);\n\n if (callback) {\n AWS.util.defer(function() {\n request.presign(expires, callback);\n });\n } else {\n return request.presign(expires, callback);\n }\n },\n\n\n /**\n * Get a pre-signed POST policy to support uploading to S3 directly from an\n * HTML form.\n *\n * @param params [map]\n * @option params Bucket [String] The bucket to which the post should be\n * uploaded\n * @option params Expires [Integer] (3600) The number of seconds for which\n * the presigned policy should be valid.\n * @option params Conditions [Array] An array of conditions that must be met\n * for the presigned policy to allow the\n * upload. This can include required tags,\n * the accepted range for content lengths,\n * etc.\n * @see http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-HTTPPOSTConstructPolicy.html\n * @option params Fields [map] Fields to include in the form. All\n * values passed in as fields will be\n * signed as exact match conditions.\n * @param callback [Function]\n *\n * @note All fields passed in when creating presigned post data will be signed\n * as exact match conditions. Any fields that will be interpolated by S3\n * must be added to the fields hash after signing, and an appropriate\n * condition for such fields must be explicitly added to the Conditions\n * array passed to this function before signing.\n *\n * @example Presiging post data with a known key\n * var params = {\n * Bucket: 'bucket',\n * Fields: {\n * key: 'key'\n * }\n * };\n * s3.createPresignedPost(params, function(err, data) {\n * if (err) {\n * console.error('Presigning post data encountered an error', err);\n * } else {\n * console.log('The post data is', data);\n * }\n * });\n *\n * @example Presigning post data with an interpolated key\n * var params = {\n * Bucket: 'bucket',\n * Conditions: [\n * ['starts-with', '$key', 'path/to/uploads/']\n * ]\n * };\n * s3.createPresignedPost(params, function(err, data) {\n * if (err) {\n * console.error('Presigning post data encountered an error', err);\n * } else {\n * data.Fields.key = 'path/to/uploads/${filename}';\n * console.log('The post data is', data);\n * }\n * });\n *\n * @note You must ensure that you have static or previously resolved\n * credentials if you call this method synchronously (with no callback),\n * otherwise it may not properly sign the request. If you cannot guarantee\n * this (you are using an asynchronous credential provider, i.e., EC2\n * IAM roles), you should always call this method with an asynchronous\n * callback.\n *\n * @return [map] If called synchronously (with no callback), returns a hash\n * with the url to set as the form action and a hash of fields\n * to include in the form.\n * @return [null] Nothing is returned if a callback is provided.\n *\n * @callback callback function (err, data)\n * @param err [Error] the error object returned from the policy signer\n * @param data [map] The data necessary to construct an HTML form\n * @param data.url [String] The URL to use as the action of the form\n * @param data.fields [map] A hash of fields that must be included in the\n * form for the upload to succeed. This hash will\n * include the signed POST policy, your access key\n * ID and security token (if present), etc. These\n * may be safely included as input elements of type\n * 'hidden.'\n */\n createPresignedPost: function createPresignedPost(params, callback) {\n if (typeof params === 'function' && callback === undefined) {\n callback = params;\n params = null;\n }\n\n params = AWS.util.copy(params || {});\n var boundParams = this.config.params || {};\n var bucket = params.Bucket || boundParams.Bucket,\n self = this,\n config = this.config,\n endpoint = AWS.util.copy(this.endpoint);\n if (!config.s3BucketEndpoint) {\n endpoint.pathname = '/' + bucket;\n }\n\n function finalizePost() {\n return {\n url: AWS.util.urlFormat(endpoint),\n fields: self.preparePostFields(\n config.credentials,\n config.region,\n bucket,\n params.Fields,\n params.Conditions,\n params.Expires\n )\n };\n }\n\n if (callback) {\n config.getCredentials(function (err) {\n if (err) {\n callback(err);\n }\n\n callback(null, finalizePost());\n });\n } else {\n return finalizePost();\n }\n },\n\n /**\n * @api private\n */\n preparePostFields: function preparePostFields(\n credentials,\n region,\n bucket,\n fields,\n conditions,\n expiresInSeconds\n ) {\n var now = this.getSkewCorrectedDate();\n if (!credentials || !region || !bucket) {\n throw new Error('Unable to create a POST object policy without a bucket,'\n + ' region, and credentials');\n }\n fields = AWS.util.copy(fields || {});\n conditions = (conditions || []).slice(0);\n expiresInSeconds = expiresInSeconds || 3600;\n\n var signingDate = AWS.util.date.iso8601(now).replace(/[:\\-]|\\.\\d{3}/g, '');\n var shortDate = signingDate.substr(0, 8);\n var scope = v4Credentials.createScope(shortDate, region, 's3');\n var credential = credentials.accessKeyId + '/' + scope;\n\n fields['bucket'] = bucket;\n fields['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256';\n fields['X-Amz-Credential'] = credential;\n fields['X-Amz-Date'] = signingDate;\n if (credentials.sessionToken) {\n fields['X-Amz-Security-Token'] = credentials.sessionToken;\n }\n for (var field in fields) {\n if (fields.hasOwnProperty(field)) {\n var condition = {};\n condition[field] = fields[field];\n conditions.push(condition);\n }\n }\n\n fields.Policy = this.preparePostPolicy(\n new Date(now.valueOf() + expiresInSeconds * 1000),\n conditions\n );\n fields['X-Amz-Signature'] = AWS.util.crypto.hmac(\n v4Credentials.getSigningKey(credentials, shortDate, region, 's3', true),\n fields.Policy,\n 'hex'\n );\n\n return fields;\n },\n\n /**\n * @api private\n */\n preparePostPolicy: function preparePostPolicy(expiration, conditions) {\n return AWS.util.base64.encode(JSON.stringify({\n expiration: AWS.util.date.iso8601(expiration),\n conditions: conditions\n }));\n },\n\n /**\n * @api private\n */\n prepareSignedUrl: function prepareSignedUrl(request) {\n request.addListener('validate', request.service.noPresignedContentLength);\n request.removeListener('build', request.service.addContentType);\n if (!request.params.Body) {\n // no Content-MD5/SHA-256 if body is not provided\n request.removeListener('build', request.service.computeContentMd5);\n } else {\n request.addListener('afterBuild', AWS.EventListeners.Core.COMPUTE_SHA256);\n }\n },\n\n /**\n * @api private\n * @param request\n */\n disableBodySigning: function disableBodySigning(request) {\n var headers = request.httpRequest.headers;\n // Add the header to anything that isn't a presigned url, unless that presigned url had a body defined\n if (!Object.prototype.hasOwnProperty.call(headers, 'presigned-expires')) {\n headers['X-Amz-Content-Sha256'] = 'UNSIGNED-PAYLOAD';\n }\n },\n\n /**\n * @api private\n */\n noPresignedContentLength: function noPresignedContentLength(request) {\n if (request.params.ContentLength !== undefined) {\n throw AWS.util.error(new Error(), {code: 'UnexpectedParameter',\n message: 'ContentLength is not supported in pre-signed URLs.'});\n }\n },\n\n createBucket: function createBucket(params, callback) {\n // When creating a bucket *outside* the classic region, the location\n // constraint must be set for the bucket and it must match the endpoint.\n // This chunk of code will set the location constraint param based\n // on the region (when possible), but it will not override a passed-in\n // location constraint.\n if (typeof params === 'function' || !params) {\n callback = callback || params;\n params = {};\n }\n var hostname = this.endpoint.hostname;\n if (hostname !== this.api.globalEndpoint && !params.CreateBucketConfiguration) {\n params.CreateBucketConfiguration = { LocationConstraint: this.config.region };\n }\n return this.makeRequest('createBucket', params, callback);\n },\n\n /**\n * @see AWS.S3.ManagedUpload\n * @overload upload(params = {}, [options], [callback])\n * Uploads an arbitrarily sized buffer, blob, or stream, using intelligent\n * concurrent handling of parts if the payload is large enough. You can\n * configure the concurrent queue size by setting `options`. Note that this\n * is the only operation for which the SDK can retry requests with stream\n * bodies.\n *\n * @param (see AWS.S3.putObject)\n * @option (see AWS.S3.ManagedUpload.constructor)\n * @return [AWS.S3.ManagedUpload] the managed upload object that can call\n * `send()` or track progress.\n * @example Uploading a stream object\n * var params = {Bucket: 'bucket', Key: 'key', Body: stream};\n * s3.upload(params, function(err, data) {\n * console.log(err, data);\n * });\n * @example Uploading a stream with concurrency of 1 and partSize of 10mb\n * var params = {Bucket: 'bucket', Key: 'key', Body: stream};\n * var options = {partSize: 10 * 1024 * 1024, queueSize: 1};\n * s3.upload(params, options, function(err, data) {\n * console.log(err, data);\n * });\n * @callback callback function(err, data)\n * @param err [Error] an error or null if no error occurred.\n * @param data [map] The response data from the successful upload:\n * @param data.Location [String] the URL of the uploaded object\n * @param data.ETag [String] the ETag of the uploaded object\n * @param data.Bucket [String] the bucket to which the object was uploaded\n * @param data.Key [String] the key to which the object was uploaded\n */\n upload: function upload(params, options, callback) {\n if (typeof options === 'function' && callback === undefined) {\n callback = options;\n options = null;\n }\n\n options = options || {};\n options = AWS.util.merge(options || {}, {service: this, params: params});\n\n var uploader = new AWS.S3.ManagedUpload(options);\n if (typeof callback === 'function') uploader.send(callback);\n return uploader;\n }\n});\n","var AWS = require('../core');\nvar inherit = AWS.util.inherit;\n\nrequire('./v3');\n\n/**\n * @api private\n */\nAWS.Signers.V3Https = inherit(AWS.Signers.V3, {\n authorization: function authorization(credentials) {\n return 'AWS3-HTTPS ' +\n 'AWSAccessKeyId=' + credentials.accessKeyId + ',' +\n 'Algorithm=HmacSHA256,' +\n 'Signature=' + this.signature(credentials);\n },\n\n stringToSign: function stringToSign() {\n return this.request.headers['X-Amz-Date'];\n }\n});\n\n/**\n * @api private\n */\nmodule.exports = AWS.Signers.V3Https;\n","var AWS = require('../core');\n\nAWS.util.update(AWS.Route53.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n request.on('build', this.sanitizeUrl);\n },\n\n /**\n * @api private\n */\n sanitizeUrl: function sanitizeUrl(request) {\n var path = request.httpRequest.path;\n request.httpRequest.path = path.replace(/\\/%2F\\w+%2F/, '/');\n },\n\n /**\n * @return [Boolean] whether the error can be retried\n * @api private\n */\n retryableError: function retryableError(error) {\n if (error.code === 'PriorRequestNotComplete' &&\n error.statusCode === 400) {\n return true;\n } else {\n var _super = AWS.Service.prototype.retryableError;\n return _super.call(this, error);\n }\n }\n});\n","var AWS = require('../core');\n\n// pull in CloudFront signer\nrequire('../cloudfront/signer');\n\nAWS.util.update(AWS.CloudFront.prototype, {\n\n setupRequestListeners: function setupRequestListeners(request) {\n request.addListener('extractData', AWS.util.hoistPayloadMember);\n }\n\n});\n","var AWS = require('./core');\nvar inherit = AWS.util.inherit;\nvar jmespath = require('jmespath');\n\n/**\n * This class encapsulates the response information\n * from a service request operation sent through {AWS.Request}.\n * The response object has two main properties for getting information\n * back from a request:\n *\n * ## The `data` property\n *\n * The `response.data` property contains the serialized object data\n * retrieved from the service request. For instance, for an\n * Amazon DynamoDB `listTables` method call, the response data might\n * look like:\n *\n * ```\n * > resp.data\n * { TableNames:\n * [ 'table1', 'table2', ... ] }\n * ```\n *\n * The `data` property can be null if an error occurs (see below).\n *\n * ## The `error` property\n *\n * In the event of a service error (or transfer error), the\n * `response.error` property will be filled with the given\n * error data in the form:\n *\n * ```\n * { code: 'SHORT_UNIQUE_ERROR_CODE',\n * message: 'Some human readable error message' }\n * ```\n *\n * In the case of an error, the `data` property will be `null`.\n * Note that if you handle events that can be in a failure state,\n * you should always check whether `response.error` is set\n * before attempting to access the `response.data` property.\n *\n * @!attribute data\n * @readonly\n * @!group Data Properties\n * @note Inside of a {AWS.Request~httpData} event, this\n * property contains a single raw packet instead of the\n * full de-serialized service response.\n * @return [Object] the de-serialized response data\n * from the service.\n *\n * @!attribute error\n * An structure containing information about a service\n * or networking error.\n * @readonly\n * @!group Data Properties\n * @note This attribute is only filled if a service or\n * networking error occurs.\n * @return [Error]\n * * code [String] a unique short code representing the\n * error that was emitted.\n * * message [String] a longer human readable error message\n * * retryable [Boolean] whether the error message is\n * retryable.\n * * statusCode [Numeric] in the case of a request that reached the service,\n * this value contains the response status code.\n * * time [Date] the date time object when the error occurred.\n * * hostname [String] set when a networking error occurs to easily\n * identify the endpoint of the request.\n * * region [String] set when a networking error occurs to easily\n * identify the region of the request.\n *\n * @!attribute requestId\n * @readonly\n * @!group Data Properties\n * @return [String] the unique request ID associated with the response.\n * Log this value when debugging requests for AWS support.\n *\n * @!attribute retryCount\n * @readonly\n * @!group Operation Properties\n * @return [Integer] the number of retries that were\n * attempted before the request was completed.\n *\n * @!attribute redirectCount\n * @readonly\n * @!group Operation Properties\n * @return [Integer] the number of redirects that were\n * followed before the request was completed.\n *\n * @!attribute httpResponse\n * @readonly\n * @!group HTTP Properties\n * @return [AWS.HttpResponse] the raw HTTP response object\n * containing the response headers and body information\n * from the server.\n *\n * @see AWS.Request\n */\nAWS.Response = inherit({\n\n /**\n * @api private\n */\n constructor: function Response(request) {\n this.request = request;\n this.data = null;\n this.error = null;\n this.retryCount = 0;\n this.redirectCount = 0;\n this.httpResponse = new AWS.HttpResponse();\n if (request) {\n this.maxRetries = request.service.numRetries();\n this.maxRedirects = request.service.config.maxRedirects;\n }\n },\n\n /**\n * Creates a new request for the next page of response data, calling the\n * callback with the page data if a callback is provided.\n *\n * @callback callback function(err, data)\n * Called when a page of data is returned from the next request.\n *\n * @param err [Error] an error object, if an error occurred in the request\n * @param data [Object] the next page of data, or null, if there are no\n * more pages left.\n * @return [AWS.Request] the request object for the next page of data\n * @return [null] if no callback is provided and there are no pages left\n * to retrieve.\n * @since v1.4.0\n */\n nextPage: function nextPage(callback) {\n var config;\n var service = this.request.service;\n var operation = this.request.operation;\n try {\n config = service.paginationConfig(operation, true);\n } catch (e) { this.error = e; }\n\n if (!this.hasNextPage()) {\n if (callback) callback(this.error, null);\n else if (this.error) throw this.error;\n return null;\n }\n\n var params = AWS.util.copy(this.request.params);\n if (!this.nextPageTokens) {\n return callback ? callback(null, null) : null;\n } else {\n var inputTokens = config.inputToken;\n if (typeof inputTokens === 'string') inputTokens = [inputTokens];\n for (var i = 0; i < inputTokens.length; i++) {\n params[inputTokens[i]] = this.nextPageTokens[i];\n }\n return service.makeRequest(this.request.operation, params, callback);\n }\n },\n\n /**\n * @return [Boolean] whether more pages of data can be returned by further\n * requests\n * @since v1.4.0\n */\n hasNextPage: function hasNextPage() {\n this.cacheNextPageTokens();\n if (this.nextPageTokens) return true;\n if (this.nextPageTokens === undefined) return undefined;\n else return false;\n },\n\n /**\n * @api private\n */\n cacheNextPageTokens: function cacheNextPageTokens() {\n if (Object.prototype.hasOwnProperty.call(this, 'nextPageTokens')) return this.nextPageTokens;\n this.nextPageTokens = undefined;\n\n var config = this.request.service.paginationConfig(this.request.operation);\n if (!config) return this.nextPageTokens;\n\n this.nextPageTokens = null;\n if (config.moreResults) {\n if (!jmespath.search(this.data, config.moreResults)) {\n return this.nextPageTokens;\n }\n }\n\n var exprs = config.outputToken;\n if (typeof exprs === 'string') exprs = [exprs];\n AWS.util.arrayEach.call(this, exprs, function (expr) {\n var output = jmespath.search(this.data, expr);\n if (output) {\n this.nextPageTokens = this.nextPageTokens || [];\n this.nextPageTokens.push(output);\n }\n });\n\n return this.nextPageTokens;\n }\n\n});\n","var AWS = require('./core');\n\n/**\n * @api private\n * @!method on(eventName, callback)\n * Registers an event listener callback for the event given by `eventName`.\n * Parameters passed to the callback function depend on the individual event\n * being triggered. See the event documentation for those parameters.\n *\n * @param eventName [String] the event name to register the listener for\n * @param callback [Function] the listener callback function\n * @param toHead [Boolean] attach the listener callback to the head of callback array if set to true.\n * Default to be false.\n * @return [AWS.SequentialExecutor] the same object for chaining\n */\nAWS.SequentialExecutor = AWS.util.inherit({\n\n constructor: function SequentialExecutor() {\n this._events = {};\n },\n\n /**\n * @api private\n */\n listeners: function listeners(eventName) {\n return this._events[eventName] ? this._events[eventName].slice(0) : [];\n },\n\n on: function on(eventName, listener, toHead) {\n if (this._events[eventName]) {\n toHead ?\n this._events[eventName].unshift(listener) :\n this._events[eventName].push(listener);\n } else {\n this._events[eventName] = [listener];\n }\n return this;\n },\n\n onAsync: function onAsync(eventName, listener, toHead) {\n listener._isAsync = true;\n return this.on(eventName, listener, toHead);\n },\n\n removeListener: function removeListener(eventName, listener) {\n var listeners = this._events[eventName];\n if (listeners) {\n var length = listeners.length;\n var position = -1;\n for (var i = 0; i < length; ++i) {\n if (listeners[i] === listener) {\n position = i;\n }\n }\n if (position > -1) {\n listeners.splice(position, 1);\n }\n }\n return this;\n },\n\n removeAllListeners: function removeAllListeners(eventName) {\n if (eventName) {\n delete this._events[eventName];\n } else {\n this._events = {};\n }\n return this;\n },\n\n /**\n * @api private\n */\n emit: function emit(eventName, eventArgs, doneCallback) {\n if (!doneCallback) doneCallback = function() { };\n var listeners = this.listeners(eventName);\n var count = listeners.length;\n this.callListeners(listeners, eventArgs, doneCallback);\n return count > 0;\n },\n\n /**\n * @api private\n */\n callListeners: function callListeners(listeners, args, doneCallback, prevError) {\n var self = this;\n var error = prevError || null;\n\n function callNextListener(err) {\n if (err) {\n error = AWS.util.error(error || new Error(), err);\n if (self._haltHandlersOnError) {\n return doneCallback.call(self, error);\n }\n }\n self.callListeners(listeners, args, doneCallback, error);\n }\n\n while (listeners.length > 0) {\n var listener = listeners.shift();\n if (listener._isAsync) { // asynchronous listener\n listener.apply(self, args.concat([callNextListener]));\n return; // stop here, callNextListener will continue\n } else { // synchronous listener\n try {\n listener.apply(self, args);\n } catch (err) {\n error = AWS.util.error(error || new Error(), err);\n }\n if (error && self._haltHandlersOnError) {\n doneCallback.call(self, error);\n return;\n }\n }\n }\n doneCallback.call(self, error);\n },\n\n /**\n * Adds or copies a set of listeners from another list of\n * listeners or SequentialExecutor object.\n *\n * @param listeners [map>, AWS.SequentialExecutor]\n * a list of events and callbacks, or an event emitter object\n * containing listeners to add to this emitter object.\n * @return [AWS.SequentialExecutor] the emitter object, for chaining.\n * @example Adding listeners from a map of listeners\n * emitter.addListeners({\n * event1: [function() { ... }, function() { ... }],\n * event2: [function() { ... }]\n * });\n * emitter.emit('event1'); // emitter has event1\n * emitter.emit('event2'); // emitter has event2\n * @example Adding listeners from another emitter object\n * var emitter1 = new AWS.SequentialExecutor();\n * emitter1.on('event1', function() { ... });\n * emitter1.on('event2', function() { ... });\n * var emitter2 = new AWS.SequentialExecutor();\n * emitter2.addListeners(emitter1);\n * emitter2.emit('event1'); // emitter2 has event1\n * emitter2.emit('event2'); // emitter2 has event2\n */\n addListeners: function addListeners(listeners) {\n var self = this;\n\n // extract listeners if parameter is an SequentialExecutor object\n if (listeners._events) listeners = listeners._events;\n\n AWS.util.each(listeners, function(event, callbacks) {\n if (typeof callbacks === 'function') callbacks = [callbacks];\n AWS.util.arrayEach(callbacks, function(callback) {\n self.on(event, callback);\n });\n });\n\n return self;\n },\n\n /**\n * Registers an event with {on} and saves the callback handle function\n * as a property on the emitter object using a given `name`.\n *\n * @param name [String] the property name to set on this object containing\n * the callback function handle so that the listener can be removed in\n * the future.\n * @param (see on)\n * @return (see on)\n * @example Adding a named listener DATA_CALLBACK\n * var listener = function() { doSomething(); };\n * emitter.addNamedListener('DATA_CALLBACK', 'data', listener);\n *\n * // the following prints: true\n * console.log(emitter.DATA_CALLBACK == listener);\n */\n addNamedListener: function addNamedListener(name, eventName, callback, toHead) {\n this[name] = callback;\n this.addListener(eventName, callback, toHead);\n return this;\n },\n\n /**\n * @api private\n */\n addNamedAsyncListener: function addNamedAsyncListener(name, eventName, callback, toHead) {\n callback._isAsync = true;\n return this.addNamedListener(name, eventName, callback, toHead);\n },\n\n /**\n * Helper method to add a set of named listeners using\n * {addNamedListener}. The callback contains a parameter\n * with a handle to the `addNamedListener` method.\n *\n * @callback callback function(add)\n * The callback function is called immediately in order to provide\n * the `add` function to the block. This simplifies the addition of\n * a large group of named listeners.\n * @param add [Function] the {addNamedListener} function to call\n * when registering listeners.\n * @example Adding a set of named listeners\n * emitter.addNamedListeners(function(add) {\n * add('DATA_CALLBACK', 'data', function() { ... });\n * add('OTHER', 'otherEvent', function() { ... });\n * add('LAST', 'lastEvent', function() { ... });\n * });\n *\n * // these properties are now set:\n * emitter.DATA_CALLBACK;\n * emitter.OTHER;\n * emitter.LAST;\n */\n addNamedListeners: function addNamedListeners(callback) {\n var self = this;\n callback(\n function() {\n self.addNamedListener.apply(self, arguments);\n },\n function() {\n self.addNamedAsyncListener.apply(self, arguments);\n }\n );\n return this;\n }\n});\n\n/**\n * {on} is the prefered method.\n * @api private\n */\nAWS.SequentialExecutor.prototype.addListener = AWS.SequentialExecutor.prototype.on;\n\n/**\n * @api private\n */\nmodule.exports = AWS.SequentialExecutor;\n","var AWS = require('./core');\nvar AcceptorStateMachine = require('./state_machine');\nvar inherit = AWS.util.inherit;\nvar domain = AWS.util.domain;\nvar jmespath = require('jmespath');\n\n/**\n * @api private\n */\nvar hardErrorStates = {success: 1, error: 1, complete: 1};\n\nfunction isTerminalState(machine) {\n return Object.prototype.hasOwnProperty.call(hardErrorStates, machine._asm.currentState);\n}\n\nvar fsm = new AcceptorStateMachine();\nfsm.setupStates = function() {\n var transition = function(_, done) {\n var self = this;\n self._haltHandlersOnError = false;\n\n self.emit(self._asm.currentState, function(err) {\n if (err) {\n if (isTerminalState(self)) {\n if (domain && self.domain instanceof domain.Domain) {\n err.domainEmitter = self;\n err.domain = self.domain;\n err.domainThrown = false;\n self.domain.emit('error', err);\n } else {\n throw err;\n }\n } else {\n self.response.error = err;\n done(err);\n }\n } else {\n done(self.response.error);\n }\n });\n\n };\n\n this.addState('validate', 'build', 'error', transition);\n this.addState('build', 'afterBuild', 'restart', transition);\n this.addState('afterBuild', 'sign', 'restart', transition);\n this.addState('sign', 'send', 'retry', transition);\n this.addState('retry', 'afterRetry', 'afterRetry', transition);\n this.addState('afterRetry', 'sign', 'error', transition);\n this.addState('send', 'validateResponse', 'retry', transition);\n this.addState('validateResponse', 'extractData', 'extractError', transition);\n this.addState('extractError', 'extractData', 'retry', transition);\n this.addState('extractData', 'success', 'retry', transition);\n this.addState('restart', 'build', 'error', transition);\n this.addState('success', 'complete', 'complete', transition);\n this.addState('error', 'complete', 'complete', transition);\n this.addState('complete', null, null, transition);\n};\nfsm.setupStates();\n\n/**\n * ## Asynchronous Requests\n *\n * All requests made through the SDK are asynchronous and use a\n * callback interface. Each service method that kicks off a request\n * returns an `AWS.Request` object that you can use to register\n * callbacks.\n *\n * For example, the following service method returns the request\n * object as \"request\", which can be used to register callbacks:\n *\n * ```javascript\n * // request is an AWS.Request object\n * var request = ec2.describeInstances();\n *\n * // register callbacks on request to retrieve response data\n * request.on('success', function(response) {\n * console.log(response.data);\n * });\n * ```\n *\n * When a request is ready to be sent, the {send} method should\n * be called:\n *\n * ```javascript\n * request.send();\n * ```\n *\n * Since registered callbacks may or may not be idempotent, requests should only\n * be sent once. To perform the same operation multiple times, you will need to\n * create multiple request objects, each with its own registered callbacks.\n *\n * ## Removing Default Listeners for Events\n *\n * Request objects are built with default listeners for the various events,\n * depending on the service type. In some cases, you may want to remove\n * some built-in listeners to customize behaviour. Doing this requires\n * access to the built-in listener functions, which are exposed through\n * the {AWS.EventListeners.Core} namespace. For instance, you may\n * want to customize the HTTP handler used when sending a request. In this\n * case, you can remove the built-in listener associated with the 'send'\n * event, the {AWS.EventListeners.Core.SEND} listener and add your own.\n *\n * ## Multiple Callbacks and Chaining\n *\n * You can register multiple callbacks on any request object. The\n * callbacks can be registered for different events, or all for the\n * same event. In addition, you can chain callback registration, for\n * example:\n *\n * ```javascript\n * request.\n * on('success', function(response) {\n * console.log(\"Success!\");\n * }).\n * on('error', function(error, response) {\n * console.log(\"Error!\");\n * }).\n * on('complete', function(response) {\n * console.log(\"Always!\");\n * }).\n * send();\n * ```\n *\n * The above example will print either \"Success! Always!\", or \"Error! Always!\",\n * depending on whether the request succeeded or not.\n *\n * @!attribute httpRequest\n * @readonly\n * @!group HTTP Properties\n * @return [AWS.HttpRequest] the raw HTTP request object\n * containing request headers and body information\n * sent by the service.\n *\n * @!attribute startTime\n * @readonly\n * @!group Operation Properties\n * @return [Date] the time that the request started\n *\n * @!group Request Building Events\n *\n * @!event validate(request)\n * Triggered when a request is being validated. Listeners\n * should throw an error if the request should not be sent.\n * @param request [Request] the request object being sent\n * @see AWS.EventListeners.Core.VALIDATE_CREDENTIALS\n * @see AWS.EventListeners.Core.VALIDATE_REGION\n * @example Ensuring that a certain parameter is set before sending a request\n * var req = s3.putObject(params);\n * req.on('validate', function() {\n * if (!req.params.Body.match(/^Hello\\s/)) {\n * throw new Error('Body must start with \"Hello \"');\n * }\n * });\n * req.send(function(err, data) { ... });\n *\n * @!event build(request)\n * Triggered when the request payload is being built. Listeners\n * should fill the necessary information to send the request\n * over HTTP.\n * @param (see AWS.Request~validate)\n * @example Add a custom HTTP header to a request\n * var req = s3.putObject(params);\n * req.on('build', function() {\n * req.httpRequest.headers['Custom-Header'] = 'value';\n * });\n * req.send(function(err, data) { ... });\n *\n * @!event sign(request)\n * Triggered when the request is being signed. Listeners should\n * add the correct authentication headers and/or adjust the body,\n * depending on the authentication mechanism being used.\n * @param (see AWS.Request~validate)\n *\n * @!group Request Sending Events\n *\n * @!event send(response)\n * Triggered when the request is ready to be sent. Listeners\n * should call the underlying transport layer to initiate\n * the sending of the request.\n * @param response [Response] the response object\n * @context [Request] the request object that was sent\n * @see AWS.EventListeners.Core.SEND\n *\n * @!event retry(response)\n * Triggered when a request failed and might need to be retried or redirected.\n * If the response is retryable, the listener should set the\n * `response.error.retryable` property to `true`, and optionally set\n * `response.error.retryDelay` to the millisecond delay for the next attempt.\n * In the case of a redirect, `response.error.redirect` should be set to\n * `true` with `retryDelay` set to an optional delay on the next request.\n *\n * If a listener decides that a request should not be retried,\n * it should set both `retryable` and `redirect` to false.\n *\n * Note that a retryable error will be retried at most\n * {AWS.Config.maxRetries} times (based on the service object's config).\n * Similarly, a request that is redirected will only redirect at most\n * {AWS.Config.maxRedirects} times.\n *\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n * @example Adding a custom retry for a 404 response\n * request.on('retry', function(response) {\n * // this resource is not yet available, wait 10 seconds to get it again\n * if (response.httpResponse.statusCode === 404 && response.error) {\n * response.error.retryable = true; // retry this error\n * response.error.retryDelay = 10000; // wait 10 seconds\n * }\n * });\n *\n * @!group Data Parsing Events\n *\n * @!event extractError(response)\n * Triggered on all non-2xx requests so that listeners can extract\n * error details from the response body. Listeners to this event\n * should set the `response.error` property.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @!event extractData(response)\n * Triggered in successful requests to allow listeners to\n * de-serialize the response body into `response.data`.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @!group Completion Events\n *\n * @!event success(response)\n * Triggered when the request completed successfully.\n * `response.data` will contain the response data and\n * `response.error` will be null.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @!event error(error, response)\n * Triggered when an error occurs at any point during the\n * request. `response.error` will contain details about the error\n * that occurred. `response.data` will be null.\n * @param error [Error] the error object containing details about\n * the error that occurred.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @!event complete(response)\n * Triggered whenever a request cycle completes. `response.error`\n * should be checked, since the request may have failed.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @!group HTTP Events\n *\n * @!event httpHeaders(statusCode, headers, response, statusMessage)\n * Triggered when headers are sent by the remote server\n * @param statusCode [Integer] the HTTP response code\n * @param headers [map] the response headers\n * @param (see AWS.Request~send)\n * @param statusMessage [String] A status message corresponding to the HTTP\n * response code\n * @context (see AWS.Request~send)\n *\n * @!event httpData(chunk, response)\n * Triggered when data is sent by the remote server\n * @param chunk [Buffer] the buffer data containing the next data chunk\n * from the server\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n * @see AWS.EventListeners.Core.HTTP_DATA\n *\n * @!event httpUploadProgress(progress, response)\n * Triggered when the HTTP request has uploaded more data\n * @param progress [map] An object containing the `loaded` and `total` bytes\n * of the request.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n * @note This event will not be emitted in Node.js 0.8.x.\n *\n * @!event httpDownloadProgress(progress, response)\n * Triggered when the HTTP request has downloaded more data\n * @param progress [map] An object containing the `loaded` and `total` bytes\n * of the request.\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n * @note This event will not be emitted in Node.js 0.8.x.\n *\n * @!event httpError(error, response)\n * Triggered when the HTTP request failed\n * @param error [Error] the error object that was thrown\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @!event httpDone(response)\n * Triggered when the server is finished sending data\n * @param (see AWS.Request~send)\n * @context (see AWS.Request~send)\n *\n * @see AWS.Response\n */\nAWS.Request = inherit({\n\n /**\n * Creates a request for an operation on a given service with\n * a set of input parameters.\n *\n * @param service [AWS.Service] the service to perform the operation on\n * @param operation [String] the operation to perform on the service\n * @param params [Object] parameters to send to the operation.\n * See the operation's documentation for the format of the\n * parameters.\n */\n constructor: function Request(service, operation, params) {\n var endpoint = service.endpoint;\n var region = service.config.region;\n var customUserAgent = service.config.customUserAgent;\n\n // global endpoints sign as us-east-1\n if (service.isGlobalEndpoint) region = 'us-east-1';\n\n this.domain = domain && domain.active;\n this.service = service;\n this.operation = operation;\n this.params = params || {};\n this.httpRequest = new AWS.HttpRequest(endpoint, region);\n this.httpRequest.appendToUserAgent(customUserAgent);\n this.startTime = service.getSkewCorrectedDate();\n\n this.response = new AWS.Response(this);\n this._asm = new AcceptorStateMachine(fsm.states, 'validate');\n this._haltHandlersOnError = false;\n\n AWS.SequentialExecutor.call(this);\n this.emit = this.emitEvent;\n },\n\n /**\n * @!group Sending a Request\n */\n\n /**\n * @overload send(callback = null)\n * Sends the request object.\n *\n * @callback callback function(err, data)\n * If a callback is supplied, it is called when a response is returned\n * from the service.\n * @context [AWS.Request] the request object being sent.\n * @param err [Error] the error object returned from the request.\n * Set to `null` if the request is successful.\n * @param data [Object] the de-serialized data returned from\n * the request. Set to `null` if a request error occurs.\n * @example Sending a request with a callback\n * request = s3.putObject({Bucket: 'bucket', Key: 'key'});\n * request.send(function(err, data) { console.log(err, data); });\n * @example Sending a request with no callback (using event handlers)\n * request = s3.putObject({Bucket: 'bucket', Key: 'key'});\n * request.on('complete', function(response) { ... }); // register a callback\n * request.send();\n */\n send: function send(callback) {\n if (callback) {\n // append to user agent\n this.httpRequest.appendToUserAgent('callback');\n this.on('complete', function (resp) {\n callback.call(resp, resp.error, resp.data);\n });\n }\n this.runTo();\n\n return this.response;\n },\n\n /**\n * @!method promise()\n * Sends the request and returns a 'thenable' promise.\n *\n * Two callbacks can be provided to the `then` method on the returned promise.\n * The first callback will be called if the promise is fulfilled, and the second\n * callback will be called if the promise is rejected.\n * @callback fulfilledCallback function(data)\n * Called if the promise is fulfilled.\n * @param data [Object] the de-serialized data returned from the request.\n * @callback rejectedCallback function(error)\n * Called if the promise is rejected.\n * @param error [Error] the error object returned from the request.\n * @return [Promise] A promise that represents the state of the request.\n * @example Sending a request using promises.\n * var request = s3.putObject({Bucket: 'bucket', Key: 'key'});\n * var result = request.promise();\n * result.then(function(data) { ... }, function(error) { ... });\n */\n\n /**\n * @api private\n */\n build: function build(callback) {\n return this.runTo('send', callback);\n },\n\n /**\n * @api private\n */\n runTo: function runTo(state, done) {\n this._asm.runTo(state, done, this);\n return this;\n },\n\n /**\n * Aborts a request, emitting the error and complete events.\n *\n * @!macro nobrowser\n * @example Aborting a request after sending\n * var params = {\n * Bucket: 'bucket', Key: 'key',\n * Body: Buffer.alloc(1024 * 1024 * 5) // 5MB payload\n * };\n * var request = s3.putObject(params);\n * request.send(function (err, data) {\n * if (err) console.log(\"Error:\", err.code, err.message);\n * else console.log(data);\n * });\n *\n * // abort request in 1 second\n * setTimeout(request.abort.bind(request), 1000);\n *\n * // prints \"Error: RequestAbortedError Request aborted by user\"\n * @return [AWS.Request] the same request object, for chaining.\n * @since v1.4.0\n */\n abort: function abort() {\n this.removeAllListeners('validateResponse');\n this.removeAllListeners('extractError');\n this.on('validateResponse', function addAbortedError(resp) {\n resp.error = AWS.util.error(new Error('Request aborted by user'), {\n code: 'RequestAbortedError', retryable: false\n });\n });\n\n if (this.httpRequest.stream && !this.httpRequest.stream.didCallback) { // abort HTTP stream\n this.httpRequest.stream.abort();\n if (this.httpRequest._abortCallback) {\n this.httpRequest._abortCallback();\n } else {\n this.removeAllListeners('send'); // haven't sent yet, so let's not\n }\n }\n\n return this;\n },\n\n /**\n * Iterates over each page of results given a pageable request, calling\n * the provided callback with each page of data. After all pages have been\n * retrieved, the callback is called with `null` data.\n *\n * @note This operation can generate multiple requests to a service.\n * @example Iterating over multiple pages of objects in an S3 bucket\n * var pages = 1;\n * s3.listObjects().eachPage(function(err, data) {\n * if (err) return;\n * console.log(\"Page\", pages++);\n * console.log(data);\n * });\n * @example Iterating over multiple pages with an asynchronous callback\n * s3.listObjects(params).eachPage(function(err, data, done) {\n * doSomethingAsyncAndOrExpensive(function() {\n * // The next page of results isn't fetched until done is called\n * done();\n * });\n * });\n * @callback callback function(err, data, [doneCallback])\n * Called with each page of resulting data from the request. If the\n * optional `doneCallback` is provided in the function, it must be called\n * when the callback is complete.\n *\n * @param err [Error] an error object, if an error occurred.\n * @param data [Object] a single page of response data. If there is no\n * more data, this object will be `null`.\n * @param doneCallback [Function] an optional done callback. If this\n * argument is defined in the function declaration, it should be called\n * when the next page is ready to be retrieved. This is useful for\n * controlling serial pagination across asynchronous operations.\n * @return [Boolean] if the callback returns `false`, pagination will\n * stop.\n *\n * @see AWS.Request.eachItem\n * @see AWS.Response.nextPage\n * @since v1.4.0\n */\n eachPage: function eachPage(callback) {\n // Make all callbacks async-ish\n callback = AWS.util.fn.makeAsync(callback, 3);\n\n function wrappedCallback(response) {\n callback.call(response, response.error, response.data, function (result) {\n if (result === false) return;\n\n if (response.hasNextPage()) {\n response.nextPage().on('complete', wrappedCallback).send();\n } else {\n callback.call(response, null, null, AWS.util.fn.noop);\n }\n });\n }\n\n this.on('complete', wrappedCallback).send();\n },\n\n /**\n * Enumerates over individual items of a request, paging the responses if\n * necessary.\n *\n * @api experimental\n * @since v1.4.0\n */\n eachItem: function eachItem(callback) {\n var self = this;\n function wrappedCallback(err, data) {\n if (err) return callback(err, null);\n if (data === null) return callback(null, null);\n\n var config = self.service.paginationConfig(self.operation);\n var resultKey = config.resultKey;\n if (Array.isArray(resultKey)) resultKey = resultKey[0];\n var items = jmespath.search(data, resultKey);\n var continueIteration = true;\n AWS.util.arrayEach(items, function(item) {\n continueIteration = callback(null, item);\n if (continueIteration === false) {\n return AWS.util.abort;\n }\n });\n return continueIteration;\n }\n\n this.eachPage(wrappedCallback);\n },\n\n /**\n * @return [Boolean] whether the operation can return multiple pages of\n * response data.\n * @see AWS.Response.eachPage\n * @since v1.4.0\n */\n isPageable: function isPageable() {\n return this.service.paginationConfig(this.operation) ? true : false;\n },\n\n /**\n * Sends the request and converts the request object into a readable stream\n * that can be read from or piped into a writable stream.\n *\n * @note The data read from a readable stream contains only\n * the raw HTTP body contents.\n * @example Manually reading from a stream\n * request.createReadStream().on('data', function(data) {\n * console.log(\"Got data:\", data.toString());\n * });\n * @example Piping a request body into a file\n * var out = fs.createWriteStream('/path/to/outfile.jpg');\n * s3.service.getObject(params).createReadStream().pipe(out);\n * @return [Stream] the readable stream object that can be piped\n * or read from (by registering 'data' event listeners).\n * @!macro nobrowser\n */\n createReadStream: function createReadStream() {\n var streams = AWS.util.stream;\n var req = this;\n var stream = null;\n\n if (AWS.HttpClient.streamsApiVersion === 2) {\n stream = new streams.PassThrough();\n process.nextTick(function() { req.send(); });\n } else {\n stream = new streams.Stream();\n stream.readable = true;\n\n stream.sent = false;\n stream.on('newListener', function(event) {\n if (!stream.sent && event === 'data') {\n stream.sent = true;\n process.nextTick(function() { req.send(); });\n }\n });\n }\n\n this.on('error', function(err) {\n stream.emit('error', err);\n });\n\n this.on('httpHeaders', function streamHeaders(statusCode, headers, resp) {\n if (statusCode < 300) {\n req.removeListener('httpData', AWS.EventListeners.Core.HTTP_DATA);\n req.removeListener('httpError', AWS.EventListeners.Core.HTTP_ERROR);\n req.on('httpError', function streamHttpError(error) {\n resp.error = error;\n resp.error.retryable = false;\n });\n\n var shouldCheckContentLength = false;\n var expectedLen;\n if (req.httpRequest.method !== 'HEAD') {\n expectedLen = parseInt(headers['content-length'], 10);\n }\n if (expectedLen !== undefined && !isNaN(expectedLen) && expectedLen >= 0) {\n shouldCheckContentLength = true;\n var receivedLen = 0;\n }\n\n var checkContentLengthAndEmit = function checkContentLengthAndEmit() {\n if (shouldCheckContentLength && receivedLen !== expectedLen) {\n stream.emit('error', AWS.util.error(\n new Error('Stream content length mismatch. Received ' +\n receivedLen + ' of ' + expectedLen + ' bytes.'),\n { code: 'StreamContentLengthMismatch' }\n ));\n } else if (AWS.HttpClient.streamsApiVersion === 2) {\n stream.end();\n } else {\n stream.emit('end');\n }\n };\n\n var httpStream = resp.httpResponse.createUnbufferedStream();\n\n if (AWS.HttpClient.streamsApiVersion === 2) {\n if (shouldCheckContentLength) {\n var lengthAccumulator = new streams.PassThrough();\n lengthAccumulator._write = function(chunk) {\n if (chunk && chunk.length) {\n receivedLen += chunk.length;\n }\n return streams.PassThrough.prototype._write.apply(this, arguments);\n };\n\n lengthAccumulator.on('end', checkContentLengthAndEmit);\n stream.on('error', function(err) {\n shouldCheckContentLength = false;\n httpStream.unpipe(lengthAccumulator);\n lengthAccumulator.emit('end');\n lengthAccumulator.end();\n });\n httpStream.pipe(lengthAccumulator).pipe(stream, { end: false });\n } else {\n httpStream.pipe(stream);\n }\n } else {\n\n if (shouldCheckContentLength) {\n httpStream.on('data', function(arg) {\n if (arg && arg.length) {\n receivedLen += arg.length;\n }\n });\n }\n\n httpStream.on('data', function(arg) {\n stream.emit('data', arg);\n });\n httpStream.on('end', checkContentLengthAndEmit);\n }\n\n httpStream.on('error', function(err) {\n shouldCheckContentLength = false;\n stream.emit('error', err);\n });\n }\n });\n\n return stream;\n },\n\n /**\n * @param [Array,Response] args This should be the response object,\n * or an array of args to send to the event.\n * @api private\n */\n emitEvent: function emit(eventName, args, done) {\n if (typeof args === 'function') { done = args; args = null; }\n if (!done) done = function() { };\n if (!args) args = this.eventParameters(eventName, this.response);\n\n var origEmit = AWS.SequentialExecutor.prototype.emit;\n origEmit.call(this, eventName, args, function (err) {\n if (err) this.response.error = err;\n done.call(this, err);\n });\n },\n\n /**\n * @api private\n */\n eventParameters: function eventParameters(eventName) {\n switch (eventName) {\n case 'restart':\n case 'validate':\n case 'sign':\n case 'build':\n case 'afterValidate':\n case 'afterBuild':\n return [this];\n case 'error':\n return [this.response.error, this.response];\n default:\n return [this.response];\n }\n },\n\n /**\n * @api private\n */\n presign: function presign(expires, callback) {\n if (!callback && typeof expires === 'function') {\n callback = expires;\n expires = null;\n }\n return new AWS.Signers.Presign().sign(this.toGet(), expires, callback);\n },\n\n /**\n * @api private\n */\n isPresigned: function isPresigned() {\n return Object.prototype.hasOwnProperty.call(this.httpRequest.headers, 'presigned-expires');\n },\n\n /**\n * @api private\n */\n toUnauthenticated: function toUnauthenticated() {\n this._unAuthenticated = true;\n this.removeListener('validate', AWS.EventListeners.Core.VALIDATE_CREDENTIALS);\n this.removeListener('sign', AWS.EventListeners.Core.SIGN);\n return this;\n },\n\n /**\n * @api private\n */\n toGet: function toGet() {\n if (this.service.api.protocol === 'query' ||\n this.service.api.protocol === 'ec2') {\n this.removeListener('build', this.buildAsGet);\n this.addListener('build', this.buildAsGet);\n }\n return this;\n },\n\n /**\n * @api private\n */\n buildAsGet: function buildAsGet(request) {\n request.httpRequest.method = 'GET';\n request.httpRequest.path = request.service.endpoint.path +\n '?' + request.httpRequest.body;\n request.httpRequest.body = '';\n\n // don't need these headers on a GET request\n delete request.httpRequest.headers['Content-Length'];\n delete request.httpRequest.headers['Content-Type'];\n },\n\n /**\n * @api private\n */\n haltHandlersOnError: function haltHandlersOnError() {\n this._haltHandlersOnError = true;\n }\n});\n\n/**\n * @api private\n */\nAWS.Request.addPromisesToClass = function addPromisesToClass(PromiseDependency) {\n this.prototype.promise = function promise() {\n var self = this;\n // append to user agent\n this.httpRequest.appendToUserAgent('promise');\n return new PromiseDependency(function(resolve, reject) {\n self.on('complete', function(resp) {\n if (resp.error) {\n reject(resp.error);\n } else {\n // define $response property so that it is not enumberable\n // this prevents circular reference errors when stringifying the JSON object\n resolve(Object.defineProperty(\n resp.data || {},\n '$response',\n {value: resp}\n ));\n }\n });\n self.runTo();\n });\n };\n};\n\n/**\n * @api private\n */\nAWS.Request.deletePromisesFromClass = function deletePromisesFromClass() {\n delete this.prototype.promise;\n};\n\nAWS.util.addPromises(AWS.Request);\n\nAWS.util.mixin(AWS.Request, AWS.SequentialExecutor);\n","var AWS = require('./core');\nvar Api = require('./model/api');\nvar regionConfig = require('./region_config');\n\nvar inherit = AWS.util.inherit;\nvar clientCount = 0;\n\n/**\n * The service class representing an AWS service.\n *\n * @class_abstract This class is an abstract class.\n *\n * @!attribute apiVersions\n * @return [Array] the list of API versions supported by this service.\n * @readonly\n */\nAWS.Service = inherit({\n /**\n * Create a new service object with a configuration object\n *\n * @param config [map] a map of configuration options\n */\n constructor: function Service(config) {\n if (!this.loadServiceClass) {\n throw AWS.util.error(new Error(),\n 'Service must be constructed with `new\\' operator');\n }\n var ServiceClass = this.loadServiceClass(config || {});\n if (ServiceClass) {\n var originalConfig = AWS.util.copy(config);\n var svc = new ServiceClass(config);\n Object.defineProperty(svc, '_originalConfig', {\n get: function() { return originalConfig; },\n enumerable: false,\n configurable: true\n });\n svc._clientId = ++clientCount;\n return svc;\n }\n this.initialize(config);\n },\n\n /**\n * @api private\n */\n initialize: function initialize(config) {\n var svcConfig = AWS.config[this.serviceIdentifier];\n this.config = new AWS.Config(AWS.config);\n if (svcConfig) this.config.update(svcConfig, true);\n if (config) this.config.update(config, true);\n\n this.validateService();\n if (!this.config.endpoint) regionConfig(this);\n\n this.config.endpoint = this.endpointFromTemplate(this.config.endpoint);\n this.setEndpoint(this.config.endpoint);\n //enable attaching listeners to service client\n AWS.SequentialExecutor.call(this);\n AWS.Service.addDefaultMonitoringListeners(this);\n if ((this.config.clientSideMonitoring || AWS.Service._clientSideMonitoring) && this.publisher) {\n var publisher = this.publisher;\n this.addNamedListener('PUBLISH_API_CALL', 'apiCall', function PUBLISH_API_CALL(event) {\n process.nextTick(function() {publisher.eventHandler(event);});\n });\n this.addNamedListener('PUBLISH_API_ATTEMPT', 'apiCallAttempt', function PUBLISH_API_ATTEMPT(event) {\n process.nextTick(function() {publisher.eventHandler(event);});\n });\n }\n },\n\n /**\n * @api private\n */\n validateService: function validateService() {\n },\n\n /**\n * @api private\n */\n loadServiceClass: function loadServiceClass(serviceConfig) {\n var config = serviceConfig;\n if (!AWS.util.isEmpty(this.api)) {\n return null;\n } else if (config.apiConfig) {\n return AWS.Service.defineServiceApi(this.constructor, config.apiConfig);\n } else if (!this.constructor.services) {\n return null;\n } else {\n config = new AWS.Config(AWS.config);\n config.update(serviceConfig, true);\n var version = config.apiVersions[this.constructor.serviceIdentifier];\n version = version || config.apiVersion;\n return this.getLatestServiceClass(version);\n }\n },\n\n /**\n * @api private\n */\n getLatestServiceClass: function getLatestServiceClass(version) {\n version = this.getLatestServiceVersion(version);\n if (this.constructor.services[version] === null) {\n AWS.Service.defineServiceApi(this.constructor, version);\n }\n\n return this.constructor.services[version];\n },\n\n /**\n * @api private\n */\n getLatestServiceVersion: function getLatestServiceVersion(version) {\n if (!this.constructor.services || this.constructor.services.length === 0) {\n throw new Error('No services defined on ' +\n this.constructor.serviceIdentifier);\n }\n\n if (!version) {\n version = 'latest';\n } else if (AWS.util.isType(version, Date)) {\n version = AWS.util.date.iso8601(version).split('T')[0];\n }\n\n if (Object.hasOwnProperty(this.constructor.services, version)) {\n return version;\n }\n\n var keys = Object.keys(this.constructor.services).sort();\n var selectedVersion = null;\n for (var i = keys.length - 1; i >= 0; i--) {\n // versions that end in \"*\" are not available on disk and can be\n // skipped, so do not choose these as selectedVersions\n if (keys[i][keys[i].length - 1] !== '*') {\n selectedVersion = keys[i];\n }\n if (keys[i].substr(0, 10) <= version) {\n return selectedVersion;\n }\n }\n\n throw new Error('Could not find ' + this.constructor.serviceIdentifier +\n ' API to satisfy version constraint `' + version + '\\'');\n },\n\n /**\n * @api private\n */\n api: {},\n\n /**\n * @api private\n */\n defaultRetryCount: 3,\n\n /**\n * @api private\n */\n customizeRequests: function customizeRequests(callback) {\n if (!callback) {\n this.customRequestHandler = null;\n } else if (typeof callback === 'function') {\n this.customRequestHandler = callback;\n } else {\n throw new Error('Invalid callback type \\'' + typeof callback + '\\' provided in customizeRequests');\n }\n },\n\n /**\n * Calls an operation on a service with the given input parameters.\n *\n * @param operation [String] the name of the operation to call on the service.\n * @param params [map] a map of input options for the operation\n * @callback callback function(err, data)\n * If a callback is supplied, it is called when a response is returned\n * from the service.\n * @param err [Error] the error object returned from the request.\n * Set to `null` if the request is successful.\n * @param data [Object] the de-serialized data returned from\n * the request. Set to `null` if a request error occurs.\n */\n makeRequest: function makeRequest(operation, params, callback) {\n if (typeof params === 'function') {\n callback = params;\n params = null;\n }\n\n params = params || {};\n if (this.config.params) { // copy only toplevel bound params\n var rules = this.api.operations[operation];\n if (rules) {\n params = AWS.util.copy(params);\n AWS.util.each(this.config.params, function(key, value) {\n if (rules.input.members[key]) {\n if (params[key] === undefined || params[key] === null) {\n params[key] = value;\n }\n }\n });\n }\n }\n\n var request = new AWS.Request(this, operation, params);\n this.addAllRequestListeners(request);\n this.attachMonitoringEmitter(request);\n if (callback) request.send(callback);\n return request;\n },\n\n /**\n * Calls an operation on a service with the given input parameters, without\n * any authentication data. This method is useful for \"public\" API operations.\n *\n * @param operation [String] the name of the operation to call on the service.\n * @param params [map] a map of input options for the operation\n * @callback callback function(err, data)\n * If a callback is supplied, it is called when a response is returned\n * from the service.\n * @param err [Error] the error object returned from the request.\n * Set to `null` if the request is successful.\n * @param data [Object] the de-serialized data returned from\n * the request. Set to `null` if a request error occurs.\n */\n makeUnauthenticatedRequest: function makeUnauthenticatedRequest(operation, params, callback) {\n if (typeof params === 'function') {\n callback = params;\n params = {};\n }\n\n var request = this.makeRequest(operation, params).toUnauthenticated();\n return callback ? request.send(callback) : request;\n },\n\n /**\n * Waits for a given state\n *\n * @param state [String] the state on the service to wait for\n * @param params [map] a map of parameters to pass with each request\n * @option params $waiter [map] a map of configuration options for the waiter\n * @option params $waiter.delay [Number] The number of seconds to wait between\n * requests\n * @option params $waiter.maxAttempts [Number] The maximum number of requests\n * to send while waiting\n * @callback callback function(err, data)\n * If a callback is supplied, it is called when a response is returned\n * from the service.\n * @param err [Error] the error object returned from the request.\n * Set to `null` if the request is successful.\n * @param data [Object] the de-serialized data returned from\n * the request. Set to `null` if a request error occurs.\n */\n waitFor: function waitFor(state, params, callback) {\n var waiter = new AWS.ResourceWaiter(this, state);\n return waiter.wait(params, callback);\n },\n\n /**\n * @api private\n */\n addAllRequestListeners: function addAllRequestListeners(request) {\n var list = [AWS.events, AWS.EventListeners.Core, this.serviceInterface(),\n AWS.EventListeners.CorePost];\n for (var i = 0; i < list.length; i++) {\n if (list[i]) request.addListeners(list[i]);\n }\n\n // disable parameter validation\n if (!this.config.paramValidation) {\n request.removeListener('validate',\n AWS.EventListeners.Core.VALIDATE_PARAMETERS);\n }\n\n if (this.config.logger) { // add logging events\n request.addListeners(AWS.EventListeners.Logger);\n }\n\n this.setupRequestListeners(request);\n // call prototype's customRequestHandler\n if (typeof this.constructor.prototype.customRequestHandler === 'function') {\n this.constructor.prototype.customRequestHandler(request);\n }\n // call instance's customRequestHandler\n if (Object.prototype.hasOwnProperty.call(this, 'customRequestHandler') && typeof this.customRequestHandler === 'function') {\n this.customRequestHandler(request);\n }\n },\n\n /**\n * Event recording metrics for a whole API call.\n * @returns {object} a subset of api call metrics\n * @api private\n */\n apiCallEvent: function apiCallEvent(request) {\n var api = request.service.api.operations[request.operation];\n var monitoringEvent = {\n Type: 'ApiCall',\n Api: api ? api.name : request.operation,\n Version: 1,\n Service: request.service.api.serviceId || request.service.api.endpointPrefix,\n Region: request.httpRequest.region,\n MaxRetriesExceeded: 0,\n UserAgent: request.httpRequest.getUserAgent(),\n };\n var response = request.response;\n if (response.httpResponse.statusCode) {\n monitoringEvent.FinalHttpStatusCode = response.httpResponse.statusCode;\n }\n if (response.error) {\n var error = response.error;\n var statusCode = response.httpResponse.statusCode;\n if (statusCode > 299) {\n if (error.code) monitoringEvent.FinalAwsException = error.code;\n if (error.message) monitoringEvent.FinalAwsExceptionMessage = error.message;\n } else {\n if (error.code || error.name) monitoringEvent.FinalSdkException = error.code || error.name;\n if (error.message) monitoringEvent.FinalSdkExceptionMessage = error.message;\n }\n }\n return monitoringEvent;\n },\n\n /**\n * Event recording metrics for an API call attempt.\n * @returns {object} a subset of api call attempt metrics\n * @api private\n */\n apiAttemptEvent: function apiAttemptEvent(request) {\n var api = request.service.api.operations[request.operation];\n var monitoringEvent = {\n Type: 'ApiCallAttempt',\n Api: api ? api.name : request.operation,\n Version: 1,\n Service: request.service.api.serviceId || request.service.api.endpointPrefix,\n Fqdn: request.httpRequest.endpoint.hostname,\n UserAgent: request.httpRequest.getUserAgent(),\n };\n var response = request.response;\n if (response.httpResponse.statusCode) {\n monitoringEvent.HttpStatusCode = response.httpResponse.statusCode;\n }\n if (\n !request._unAuthenticated &&\n request.service.config.credentials &&\n request.service.config.credentials.accessKeyId\n ) {\n monitoringEvent.AccessKey = request.service.config.credentials.accessKeyId;\n }\n if (!response.httpResponse.headers) return monitoringEvent;\n if (request.httpRequest.headers['x-amz-security-token']) {\n monitoringEvent.SessionToken = request.httpRequest.headers['x-amz-security-token'];\n }\n if (response.httpResponse.headers['x-amzn-requestid']) {\n monitoringEvent.XAmznRequestId = response.httpResponse.headers['x-amzn-requestid'];\n }\n if (response.httpResponse.headers['x-amz-request-id']) {\n monitoringEvent.XAmzRequestId = response.httpResponse.headers['x-amz-request-id'];\n }\n if (response.httpResponse.headers['x-amz-id-2']) {\n monitoringEvent.XAmzId2 = response.httpResponse.headers['x-amz-id-2'];\n }\n return monitoringEvent;\n },\n\n /**\n * Add metrics of failed request.\n * @api private\n */\n attemptFailEvent: function attemptFailEvent(request) {\n var monitoringEvent = this.apiAttemptEvent(request);\n var response = request.response;\n var error = response.error;\n if (response.httpResponse.statusCode > 299 ) {\n if (error.code) monitoringEvent.AwsException = error.code;\n if (error.message) monitoringEvent.AwsExceptionMessage = error.message;\n } else {\n if (error.code || error.name) monitoringEvent.SdkException = error.code || error.name;\n if (error.message) monitoringEvent.SdkExceptionMessage = error.message;\n }\n return monitoringEvent;\n },\n\n /**\n * Attach listeners to request object to fetch metrics of each request\n * and emit data object through \\'ApiCall\\' and \\'ApiCallAttempt\\' events.\n * @api private\n */\n attachMonitoringEmitter: function attachMonitoringEmitter(request) {\n var attemptTimestamp; //timestamp marking the beginning of a request attempt\n var attemptStartRealTime; //Start time of request attempt. Used to calculating attemptLatency\n var attemptLatency; //latency from request sent out to http response reaching SDK\n var callStartRealTime; //Start time of API call. Used to calculating API call latency\n var attemptCount = 0; //request.retryCount is not reliable here\n var region; //region cache region for each attempt since it can be updated in plase (e.g. s3)\n var callTimestamp; //timestamp when the request is created\n var self = this;\n var addToHead = true;\n\n request.on('validate', function () {\n callStartRealTime = AWS.util.realClock.now();\n callTimestamp = Date.now();\n }, addToHead);\n request.on('sign', function () {\n attemptStartRealTime = AWS.util.realClock.now();\n attemptTimestamp = Date.now();\n region = request.httpRequest.region;\n attemptCount++;\n }, addToHead);\n request.on('validateResponse', function() {\n attemptLatency = Math.round(AWS.util.realClock.now() - attemptStartRealTime);\n });\n request.addNamedListener('API_CALL_ATTEMPT', 'success', function API_CALL_ATTEMPT() {\n var apiAttemptEvent = self.apiAttemptEvent(request);\n apiAttemptEvent.Timestamp = attemptTimestamp;\n apiAttemptEvent.AttemptLatency = attemptLatency >= 0 ? attemptLatency : 0;\n apiAttemptEvent.Region = region;\n self.emit('apiCallAttempt', [apiAttemptEvent]);\n });\n request.addNamedListener('API_CALL_ATTEMPT_RETRY', 'retry', function API_CALL_ATTEMPT_RETRY() {\n var apiAttemptEvent = self.attemptFailEvent(request);\n apiAttemptEvent.Timestamp = attemptTimestamp;\n //attemptLatency may not be available if fail before response\n attemptLatency = attemptLatency ||\n Math.round(AWS.util.realClock.now() - attemptStartRealTime);\n apiAttemptEvent.AttemptLatency = attemptLatency >= 0 ? attemptLatency : 0;\n apiAttemptEvent.Region = region;\n self.emit('apiCallAttempt', [apiAttemptEvent]);\n });\n request.addNamedListener('API_CALL', 'complete', function API_CALL() {\n var apiCallEvent = self.apiCallEvent(request);\n apiCallEvent.AttemptCount = attemptCount;\n if (apiCallEvent.AttemptCount <= 0) return;\n apiCallEvent.Timestamp = callTimestamp;\n var latency = Math.round(AWS.util.realClock.now() - callStartRealTime);\n apiCallEvent.Latency = latency >= 0 ? latency : 0;\n var response = request.response;\n if (\n typeof response.retryCount === 'number' &&\n typeof response.maxRetries === 'number' &&\n (response.retryCount >= response.maxRetries)\n ) {\n apiCallEvent.MaxRetriesExceeded = 1;\n }\n self.emit('apiCall', [apiCallEvent]);\n });\n },\n\n /**\n * Override this method to setup any custom request listeners for each\n * new request to the service.\n *\n * @method_abstract This is an abstract method.\n */\n setupRequestListeners: function setupRequestListeners(request) {\n },\n\n /**\n * Gets the signer class for a given request\n * @api private\n */\n getSignerClass: function getSignerClass(request) {\n var version;\n // get operation authtype if present\n var operation = null;\n var authtype = '';\n if (request) {\n var operations = request.service.api.operations || {};\n operation = operations[request.operation] || null;\n authtype = operation ? operation.authtype : '';\n }\n if (this.config.signatureVersion) {\n version = this.config.signatureVersion;\n } else if (authtype === 'v4' || authtype === 'v4-unsigned-body') {\n version = 'v4';\n } else {\n version = this.api.signatureVersion;\n }\n return AWS.Signers.RequestSigner.getVersion(version);\n },\n\n /**\n * @api private\n */\n serviceInterface: function serviceInterface() {\n switch (this.api.protocol) {\n case 'ec2': return AWS.EventListeners.Query;\n case 'query': return AWS.EventListeners.Query;\n case 'json': return AWS.EventListeners.Json;\n case 'rest-json': return AWS.EventListeners.RestJson;\n case 'rest-xml': return AWS.EventListeners.RestXml;\n }\n if (this.api.protocol) {\n throw new Error('Invalid service `protocol\\' ' +\n this.api.protocol + ' in API config');\n }\n },\n\n /**\n * @api private\n */\n successfulResponse: function successfulResponse(resp) {\n return resp.httpResponse.statusCode < 300;\n },\n\n /**\n * How many times a failed request should be retried before giving up.\n * the defaultRetryCount can be overriden by service classes.\n *\n * @api private\n */\n numRetries: function numRetries() {\n if (this.config.maxRetries !== undefined) {\n return this.config.maxRetries;\n } else {\n return this.defaultRetryCount;\n }\n },\n\n /**\n * @api private\n */\n retryDelays: function retryDelays(retryCount) {\n return AWS.util.calculateRetryDelay(retryCount, this.config.retryDelayOptions);\n },\n\n /**\n * @api private\n */\n retryableError: function retryableError(error) {\n if (this.timeoutError(error)) return true;\n if (this.networkingError(error)) return true;\n if (this.expiredCredentialsError(error)) return true;\n if (this.throttledError(error)) return true;\n if (error.statusCode >= 500) return true;\n return false;\n },\n\n /**\n * @api private\n */\n networkingError: function networkingError(error) {\n return error.code === 'NetworkingError';\n },\n\n /**\n * @api private\n */\n timeoutError: function timeoutError(error) {\n return error.code === 'TimeoutError';\n },\n\n /**\n * @api private\n */\n expiredCredentialsError: function expiredCredentialsError(error) {\n // TODO : this only handles *one* of the expired credential codes\n return (error.code === 'ExpiredTokenException');\n },\n\n /**\n * @api private\n */\n clockSkewError: function clockSkewError(error) {\n switch (error.code) {\n case 'RequestTimeTooSkewed':\n case 'RequestExpired':\n case 'InvalidSignatureException':\n case 'SignatureDoesNotMatch':\n case 'AuthFailure':\n case 'RequestInTheFuture':\n return true;\n default: return false;\n }\n },\n\n /**\n * @api private\n */\n getSkewCorrectedDate: function getSkewCorrectedDate() {\n return new Date(Date.now() + this.config.systemClockOffset);\n },\n\n /**\n * @api private\n */\n applyClockOffset: function applyClockOffset(newServerTime) {\n if (newServerTime) {\n this.config.systemClockOffset = newServerTime - Date.now();\n }\n },\n\n /**\n * @api private\n */\n isClockSkewed: function isClockSkewed(newServerTime) {\n if (newServerTime) {\n return Math.abs(this.getSkewCorrectedDate().getTime() - newServerTime) >= 30000;\n }\n },\n\n /**\n * @api private\n */\n throttledError: function throttledError(error) {\n // this logic varies between services\n switch (error.code) {\n case 'ProvisionedThroughputExceededException':\n case 'Throttling':\n case 'ThrottlingException':\n case 'RequestLimitExceeded':\n case 'RequestThrottled':\n case 'RequestThrottledException':\n case 'TooManyRequestsException':\n case 'TransactionInProgressException': //dynamodb\n return true;\n default:\n return false;\n }\n },\n\n /**\n * @api private\n */\n endpointFromTemplate: function endpointFromTemplate(endpoint) {\n if (typeof endpoint !== 'string') return endpoint;\n\n var e = endpoint;\n e = e.replace(/\\{service\\}/g, this.api.endpointPrefix);\n e = e.replace(/\\{region\\}/g, this.config.region);\n e = e.replace(/\\{scheme\\}/g, this.config.sslEnabled ? 'https' : 'http');\n return e;\n },\n\n /**\n * @api private\n */\n setEndpoint: function setEndpoint(endpoint) {\n this.endpoint = new AWS.Endpoint(endpoint, this.config);\n },\n\n /**\n * @api private\n */\n paginationConfig: function paginationConfig(operation, throwException) {\n var paginator = this.api.operations[operation].paginator;\n if (!paginator) {\n if (throwException) {\n var e = new Error();\n throw AWS.util.error(e, 'No pagination configuration for ' + operation);\n }\n return null;\n }\n\n return paginator;\n }\n});\n\nAWS.util.update(AWS.Service, {\n\n /**\n * Adds one method for each operation described in the api configuration\n *\n * @api private\n */\n defineMethods: function defineMethods(svc) {\n AWS.util.each(svc.prototype.api.operations, function iterator(method) {\n if (svc.prototype[method]) return;\n var operation = svc.prototype.api.operations[method];\n if (operation.authtype === 'none') {\n svc.prototype[method] = function (params, callback) {\n return this.makeUnauthenticatedRequest(method, params, callback);\n };\n } else {\n svc.prototype[method] = function (params, callback) {\n return this.makeRequest(method, params, callback);\n };\n }\n });\n },\n\n /**\n * Defines a new Service class using a service identifier and list of versions\n * including an optional set of features (functions) to apply to the class\n * prototype.\n *\n * @param serviceIdentifier [String] the identifier for the service\n * @param versions [Array] a list of versions that work with this\n * service\n * @param features [Object] an object to attach to the prototype\n * @return [Class] the service class defined by this function.\n */\n defineService: function defineService(serviceIdentifier, versions, features) {\n AWS.Service._serviceMap[serviceIdentifier] = true;\n if (!Array.isArray(versions)) {\n features = versions;\n versions = [];\n }\n\n var svc = inherit(AWS.Service, features || {});\n\n if (typeof serviceIdentifier === 'string') {\n AWS.Service.addVersions(svc, versions);\n\n var identifier = svc.serviceIdentifier || serviceIdentifier;\n svc.serviceIdentifier = identifier;\n } else { // defineService called with an API\n svc.prototype.api = serviceIdentifier;\n AWS.Service.defineMethods(svc);\n }\n AWS.SequentialExecutor.call(this.prototype);\n //util.clientSideMonitoring is only available in node\n if (!this.prototype.publisher && AWS.util.clientSideMonitoring) {\n var Publisher = AWS.util.clientSideMonitoring.Publisher;\n var configProvider = AWS.util.clientSideMonitoring.configProvider;\n var publisherConfig = configProvider();\n this.prototype.publisher = new Publisher(publisherConfig);\n if (publisherConfig.enabled) {\n //if csm is enabled in environment, SDK should send all metrics\n AWS.Service._clientSideMonitoring = true;\n }\n }\n AWS.SequentialExecutor.call(svc.prototype);\n AWS.Service.addDefaultMonitoringListeners(svc.prototype);\n return svc;\n },\n\n /**\n * @api private\n */\n addVersions: function addVersions(svc, versions) {\n if (!Array.isArray(versions)) versions = [versions];\n\n svc.services = svc.services || {};\n for (var i = 0; i < versions.length; i++) {\n if (svc.services[versions[i]] === undefined) {\n svc.services[versions[i]] = null;\n }\n }\n\n svc.apiVersions = Object.keys(svc.services).sort();\n },\n\n /**\n * @api private\n */\n defineServiceApi: function defineServiceApi(superclass, version, apiConfig) {\n var svc = inherit(superclass, {\n serviceIdentifier: superclass.serviceIdentifier\n });\n\n function setApi(api) {\n if (api.isApi) {\n svc.prototype.api = api;\n } else {\n svc.prototype.api = new Api(api);\n }\n }\n\n if (typeof version === 'string') {\n if (apiConfig) {\n setApi(apiConfig);\n } else {\n try {\n setApi(AWS.apiLoader(superclass.serviceIdentifier, version));\n } catch (err) {\n throw AWS.util.error(err, {\n message: 'Could not find API configuration ' +\n superclass.serviceIdentifier + '-' + version\n });\n }\n }\n if (!Object.prototype.hasOwnProperty.call(superclass.services, version)) {\n superclass.apiVersions = superclass.apiVersions.concat(version).sort();\n }\n superclass.services[version] = svc;\n } else {\n setApi(version);\n }\n\n AWS.Service.defineMethods(svc);\n return svc;\n },\n\n /**\n * @api private\n */\n hasService: function(identifier) {\n return Object.prototype.hasOwnProperty.call(AWS.Service._serviceMap, identifier);\n },\n\n /**\n * @param attachOn attach default monitoring listeners to object\n *\n * Each monitoring event should be emitted from service client to service constructor prototype and then\n * to global service prototype like bubbling up. These default monitoring events listener will transfer\n * the monitoring events to the upper layer.\n * @api private\n */\n addDefaultMonitoringListeners: function addDefaultMonitoringListeners(attachOn) {\n attachOn.addNamedListener('MONITOR_EVENTS_BUBBLE', 'apiCallAttempt', function EVENTS_BUBBLE(event) {\n var baseClass = Object.getPrototypeOf(attachOn);\n if (baseClass._events) baseClass.emit('apiCallAttempt', [event]);\n });\n attachOn.addNamedListener('CALL_EVENTS_BUBBLE', 'apiCall', function CALL_EVENTS_BUBBLE(event) {\n var baseClass = Object.getPrototypeOf(attachOn);\n if (baseClass._events) baseClass.emit('apiCall', [event]);\n });\n },\n\n /**\n * @api private\n */\n _serviceMap: {}\n});\n\nAWS.util.mixin(AWS.Service, AWS.SequentialExecutor);\n\n/**\n * @api private\n */\nmodule.exports = AWS.Service;\n","var AWS = require('../core');\n\nAWS.util.update(AWS.SQS.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n request.addListener('build', this.buildEndpoint);\n\n if (request.service.config.computeChecksums) {\n if (request.operation === 'sendMessage') {\n request.addListener('extractData', this.verifySendMessageChecksum);\n } else if (request.operation === 'sendMessageBatch') {\n request.addListener('extractData', this.verifySendMessageBatchChecksum);\n } else if (request.operation === 'receiveMessage') {\n request.addListener('extractData', this.verifyReceiveMessageChecksum);\n }\n }\n },\n\n /**\n * @api private\n */\n verifySendMessageChecksum: function verifySendMessageChecksum(response) {\n if (!response.data) return;\n\n var md5 = response.data.MD5OfMessageBody;\n var body = this.params.MessageBody;\n var calculatedMd5 = this.service.calculateChecksum(body);\n if (calculatedMd5 !== md5) {\n var msg = 'Got \"' + response.data.MD5OfMessageBody +\n '\", expecting \"' + calculatedMd5 + '\".';\n this.service.throwInvalidChecksumError(response,\n [response.data.MessageId], msg);\n }\n },\n\n /**\n * @api private\n */\n verifySendMessageBatchChecksum: function verifySendMessageBatchChecksum(response) {\n if (!response.data) return;\n\n var service = this.service;\n var entries = {};\n var errors = [];\n var messageIds = [];\n AWS.util.arrayEach(response.data.Successful, function (entry) {\n entries[entry.Id] = entry;\n });\n AWS.util.arrayEach(this.params.Entries, function (entry) {\n if (entries[entry.Id]) {\n var md5 = entries[entry.Id].MD5OfMessageBody;\n var body = entry.MessageBody;\n if (!service.isChecksumValid(md5, body)) {\n errors.push(entry.Id);\n messageIds.push(entries[entry.Id].MessageId);\n }\n }\n });\n\n if (errors.length > 0) {\n service.throwInvalidChecksumError(response, messageIds,\n 'Invalid messages: ' + errors.join(', '));\n }\n },\n\n /**\n * @api private\n */\n verifyReceiveMessageChecksum: function verifyReceiveMessageChecksum(response) {\n if (!response.data) return;\n\n var service = this.service;\n var messageIds = [];\n AWS.util.arrayEach(response.data.Messages, function(message) {\n var md5 = message.MD5OfBody;\n var body = message.Body;\n if (!service.isChecksumValid(md5, body)) {\n messageIds.push(message.MessageId);\n }\n });\n\n if (messageIds.length > 0) {\n service.throwInvalidChecksumError(response, messageIds,\n 'Invalid messages: ' + messageIds.join(', '));\n }\n },\n\n /**\n * @api private\n */\n throwInvalidChecksumError: function throwInvalidChecksumError(response, ids, message) {\n response.error = AWS.util.error(new Error(), {\n retryable: true,\n code: 'InvalidChecksum',\n messageIds: ids,\n message: response.request.operation +\n ' returned an invalid MD5 response. ' + message\n });\n },\n\n /**\n * @api private\n */\n isChecksumValid: function isChecksumValid(checksum, data) {\n return this.calculateChecksum(data) === checksum;\n },\n\n /**\n * @api private\n */\n calculateChecksum: function calculateChecksum(data) {\n return AWS.util.crypto.md5(data, 'hex');\n },\n\n /**\n * @api private\n */\n buildEndpoint: function buildEndpoint(request) {\n var url = request.httpRequest.params.QueueUrl;\n if (url) {\n request.httpRequest.endpoint = new AWS.Endpoint(url);\n\n // signature version 4 requires the region name to be set,\n // sqs queue urls contain the region name\n var matches = request.httpRequest.endpoint.host.match(/^sqs\\.(.+?)\\./);\n if (matches) request.httpRequest.region = matches[1];\n }\n }\n});\n","require('../polly/presigner');\n","/**\n * Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"). You\n * may not use this file except in compliance with the License. A copy of\n * the License is located at\n *\n * http://aws.amazon.com/apache2.0/\n *\n * or in the \"license\" file accompanying this file. This file is\n * distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF\n * ANY KIND, either express or implied. See the License for the specific\n * language governing permissions and limitations under the License.\n */\n\nvar AWS = require('./core');\nvar inherit = AWS.util.inherit;\nvar jmespath = require('jmespath');\n\n/**\n * @api private\n */\nfunction CHECK_ACCEPTORS(resp) {\n var waiter = resp.request._waiter;\n var acceptors = waiter.config.acceptors;\n var acceptorMatched = false;\n var state = 'retry';\n\n acceptors.forEach(function(acceptor) {\n if (!acceptorMatched) {\n var matcher = waiter.matchers[acceptor.matcher];\n if (matcher && matcher(resp, acceptor.expected, acceptor.argument)) {\n acceptorMatched = true;\n state = acceptor.state;\n }\n }\n });\n\n if (!acceptorMatched && resp.error) state = 'failure';\n\n if (state === 'success') {\n waiter.setSuccess(resp);\n } else {\n waiter.setError(resp, state === 'retry');\n }\n}\n\n/**\n * @api private\n */\nAWS.ResourceWaiter = inherit({\n /**\n * Waits for a given state on a service object\n * @param service [Service] the service object to wait on\n * @param state [String] the state (defined in waiter configuration) to wait\n * for.\n * @example Create a waiter for running EC2 instances\n * var ec2 = new AWS.EC2;\n * var waiter = new AWS.ResourceWaiter(ec2, 'instanceRunning');\n */\n constructor: function constructor(service, state) {\n this.service = service;\n this.state = state;\n this.loadWaiterConfig(this.state);\n },\n\n service: null,\n\n state: null,\n\n config: null,\n\n matchers: {\n path: function(resp, expected, argument) {\n try {\n var result = jmespath.search(resp.data, argument);\n } catch (err) {\n return false;\n }\n\n return jmespath.strictDeepEqual(result,expected);\n },\n\n pathAll: function(resp, expected, argument) {\n try {\n var results = jmespath.search(resp.data, argument);\n } catch (err) {\n return false;\n }\n\n if (!Array.isArray(results)) results = [results];\n var numResults = results.length;\n if (!numResults) return false;\n for (var ind = 0 ; ind < numResults; ind++) {\n if (!jmespath.strictDeepEqual(results[ind], expected)) {\n return false;\n }\n }\n return true;\n },\n\n pathAny: function(resp, expected, argument) {\n try {\n var results = jmespath.search(resp.data, argument);\n } catch (err) {\n return false;\n }\n\n if (!Array.isArray(results)) results = [results];\n var numResults = results.length;\n for (var ind = 0 ; ind < numResults; ind++) {\n if (jmespath.strictDeepEqual(results[ind], expected)) {\n return true;\n }\n }\n return false;\n },\n\n status: function(resp, expected) {\n var statusCode = resp.httpResponse.statusCode;\n return (typeof statusCode === 'number') && (statusCode === expected);\n },\n\n error: function(resp, expected) {\n if (typeof expected === 'string' && resp.error) {\n return expected === resp.error.code;\n }\n // if expected is not string, can be boolean indicating presence of error\n return expected === !!resp.error;\n }\n },\n\n listeners: new AWS.SequentialExecutor().addNamedListeners(function(add) {\n add('RETRY_CHECK', 'retry', function(resp) {\n var waiter = resp.request._waiter;\n if (resp.error && resp.error.code === 'ResourceNotReady') {\n resp.error.retryDelay = (waiter.config.delay || 0) * 1000;\n }\n });\n\n add('CHECK_OUTPUT', 'extractData', CHECK_ACCEPTORS);\n\n add('CHECK_ERROR', 'extractError', CHECK_ACCEPTORS);\n }),\n\n /**\n * @return [AWS.Request]\n */\n wait: function wait(params, callback) {\n if (typeof params === 'function') {\n callback = params; params = undefined;\n }\n\n if (params && params.$waiter) {\n params = AWS.util.copy(params);\n if (typeof params.$waiter.delay === 'number') {\n this.config.delay = params.$waiter.delay;\n }\n if (typeof params.$waiter.maxAttempts === 'number') {\n this.config.maxAttempts = params.$waiter.maxAttempts;\n }\n delete params.$waiter;\n }\n\n var request = this.service.makeRequest(this.config.operation, params);\n request._waiter = this;\n request.response.maxRetries = this.config.maxAttempts;\n request.addListeners(this.listeners);\n\n if (callback) request.send(callback);\n return request;\n },\n\n setSuccess: function setSuccess(resp) {\n resp.error = null;\n resp.data = resp.data || {};\n resp.request.removeAllListeners('extractData');\n },\n\n setError: function setError(resp, retryable) {\n resp.data = null;\n resp.error = AWS.util.error(resp.error || new Error(), {\n code: 'ResourceNotReady',\n message: 'Resource is not in the state ' + this.state,\n retryable: retryable\n });\n },\n\n /**\n * Loads waiter configuration from API configuration\n *\n * @api private\n */\n loadWaiterConfig: function loadWaiterConfig(state) {\n if (!this.service.api.waiters[state]) {\n throw new AWS.util.error(new Error(), {\n code: 'StateNotFoundError',\n message: 'State ' + state + ' not found.'\n });\n }\n\n this.config = AWS.util.copy(this.service.api.waiters[state]);\n }\n});\n","var AWS = require('../core');\nvar byteLength = AWS.util.string.byteLength;\nvar Buffer = AWS.util.Buffer;\n\n/**\n * The managed uploader allows for easy and efficient uploading of buffers,\n * blobs, or streams, using a configurable amount of concurrency to perform\n * multipart uploads where possible. This abstraction also enables uploading\n * streams of unknown size due to the use of multipart uploads.\n *\n * To construct a managed upload object, see the {constructor} function.\n *\n * ## Tracking upload progress\n *\n * The managed upload object can also track progress by attaching an\n * 'httpUploadProgress' listener to the upload manager. This event is similar\n * to {AWS.Request~httpUploadProgress} but groups all concurrent upload progress\n * into a single event. See {AWS.S3.ManagedUpload~httpUploadProgress} for more\n * information.\n *\n * ## Handling Multipart Cleanup\n *\n * By default, this class will automatically clean up any multipart uploads\n * when an individual part upload fails. This behavior can be disabled in order\n * to manually handle failures by setting the `leavePartsOnError` configuration\n * option to `true` when initializing the upload object.\n *\n * @!event httpUploadProgress(progress)\n * Triggered when the uploader has uploaded more data.\n * @note The `total` property may not be set if the stream being uploaded has\n * not yet finished chunking. In this case the `total` will be undefined\n * until the total stream size is known.\n * @note This event will not be emitted in Node.js 0.8.x.\n * @param progress [map] An object containing the `loaded` and `total` bytes\n * of the request and the `key` of the S3 object. Note that `total` may be undefined until the payload\n * size is known.\n * @context (see AWS.Request~send)\n */\nAWS.S3.ManagedUpload = AWS.util.inherit({\n /**\n * Creates a managed upload object with a set of configuration options.\n *\n * @note A \"Body\" parameter is required to be set prior to calling {send}.\n * @note In Node.js, sending \"Body\" as {https://nodejs.org/dist/latest/docs/api/stream.html#stream_object_mode object-mode stream}\n * may result in upload hangs. Using buffer stream is preferable.\n * @option options params [map] a map of parameters to pass to the upload\n * requests. The \"Body\" parameter is required to be specified either on\n * the service or in the params option.\n * @note ContentMD5 should not be provided when using the managed upload object.\n * Instead, setting \"computeChecksums\" to true will enable automatic ContentMD5 generation\n * by the managed upload object.\n * @option options queueSize [Number] (4) the size of the concurrent queue\n * manager to upload parts in parallel. Set to 1 for synchronous uploading\n * of parts. Note that the uploader will buffer at most queueSize * partSize\n * bytes into memory at any given time.\n * @option options partSize [Number] (5mb) the size in bytes for each\n * individual part to be uploaded. Adjust the part size to ensure the number\n * of parts does not exceed {maxTotalParts}. See {minPartSize} for the\n * minimum allowed part size.\n * @option options leavePartsOnError [Boolean] (false) whether to abort the\n * multipart upload if an error occurs. Set to true if you want to handle\n * failures manually.\n * @option options service [AWS.S3] an optional S3 service object to use for\n * requests. This object might have bound parameters used by the uploader.\n * @option options tags [Array] The tags to apply to the uploaded object.\n * Each tag should have a `Key` and `Value` keys.\n * @example Creating a default uploader for a stream object\n * var upload = new AWS.S3.ManagedUpload({\n * params: {Bucket: 'bucket', Key: 'key', Body: stream}\n * });\n * @example Creating an uploader with concurrency of 1 and partSize of 10mb\n * var upload = new AWS.S3.ManagedUpload({\n * partSize: 10 * 1024 * 1024, queueSize: 1,\n * params: {Bucket: 'bucket', Key: 'key', Body: stream}\n * });\n * @example Creating an uploader with tags\n * var upload = new AWS.S3.ManagedUpload({\n * params: {Bucket: 'bucket', Key: 'key', Body: stream},\n * tags: [{Key: 'tag1', Value: 'value1'}, {Key: 'tag2', Value: 'value2'}]\n * });\n * @see send\n */\n constructor: function ManagedUpload(options) {\n var self = this;\n AWS.SequentialExecutor.call(self);\n self.body = null;\n self.sliceFn = null;\n self.callback = null;\n self.parts = {};\n self.completeInfo = [];\n self.fillQueue = function() {\n self.callback(new Error('Unsupported body payload ' + typeof self.body));\n };\n\n self.configure(options);\n },\n\n /**\n * @api private\n */\n configure: function configure(options) {\n options = options || {};\n this.partSize = this.minPartSize;\n\n if (options.queueSize) this.queueSize = options.queueSize;\n if (options.partSize) this.partSize = options.partSize;\n if (options.leavePartsOnError) this.leavePartsOnError = true;\n if (options.tags) {\n if (!Array.isArray(options.tags)) {\n throw new Error('Tags must be specified as an array; ' +\n typeof options.tags + ' provided.');\n }\n this.tags = options.tags;\n }\n\n if (this.partSize < this.minPartSize) {\n throw new Error('partSize must be greater than ' +\n this.minPartSize);\n }\n\n this.service = options.service;\n this.bindServiceObject(options.params);\n this.validateBody();\n this.adjustTotalBytes();\n },\n\n /**\n * @api private\n */\n leavePartsOnError: false,\n\n /**\n * @api private\n */\n queueSize: 4,\n\n /**\n * @api private\n */\n partSize: null,\n\n /**\n * @readonly\n * @return [Number] the minimum number of bytes for an individual part\n * upload.\n */\n minPartSize: 1024 * 1024 * 5,\n\n /**\n * @readonly\n * @return [Number] the maximum allowed number of parts in a multipart upload.\n */\n maxTotalParts: 10000,\n\n /**\n * Initiates the managed upload for the payload.\n *\n * @callback callback function(err, data)\n * @param err [Error] an error or null if no error occurred.\n * @param data [map] The response data from the successful upload:\n * * `Location` (String) the URL of the uploaded object\n * * `ETag` (String) the ETag of the uploaded object\n * * `Bucket` (String) the bucket to which the object was uploaded\n * * `Key` (String) the key to which the object was uploaded\n * @example Sending a managed upload object\n * var params = {Bucket: 'bucket', Key: 'key', Body: stream};\n * var upload = new AWS.S3.ManagedUpload({params: params});\n * upload.send(function(err, data) {\n * console.log(err, data);\n * });\n */\n send: function(callback) {\n var self = this;\n self.failed = false;\n self.callback = callback || function(err) { if (err) throw err; };\n\n var runFill = true;\n if (self.sliceFn) {\n self.fillQueue = self.fillBuffer;\n } else if (AWS.util.isNode()) {\n var Stream = AWS.util.stream.Stream;\n if (self.body instanceof Stream) {\n runFill = false;\n self.fillQueue = self.fillStream;\n self.partBuffers = [];\n self.body.\n on('error', function(err) { self.cleanup(err); }).\n on('readable', function() { self.fillQueue(); }).\n on('end', function() {\n self.isDoneChunking = true;\n self.numParts = self.totalPartNumbers;\n self.fillQueue.call(self);\n\n if (self.isDoneChunking && self.totalPartNumbers >= 1 && self.doneParts === self.numParts) {\n self.finishMultiPart();\n }\n });\n }\n }\n\n if (runFill) self.fillQueue.call(self);\n },\n\n /**\n * @!method promise()\n * Returns a 'thenable' promise.\n *\n * Two callbacks can be provided to the `then` method on the returned promise.\n * The first callback will be called if the promise is fulfilled, and the second\n * callback will be called if the promise is rejected.\n * @callback fulfilledCallback function(data)\n * Called if the promise is fulfilled.\n * @param data [map] The response data from the successful upload:\n * `Location` (String) the URL of the uploaded object\n * `ETag` (String) the ETag of the uploaded object\n * `Bucket` (String) the bucket to which the object was uploaded\n * `Key` (String) the key to which the object was uploaded\n * @callback rejectedCallback function(err)\n * Called if the promise is rejected.\n * @param err [Error] an error or null if no error occurred.\n * @return [Promise] A promise that represents the state of the upload request.\n * @example Sending an upload request using promises.\n * var upload = s3.upload({Bucket: 'bucket', Key: 'key', Body: stream});\n * var promise = upload.promise();\n * promise.then(function(data) { ... }, function(err) { ... });\n */\n\n /**\n * Aborts a managed upload, including all concurrent upload requests.\n * @note By default, calling this function will cleanup a multipart upload\n * if one was created. To leave the multipart upload around after aborting\n * a request, configure `leavePartsOnError` to `true` in the {constructor}.\n * @note Calling {abort} in the browser environment will not abort any requests\n * that are already in flight. If a multipart upload was created, any parts\n * not yet uploaded will not be sent, and the multipart upload will be cleaned up.\n * @example Aborting an upload\n * var params = {\n * Bucket: 'bucket', Key: 'key',\n * Body: Buffer.alloc(1024 * 1024 * 25) // 25MB payload\n * };\n * var upload = s3.upload(params);\n * upload.send(function (err, data) {\n * if (err) console.log(\"Error:\", err.code, err.message);\n * else console.log(data);\n * });\n *\n * // abort request in 1 second\n * setTimeout(upload.abort.bind(upload), 1000);\n */\n abort: function() {\n var self = this;\n //abort putObject request\n if (self.isDoneChunking === true && self.totalPartNumbers === 1 && self.singlePart) {\n self.singlePart.abort();\n } else {\n self.cleanup(AWS.util.error(new Error('Request aborted by user'), {\n code: 'RequestAbortedError', retryable: false\n }));\n }\n },\n\n /**\n * @api private\n */\n validateBody: function validateBody() {\n var self = this;\n self.body = self.service.config.params.Body;\n if (typeof self.body === 'string') {\n self.body = AWS.util.buffer.toBuffer(self.body);\n } else if (!self.body) {\n throw new Error('params.Body is required');\n }\n self.sliceFn = AWS.util.arraySliceFn(self.body);\n },\n\n /**\n * @api private\n */\n bindServiceObject: function bindServiceObject(params) {\n params = params || {};\n var self = this;\n // bind parameters to new service object\n if (!self.service) {\n self.service = new AWS.S3({params: params});\n } else {\n var service = self.service;\n var config = AWS.util.copy(service.config);\n config.signatureVersion = service.getSignatureVersion();\n self.service = new service.constructor.__super__(config);\n self.service.config.params =\n AWS.util.merge(self.service.config.params || {}, params);\n }\n },\n\n /**\n * @api private\n */\n adjustTotalBytes: function adjustTotalBytes() {\n var self = this;\n try { // try to get totalBytes\n self.totalBytes = byteLength(self.body);\n } catch (e) { }\n\n // try to adjust partSize if we know payload length\n if (self.totalBytes) {\n var newPartSize = Math.ceil(self.totalBytes / self.maxTotalParts);\n if (newPartSize > self.partSize) self.partSize = newPartSize;\n } else {\n self.totalBytes = undefined;\n }\n },\n\n /**\n * @api private\n */\n isDoneChunking: false,\n\n /**\n * @api private\n */\n partPos: 0,\n\n /**\n * @api private\n */\n totalChunkedBytes: 0,\n\n /**\n * @api private\n */\n totalUploadedBytes: 0,\n\n /**\n * @api private\n */\n totalBytes: undefined,\n\n /**\n * @api private\n */\n numParts: 0,\n\n /**\n * @api private\n */\n totalPartNumbers: 0,\n\n /**\n * @api private\n */\n activeParts: 0,\n\n /**\n * @api private\n */\n doneParts: 0,\n\n /**\n * @api private\n */\n parts: null,\n\n /**\n * @api private\n */\n completeInfo: null,\n\n /**\n * @api private\n */\n failed: false,\n\n /**\n * @api private\n */\n multipartReq: null,\n\n /**\n * @api private\n */\n partBuffers: null,\n\n /**\n * @api private\n */\n partBufferLength: 0,\n\n /**\n * @api private\n */\n fillBuffer: function fillBuffer() {\n var self = this;\n var bodyLen = byteLength(self.body);\n\n if (bodyLen === 0) {\n self.isDoneChunking = true;\n self.numParts = 1;\n self.nextChunk(self.body);\n return;\n }\n\n while (self.activeParts < self.queueSize && self.partPos < bodyLen) {\n var endPos = Math.min(self.partPos + self.partSize, bodyLen);\n var buf = self.sliceFn.call(self.body, self.partPos, endPos);\n self.partPos += self.partSize;\n\n if (byteLength(buf) < self.partSize || self.partPos === bodyLen) {\n self.isDoneChunking = true;\n self.numParts = self.totalPartNumbers + 1;\n }\n self.nextChunk(buf);\n }\n },\n\n /**\n * @api private\n */\n fillStream: function fillStream() {\n var self = this;\n if (self.activeParts >= self.queueSize) return;\n\n var buf = self.body.read(self.partSize - self.partBufferLength) ||\n self.body.read();\n if (buf) {\n self.partBuffers.push(buf);\n self.partBufferLength += buf.length;\n self.totalChunkedBytes += buf.length;\n }\n\n if (self.partBufferLength >= self.partSize) {\n // if we have single buffer we avoid copyfull concat\n var pbuf = self.partBuffers.length === 1 ?\n self.partBuffers[0] : Buffer.concat(self.partBuffers);\n self.partBuffers = [];\n self.partBufferLength = 0;\n\n // if we have more than partSize, push the rest back on the queue\n if (pbuf.length > self.partSize) {\n var rest = pbuf.slice(self.partSize);\n self.partBuffers.push(rest);\n self.partBufferLength += rest.length;\n pbuf = pbuf.slice(0, self.partSize);\n }\n\n self.nextChunk(pbuf);\n }\n\n if (self.isDoneChunking && !self.isDoneSending) {\n // if we have single buffer we avoid copyfull concat\n pbuf = self.partBuffers.length === 1 ?\n self.partBuffers[0] : Buffer.concat(self.partBuffers);\n self.partBuffers = [];\n self.partBufferLength = 0;\n self.totalBytes = self.totalChunkedBytes;\n self.isDoneSending = true;\n\n if (self.numParts === 0 || pbuf.length > 0) {\n self.numParts++;\n self.nextChunk(pbuf);\n }\n }\n\n self.body.read(0);\n },\n\n /**\n * @api private\n */\n nextChunk: function nextChunk(chunk) {\n var self = this;\n if (self.failed) return null;\n\n var partNumber = ++self.totalPartNumbers;\n if (self.isDoneChunking && partNumber === 1) {\n var params = {Body: chunk};\n if (this.tags) {\n params.Tagging = this.getTaggingHeader();\n }\n var req = self.service.putObject(params);\n req._managedUpload = self;\n req.on('httpUploadProgress', self.progress).send(self.finishSinglePart);\n self.singlePart = req; //save the single part request\n return null;\n } else if (self.service.config.params.ContentMD5) {\n var err = AWS.util.error(new Error('The Content-MD5 you specified is invalid for multi-part uploads.'), {\n code: 'InvalidDigest', retryable: false\n });\n\n self.cleanup(err);\n return null;\n }\n\n if (self.completeInfo[partNumber] && self.completeInfo[partNumber].ETag !== null) {\n return null; // Already uploaded this part.\n }\n\n self.activeParts++;\n if (!self.service.config.params.UploadId) {\n\n if (!self.multipartReq) { // create multipart\n self.multipartReq = self.service.createMultipartUpload();\n self.multipartReq.on('success', function(resp) {\n self.service.config.params.UploadId = resp.data.UploadId;\n self.multipartReq = null;\n });\n self.queueChunks(chunk, partNumber);\n self.multipartReq.on('error', function(err) {\n self.cleanup(err);\n });\n self.multipartReq.send();\n } else {\n self.queueChunks(chunk, partNumber);\n }\n } else { // multipart is created, just send\n self.uploadPart(chunk, partNumber);\n }\n },\n\n /**\n * @api private\n */\n getTaggingHeader: function getTaggingHeader() {\n var kvPairStrings = [];\n for (var i = 0; i < this.tags.length; i++) {\n kvPairStrings.push(AWS.util.uriEscape(this.tags[i].Key) + '=' +\n AWS.util.uriEscape(this.tags[i].Value));\n }\n\n return kvPairStrings.join('&');\n },\n\n /**\n * @api private\n */\n uploadPart: function uploadPart(chunk, partNumber) {\n var self = this;\n\n var partParams = {\n Body: chunk,\n ContentLength: AWS.util.string.byteLength(chunk),\n PartNumber: partNumber\n };\n\n var partInfo = {ETag: null, PartNumber: partNumber};\n self.completeInfo[partNumber] = partInfo;\n\n var req = self.service.uploadPart(partParams);\n self.parts[partNumber] = req;\n req._lastUploadedBytes = 0;\n req._managedUpload = self;\n req.on('httpUploadProgress', self.progress);\n req.send(function(err, data) {\n delete self.parts[partParams.PartNumber];\n self.activeParts--;\n\n if (!err && (!data || !data.ETag)) {\n var message = 'No access to ETag property on response.';\n if (AWS.util.isBrowser()) {\n message += ' Check CORS configuration to expose ETag header.';\n }\n\n err = AWS.util.error(new Error(message), {\n code: 'ETagMissing', retryable: false\n });\n }\n if (err) return self.cleanup(err);\n //prevent sending part being returned twice (https://github.com/aws/aws-sdk-js/issues/2304)\n if (self.completeInfo[partNumber] && self.completeInfo[partNumber].ETag !== null) return null;\n partInfo.ETag = data.ETag;\n self.doneParts++;\n if (self.isDoneChunking && self.doneParts === self.numParts) {\n self.finishMultiPart();\n } else {\n self.fillQueue.call(self);\n }\n });\n },\n\n /**\n * @api private\n */\n queueChunks: function queueChunks(chunk, partNumber) {\n var self = this;\n self.multipartReq.on('success', function() {\n self.uploadPart(chunk, partNumber);\n });\n },\n\n /**\n * @api private\n */\n cleanup: function cleanup(err) {\n var self = this;\n if (self.failed) return;\n\n // clean up stream\n if (typeof self.body.removeAllListeners === 'function' &&\n typeof self.body.resume === 'function') {\n self.body.removeAllListeners('readable');\n self.body.removeAllListeners('end');\n self.body.resume();\n }\n\n // cleanup multipartReq listeners\n if (self.multipartReq) {\n self.multipartReq.removeAllListeners('success');\n self.multipartReq.removeAllListeners('error');\n self.multipartReq.removeAllListeners('complete');\n delete self.multipartReq;\n }\n\n if (self.service.config.params.UploadId && !self.leavePartsOnError) {\n self.service.abortMultipartUpload().send();\n } else if (self.leavePartsOnError) {\n self.isDoneChunking = false;\n }\n\n AWS.util.each(self.parts, function(partNumber, part) {\n part.removeAllListeners('complete');\n part.abort();\n });\n\n self.activeParts = 0;\n self.partPos = 0;\n self.numParts = 0;\n self.totalPartNumbers = 0;\n self.parts = {};\n self.failed = true;\n self.callback(err);\n },\n\n /**\n * @api private\n */\n finishMultiPart: function finishMultiPart() {\n var self = this;\n var completeParams = { MultipartUpload: { Parts: self.completeInfo.slice(1) } };\n self.service.completeMultipartUpload(completeParams, function(err, data) {\n if (err) {\n return self.cleanup(err);\n }\n\n if (data && typeof data.Location === 'string') {\n data.Location = data.Location.replace(/%2F/g, '/');\n }\n\n if (Array.isArray(self.tags)) {\n for (var i = 0; i < self.tags.length; i++) {\n self.tags[i].Value = String(self.tags[i].Value);\n }\n self.service.putObjectTagging(\n {Tagging: {TagSet: self.tags}},\n function(e, d) {\n if (e) {\n self.callback(e);\n } else {\n self.callback(e, data);\n }\n }\n );\n } else {\n self.callback(err, data);\n }\n });\n },\n\n /**\n * @api private\n */\n finishSinglePart: function finishSinglePart(err, data) {\n var upload = this.request._managedUpload;\n var httpReq = this.request.httpRequest;\n var endpoint = httpReq.endpoint;\n if (err) return upload.callback(err);\n data.Location =\n [endpoint.protocol, '//', endpoint.host, httpReq.path].join('');\n data.key = this.request.params.Key; // will stay undocumented\n data.Key = this.request.params.Key;\n data.Bucket = this.request.params.Bucket;\n upload.callback(err, data);\n },\n\n /**\n * @api private\n */\n progress: function progress(info) {\n var upload = this._managedUpload;\n if (this.operation === 'putObject') {\n info.part = 1;\n info.key = this.params.Key;\n } else {\n upload.totalUploadedBytes += info.loaded - this._lastUploadedBytes;\n this._lastUploadedBytes = info.loaded;\n info = {\n loaded: upload.totalUploadedBytes,\n total: upload.totalBytes,\n part: this.params.PartNumber,\n key: this.params.Key\n };\n }\n upload.emit('httpUploadProgress', [info]);\n }\n});\n\nAWS.util.mixin(AWS.S3.ManagedUpload, AWS.SequentialExecutor);\n\n/**\n * @api private\n */\nAWS.S3.ManagedUpload.addPromisesToClass = function addPromisesToClass(PromiseDependency) {\n this.prototype.promise = AWS.util.promisifyMethod('send', PromiseDependency);\n};\n\n/**\n * @api private\n */\nAWS.S3.ManagedUpload.deletePromisesFromClass = function deletePromisesFromClass() {\n delete this.prototype.promise;\n};\n\nAWS.util.addPromises(AWS.S3.ManagedUpload);\n\n/**\n * @api private\n */\nmodule.exports = AWS.S3.ManagedUpload;\n","var AWS = require('../core');\nrequire('../dynamodb/document_client');\n\nAWS.util.update(AWS.DynamoDB.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n if (request.service.config.dynamoDbCrc32) {\n request.removeListener('extractData', AWS.EventListeners.Json.EXTRACT_DATA);\n request.addListener('extractData', this.checkCrc32);\n request.addListener('extractData', AWS.EventListeners.Json.EXTRACT_DATA);\n }\n },\n\n /**\n * @api private\n */\n checkCrc32: function checkCrc32(resp) {\n if (!resp.httpResponse.streaming && !resp.request.service.crc32IsValid(resp)) {\n resp.data = null;\n resp.error = AWS.util.error(new Error(), {\n code: 'CRC32CheckFailed',\n message: 'CRC32 integrity check failed',\n retryable: true\n });\n resp.request.haltHandlersOnError();\n throw (resp.error);\n }\n },\n\n /**\n * @api private\n */\n crc32IsValid: function crc32IsValid(resp) {\n var crc = resp.httpResponse.headers['x-amz-crc32'];\n if (!crc) return true; // no (valid) CRC32 header\n return parseInt(crc, 10) === AWS.util.crypto.crc32(resp.httpResponse.body);\n },\n\n /**\n * @api private\n */\n defaultRetryCount: 10,\n\n /**\n * @api private\n */\n retryDelays: function retryDelays(retryCount) {\n var retryDelayOptions = AWS.util.copy(this.config.retryDelayOptions);\n\n if (typeof retryDelayOptions.base !== 'number') {\n retryDelayOptions.base = 50; // default for dynamodb\n }\n var delay = AWS.util.calculateRetryDelay(retryCount, retryDelayOptions);\n return delay;\n }\n});\n","var AWS = require('../core');\n\nAWS.util.update(AWS.STS.prototype, {\n /**\n * @overload credentialsFrom(data, credentials = null)\n * Creates a credentials object from STS response data containing\n * credentials information. Useful for quickly setting AWS credentials.\n *\n * @note This is a low-level utility function. If you want to load temporary\n * credentials into your process for subsequent requests to AWS resources,\n * you should use {AWS.TemporaryCredentials} instead.\n * @param data [map] data retrieved from a call to {getFederatedToken},\n * {getSessionToken}, {assumeRole}, or {assumeRoleWithWebIdentity}.\n * @param credentials [AWS.Credentials] an optional credentials object to\n * fill instead of creating a new object. Useful when modifying an\n * existing credentials object from a refresh call.\n * @return [AWS.TemporaryCredentials] the set of temporary credentials\n * loaded from a raw STS operation response.\n * @example Using credentialsFrom to load global AWS credentials\n * var sts = new AWS.STS();\n * sts.getSessionToken(function (err, data) {\n * if (err) console.log(\"Error getting credentials\");\n * else {\n * AWS.config.credentials = sts.credentialsFrom(data);\n * }\n * });\n * @see AWS.TemporaryCredentials\n */\n credentialsFrom: function credentialsFrom(data, credentials) {\n if (!data) return null;\n if (!credentials) credentials = new AWS.TemporaryCredentials();\n credentials.expired = false;\n credentials.accessKeyId = data.Credentials.AccessKeyId;\n credentials.secretAccessKey = data.Credentials.SecretAccessKey;\n credentials.sessionToken = data.Credentials.SessionToken;\n credentials.expireTime = data.Credentials.Expiration;\n return credentials;\n },\n\n assumeRoleWithWebIdentity: function assumeRoleWithWebIdentity(params, callback) {\n return this.makeUnauthenticatedRequest('assumeRoleWithWebIdentity', params, callback);\n },\n\n assumeRoleWithSAML: function assumeRoleWithSAML(params, callback) {\n return this.makeUnauthenticatedRequest('assumeRoleWithSAML', params, callback);\n }\n});\n","var AWS = require('../core');\nrequire('../rds/signer');\n /**\n * @api private\n */\n var crossRegionOperations = ['copyDBSnapshot', 'createDBInstanceReadReplica', 'createDBCluster', 'copyDBClusterSnapshot'];\n\n AWS.util.update(AWS.RDS.prototype, {\n /**\n * @api private\n */\n setupRequestListeners: function setupRequestListeners(request) {\n if (crossRegionOperations.indexOf(request.operation) !== -1 &&\n request.params.SourceRegion) {\n request.params = AWS.util.copy(request.params);\n if (request.params.PreSignedUrl ||\n request.params.SourceRegion === this.config.region) {\n delete request.params.SourceRegion;\n } else {\n var doesParamValidation = !!this.config.paramValidation;\n // remove the validate parameters listener so we can re-add it after we build the URL\n if (doesParamValidation) {\n request.removeListener('validate', AWS.EventListeners.Core.VALIDATE_PARAMETERS);\n }\n request.onAsync('validate', this.buildCrossRegionPresignedUrl);\n if (doesParamValidation) {\n request.addListener('validate', AWS.EventListeners.Core.VALIDATE_PARAMETERS);\n }\n }\n }\n },\n\n /**\n * @api private\n */\n buildCrossRegionPresignedUrl: function buildCrossRegionPresignedUrl(req, done) {\n var config = AWS.util.copy(req.service.config);\n config.region = req.params.SourceRegion;\n delete req.params.SourceRegion;\n delete config.endpoint;\n // relevant params for the operation will already be in req.params\n delete config.params;\n config.signatureVersion = 'v4';\n var destinationRegion = req.service.config.region;\n\n var svc = new req.service.constructor(config);\n var newReq = svc[req.operation](AWS.util.copy(req.params));\n newReq.on('build', function addDestinationRegionParam(request) {\n var httpRequest = request.httpRequest;\n httpRequest.params.DestinationRegion = destinationRegion;\n httpRequest.body = AWS.util.queryParamsToString(httpRequest.params);\n });\n newReq.presign(function(err, url) {\n if (err) done(err);\n else {\n req.params.PreSignedUrl = url;\n done();\n }\n });\n }\n });\n","function AcceptorStateMachine(states, state) {\n this.currentState = state || null;\n this.states = states || {};\n}\n\nAcceptorStateMachine.prototype.runTo = function runTo(finalState, done, bindObject, inputError) {\n if (typeof finalState === 'function') {\n inputError = bindObject; bindObject = done;\n done = finalState; finalState = null;\n }\n\n var self = this;\n var state = self.states[self.currentState];\n state.fn.call(bindObject || self, inputError, function(err) {\n if (err) {\n if (state.fail) self.currentState = state.fail;\n else return done ? done.call(bindObject, err) : null;\n } else {\n if (state.accept) self.currentState = state.accept;\n else return done ? done.call(bindObject) : null;\n }\n if (self.currentState === finalState) {\n return done ? done.call(bindObject, err) : null;\n }\n\n self.runTo(finalState, done, bindObject, err);\n });\n};\n\nAcceptorStateMachine.prototype.addState = function addState(name, acceptState, failState, fn) {\n if (typeof acceptState === 'function') {\n fn = acceptState; acceptState = null; failState = null;\n } else if (typeof failState === 'function') {\n fn = failState; failState = null;\n }\n\n if (!this.currentState) this.currentState = name;\n this.states[name] = { accept: acceptState, fail: failState, fn: fn };\n return this;\n};\n\n/**\n * @api private\n */\nmodule.exports = AcceptorStateMachine;\n"],"sourceRoot":""}