|
define(['N/xml', 'N/http', 'N/https', 'N/error'], function(nsXml, nsHttp, nsHttps, nsError) { |
|
var NS = {xml: nsXml, http: nsHttp, https: nsHttps, error: nsError, util: util, log: log, require: require,AWS:undefined}; |
|
var require = undefined; |
|
// BEGIN aws sdk built .min.js |
|
|
|
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ |
|
module.exports={ |
|
"version": "2.0", |
|
"metadata": { |
|
"apiVersion": "2014-06-30", |
|
"endpointPrefix": "cognito-identity", |
|
"jsonVersion": "1.1", |
|
"protocol": "json", |
|
"serviceFullName": "Amazon Cognito Identity", |
|
"signatureVersion": "v4", |
|
"targetPrefix": "AWSCognitoIdentityService" |
|
}, |
|
"operations": { |
|
"CreateIdentityPool": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolName", |
|
"AllowUnauthenticatedIdentities" |
|
], |
|
"members": { |
|
"IdentityPoolName": {}, |
|
"AllowUnauthenticatedIdentities": { |
|
"type": "boolean" |
|
}, |
|
"SupportedLoginProviders": { |
|
"shape": "S4" |
|
}, |
|
"DeveloperProviderName": {}, |
|
"OpenIdConnectProviderARNs": { |
|
"shape": "S8" |
|
}, |
|
"CognitoIdentityProviders": { |
|
"shape": "Sa" |
|
}, |
|
"SamlProviderARNs": { |
|
"shape": "Se" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"shape": "Sf" |
|
} |
|
}, |
|
"DeleteIdentities": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityIdsToDelete" |
|
], |
|
"members": { |
|
"IdentityIdsToDelete": { |
|
"type": "list", |
|
"member": {} |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"UnprocessedIdentityIds": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {}, |
|
"ErrorCode": {} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteIdentityPool": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId" |
|
], |
|
"members": { |
|
"IdentityPoolId": {} |
|
} |
|
} |
|
}, |
|
"DescribeIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityId" |
|
], |
|
"members": { |
|
"IdentityId": {} |
|
} |
|
}, |
|
"output": { |
|
"shape": "Sq" |
|
} |
|
}, |
|
"DescribeIdentityPool": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId" |
|
], |
|
"members": { |
|
"IdentityPoolId": {} |
|
} |
|
}, |
|
"output": { |
|
"shape": "Sf" |
|
} |
|
}, |
|
"GetCredentialsForIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityId" |
|
], |
|
"members": { |
|
"IdentityId": {}, |
|
"Logins": { |
|
"shape": "Sv" |
|
}, |
|
"CustomRoleArn": {} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {}, |
|
"Credentials": { |
|
"type": "structure", |
|
"members": { |
|
"AccessKeyId": {}, |
|
"SecretKey": {}, |
|
"SessionToken": {}, |
|
"Expiration": { |
|
"type": "timestamp" |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"GetId": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId" |
|
], |
|
"members": { |
|
"AccountId": {}, |
|
"IdentityPoolId": {}, |
|
"Logins": { |
|
"shape": "Sv" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {} |
|
} |
|
} |
|
}, |
|
"GetIdentityPoolRoles": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId" |
|
], |
|
"members": { |
|
"IdentityPoolId": {} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"Roles": { |
|
"shape": "S17" |
|
} |
|
} |
|
} |
|
}, |
|
"GetOpenIdToken": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityId" |
|
], |
|
"members": { |
|
"IdentityId": {}, |
|
"Logins": { |
|
"shape": "Sv" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {}, |
|
"Token": {} |
|
} |
|
} |
|
}, |
|
"GetOpenIdTokenForDeveloperIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId", |
|
"Logins" |
|
], |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"IdentityId": {}, |
|
"Logins": { |
|
"shape": "Sv" |
|
}, |
|
"TokenDuration": { |
|
"type": "long" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {}, |
|
"Token": {} |
|
} |
|
} |
|
}, |
|
"ListIdentities": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId", |
|
"MaxResults" |
|
], |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"MaxResults": { |
|
"type": "integer" |
|
}, |
|
"NextToken": {}, |
|
"HideDisabled": { |
|
"type": "boolean" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"Identities": { |
|
"type": "list", |
|
"member": { |
|
"shape": "Sq" |
|
} |
|
}, |
|
"NextToken": {} |
|
} |
|
} |
|
}, |
|
"ListIdentityPools": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"MaxResults" |
|
], |
|
"members": { |
|
"MaxResults": { |
|
"type": "integer" |
|
}, |
|
"NextToken": {} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityPools": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"IdentityPoolName": {} |
|
} |
|
} |
|
}, |
|
"NextToken": {} |
|
} |
|
} |
|
}, |
|
"LookupDeveloperIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId" |
|
], |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"IdentityId": {}, |
|
"DeveloperUserIdentifier": {}, |
|
"MaxResults": { |
|
"type": "integer" |
|
}, |
|
"NextToken": {} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {}, |
|
"DeveloperUserIdentifierList": { |
|
"type": "list", |
|
"member": {} |
|
}, |
|
"NextToken": {} |
|
} |
|
} |
|
}, |
|
"MergeDeveloperIdentities": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"SourceUserIdentifier", |
|
"DestinationUserIdentifier", |
|
"DeveloperProviderName", |
|
"IdentityPoolId" |
|
], |
|
"members": { |
|
"SourceUserIdentifier": {}, |
|
"DestinationUserIdentifier": {}, |
|
"DeveloperProviderName": {}, |
|
"IdentityPoolId": {} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {} |
|
} |
|
} |
|
}, |
|
"SetIdentityPoolRoles": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId", |
|
"Roles" |
|
], |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"Roles": { |
|
"shape": "S17" |
|
} |
|
} |
|
} |
|
}, |
|
"UnlinkDeveloperIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityId", |
|
"IdentityPoolId", |
|
"DeveloperProviderName", |
|
"DeveloperUserIdentifier" |
|
], |
|
"members": { |
|
"IdentityId": {}, |
|
"IdentityPoolId": {}, |
|
"DeveloperProviderName": {}, |
|
"DeveloperUserIdentifier": {} |
|
} |
|
} |
|
}, |
|
"UnlinkIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityId", |
|
"Logins", |
|
"LoginsToRemove" |
|
], |
|
"members": { |
|
"IdentityId": {}, |
|
"Logins": { |
|
"shape": "Sv" |
|
}, |
|
"LoginsToRemove": { |
|
"shape": "Sr" |
|
} |
|
} |
|
} |
|
}, |
|
"UpdateIdentityPool": { |
|
"input": { |
|
"shape": "Sf" |
|
}, |
|
"output": { |
|
"shape": "Sf" |
|
} |
|
} |
|
}, |
|
"shapes": { |
|
"S4": { |
|
"type": "map", |
|
"key": {}, |
|
"value": {} |
|
}, |
|
"S8": { |
|
"type": "list", |
|
"member": {} |
|
}, |
|
"Sa": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"ProviderName": {}, |
|
"ClientId": {} |
|
} |
|
} |
|
}, |
|
"Se": { |
|
"type": "list", |
|
"member": {} |
|
}, |
|
"Sf": { |
|
"type": "structure", |
|
"required": [ |
|
"IdentityPoolId", |
|
"IdentityPoolName", |
|
"AllowUnauthenticatedIdentities" |
|
], |
|
"members": { |
|
"IdentityPoolId": {}, |
|
"IdentityPoolName": {}, |
|
"AllowUnauthenticatedIdentities": { |
|
"type": "boolean" |
|
}, |
|
"SupportedLoginProviders": { |
|
"shape": "S4" |
|
}, |
|
"DeveloperProviderName": {}, |
|
"OpenIdConnectProviderARNs": { |
|
"shape": "S8" |
|
}, |
|
"CognitoIdentityProviders": { |
|
"shape": "Sa" |
|
}, |
|
"SamlProviderARNs": { |
|
"shape": "Se" |
|
} |
|
} |
|
}, |
|
"Sq": { |
|
"type": "structure", |
|
"members": { |
|
"IdentityId": {}, |
|
"Logins": { |
|
"shape": "Sr" |
|
}, |
|
"CreationDate": { |
|
"type": "timestamp" |
|
}, |
|
"LastModifiedDate": { |
|
"type": "timestamp" |
|
} |
|
} |
|
}, |
|
"Sr": { |
|
"type": "list", |
|
"member": {} |
|
}, |
|
"Sv": { |
|
"type": "map", |
|
"key": {}, |
|
"value": {} |
|
}, |
|
"S17": { |
|
"type": "map", |
|
"key": {}, |
|
"value": {} |
|
} |
|
} |
|
} |
|
},{}],2:[function(require,module,exports){ |
|
module.exports={ |
|
"acm": { |
|
"name": "ACM", |
|
"cors": true |
|
}, |
|
"apigateway": { |
|
"name": "APIGateway", |
|
"cors": true |
|
}, |
|
"applicationautoscaling": { |
|
"prefix": "application-autoscaling", |
|
"name": "ApplicationAutoScaling", |
|
"cors": true |
|
}, |
|
"autoscaling": { |
|
"name": "AutoScaling", |
|
"cors": true |
|
}, |
|
"budgets": { |
|
"name": "Budgets" |
|
}, |
|
"cloudformation": { |
|
"name": "CloudFormation", |
|
"cors": true |
|
}, |
|
"cloudfront": { |
|
"name": "CloudFront", |
|
"versions": [ |
|
"2013-05-12*", |
|
"2013-11-11*", |
|
"2014-05-31*", |
|
"2014-10-21*", |
|
"2014-11-06*", |
|
"2015-04-17*", |
|
"2015-07-27*", |
|
"2015-09-17*", |
|
"2016-01-13*", |
|
"2016-01-28*", |
|
"2016-08-01*", |
|
"2016-08-20*", |
|
"2016-09-07*" |
|
], |
|
"cors": true |
|
}, |
|
"cloudhsm": { |
|
"name": "CloudHSM", |
|
"cors": true |
|
}, |
|
"cloudsearch": { |
|
"name": "CloudSearch" |
|
}, |
|
"cloudsearchdomain": { |
|
"name": "CloudSearchDomain" |
|
}, |
|
"cloudtrail": { |
|
"name": "CloudTrail", |
|
"cors": true |
|
}, |
|
"cloudwatch": { |
|
"prefix": "monitoring", |
|
"name": "CloudWatch", |
|
"cors": true |
|
}, |
|
"cloudwatchevents": { |
|
"prefix": "events", |
|
"name": "CloudWatchEvents", |
|
"versions": [ |
|
"2014-02-03*" |
|
], |
|
"cors": true |
|
}, |
|
"cloudwatchlogs": { |
|
"prefix": "logs", |
|
"name": "CloudWatchLogs", |
|
"cors": true |
|
}, |
|
"codecommit": { |
|
"name": "CodeCommit", |
|
"cors": true |
|
}, |
|
"codedeploy": { |
|
"name": "CodeDeploy", |
|
"cors": true |
|
}, |
|
"codepipeline": { |
|
"name": "CodePipeline", |
|
"cors": true |
|
}, |
|
"cognitoidentity": { |
|
"prefix": "cognito-identity", |
|
"name": "CognitoIdentity", |
|
"cors": true |
|
}, |
|
"cognitoidentityserviceprovider": { |
|
"prefix": "cognito-idp", |
|
"name": "CognitoIdentityServiceProvider", |
|
"cors": true |
|
}, |
|
"cognitosync": { |
|
"prefix": "cognito-sync", |
|
"name": "CognitoSync", |
|
"cors": true |
|
}, |
|
"configservice": { |
|
"prefix": "config", |
|
"name": "ConfigService", |
|
"cors": true |
|
}, |
|
"datapipeline": { |
|
"name": "DataPipeline" |
|
}, |
|
"devicefarm": { |
|
"name": "DeviceFarm", |
|
"cors": true |
|
}, |
|
"directconnect": { |
|
"name": "DirectConnect", |
|
"cors": true |
|
}, |
|
"directoryservice": { |
|
"prefix": "ds", |
|
"name": "DirectoryService" |
|
}, |
|
"discovery": { |
|
"name": "Discovery" |
|
}, |
|
"dms": { |
|
"name": "DMS" |
|
}, |
|
"dynamodb": { |
|
"name": "DynamoDB", |
|
"cors": true |
|
}, |
|
"dynamodbstreams": { |
|
"prefix": "streams.dynamodb", |
|
"name": "DynamoDBStreams", |
|
"cors": true |
|
}, |
|
"ec2": { |
|
"name": "EC2", |
|
"versions": [ |
|
"2013-06-15*", |
|
"2013-10-15*", |
|
"2014-02-01*", |
|
"2014-05-01*", |
|
"2014-06-15*", |
|
"2014-09-01*", |
|
"2014-10-01*", |
|
"2015-03-01*", |
|
"2015-04-15*", |
|
"2015-10-01*", |
|
"2016-04-01*" |
|
], |
|
"cors": true |
|
}, |
|
"ecr": { |
|
"name": "ECR", |
|
"cors": true |
|
}, |
|
"ecs": { |
|
"name": "ECS", |
|
"cors": true |
|
}, |
|
"efs": { |
|
"prefix": "elasticfilesystem", |
|
"name": "EFS" |
|
}, |
|
"elasticache": { |
|
"name": "ElastiCache", |
|
"versions": [ |
|
"2012-11-15*", |
|
"2014-03-24*", |
|
"2014-07-15*", |
|
"2014-09-30*" |
|
], |
|
"cors": true |
|
}, |
|
"elasticbeanstalk": { |
|
"name": "ElasticBeanstalk", |
|
"cors": true |
|
}, |
|
"elb": { |
|
"prefix": "elasticloadbalancing", |
|
"name": "ELB", |
|
"cors": true |
|
}, |
|
"elbv2": { |
|
"prefix": "elasticloadbalancingv2", |
|
"name": "ELBv2", |
|
"cors": true |
|
}, |
|
"emr": { |
|
"prefix": "elasticmapreduce", |
|
"name": "EMR", |
|
"cors": true |
|
}, |
|
"es": { |
|
"name": "ES" |
|
}, |
|
"elastictranscoder": { |
|
"name": "ElasticTranscoder", |
|
"cors": true |
|
}, |
|
"firehose": { |
|
"name": "Firehose", |
|
"cors": true |
|
}, |
|
"gamelift": { |
|
"name": "GameLift", |
|
"cors": true |
|
}, |
|
"glacier": { |
|
"name": "Glacier" |
|
}, |
|
"iam": { |
|
"name": "IAM" |
|
}, |
|
"importexport": { |
|
"name": "ImportExport" |
|
}, |
|
"inspector": { |
|
"name": "Inspector", |
|
"versions": [ |
|
"2015-08-18*" |
|
], |
|
"cors": true |
|
}, |
|
"iot": { |
|
"name": "Iot", |
|
"cors": true |
|
}, |
|
"iotdata": { |
|
"prefix": "iot-data", |
|
"name": "IotData", |
|
"cors": true |
|
}, |
|
"kinesis": { |
|
"name": "Kinesis", |
|
"cors": true |
|
}, |
|
"kinesisanalytics": { |
|
"name": "KinesisAnalytics" |
|
}, |
|
"kms": { |
|
"name": "KMS", |
|
"cors": true |
|
}, |
|
"lambda": { |
|
"name": "Lambda", |
|
"cors": true |
|
}, |
|
"machinelearning": { |
|
"name": "MachineLearning", |
|
"cors": true |
|
}, |
|
"marketplacecommerceanalytics": { |
|
"name": "MarketplaceCommerceAnalytics", |
|
"cors": true |
|
}, |
|
"marketplacemetering": { |
|
"prefix": "meteringmarketplace", |
|
"name": "MarketplaceMetering" |
|
}, |
|
"mobileanalytics": { |
|
"name": "MobileAnalytics", |
|
"cors": true |
|
}, |
|
"opsworks": { |
|
"name": "OpsWorks", |
|
"cors": true |
|
}, |
|
"rds": { |
|
"name": "RDS", |
|
"versions": [ |
|
"2014-09-01*" |
|
], |
|
"cors": true |
|
}, |
|
"redshift": { |
|
"name": "Redshift", |
|
"cors": true |
|
}, |
|
"route53": { |
|
"name": "Route53", |
|
"cors": true |
|
}, |
|
"route53domains": { |
|
"name": "Route53Domains", |
|
"cors": true |
|
}, |
|
"s3": { |
|
"name": "S3", |
|
"dualstackAvailable": true, |
|
"cors": true |
|
}, |
|
"servicecatalog": { |
|
"name": "ServiceCatalog", |
|
"cors": true |
|
}, |
|
"ses": { |
|
"prefix": "email", |
|
"name": "SES", |
|
"cors": true |
|
}, |
|
"simpledb": { |
|
"prefix": "sdb", |
|
"name": "SimpleDB" |
|
}, |
|
"sms": { |
|
"name": "SMS" |
|
}, |
|
"snowball": { |
|
"name": "Snowball" |
|
}, |
|
"sns": { |
|
"name": "SNS", |
|
"cors": true |
|
}, |
|
"sqs": { |
|
"name": "SQS", |
|
"cors": true |
|
}, |
|
"ssm": { |
|
"name": "SSM", |
|
"cors": true |
|
}, |
|
"storagegateway": { |
|
"name": "StorageGateway", |
|
"cors": true |
|
}, |
|
"sts": { |
|
"name": "STS", |
|
"cors": true |
|
}, |
|
"support": { |
|
"name": "Support" |
|
}, |
|
"swf": { |
|
"name": "SWF" |
|
}, |
|
"waf": { |
|
"name": "WAF", |
|
"cors": true |
|
}, |
|
"workspaces": { |
|
"name": "WorkSpaces" |
|
} |
|
} |
|
|
|
},{}],3:[function(require,module,exports){ |
|
module.exports={ |
|
"version": "2.0", |
|
"metadata": { |
|
"apiVersion": "2006-03-01", |
|
"checksumFormat": "md5", |
|
"endpointPrefix": "s3", |
|
"globalEndpoint": "s3.amazonaws.com", |
|
"protocol": "rest-xml", |
|
"serviceAbbreviation": "Amazon S3", |
|
"serviceFullName": "Amazon Simple Storage Service", |
|
"signatureVersion": "s3", |
|
"timestampFormat": "rfc822" |
|
}, |
|
"operations": { |
|
"AbortMultipartUpload": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key", |
|
"UploadId" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"UploadId": { |
|
"location": "querystring", |
|
"locationName": "uploadId" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"CompleteMultipartUpload": { |
|
"http": { |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key", |
|
"UploadId" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"MultipartUpload": { |
|
"locationName": "CompleteMultipartUpload", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"members": { |
|
"Parts": { |
|
"locationName": "Part", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"ETag": {}, |
|
"PartNumber": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
} |
|
} |
|
}, |
|
"UploadId": { |
|
"location": "querystring", |
|
"locationName": "uploadId" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
}, |
|
"payload": "MultipartUpload" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Location": {}, |
|
"Bucket": {}, |
|
"Key": {}, |
|
"Expiration": { |
|
"location": "header", |
|
"locationName": "x-amz-expiration" |
|
}, |
|
"ETag": {}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"VersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-version-id" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"CopyObject": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"CopySource", |
|
"Key" |
|
], |
|
"members": { |
|
"ACL": { |
|
"location": "header", |
|
"locationName": "x-amz-acl" |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"CacheControl": { |
|
"location": "header", |
|
"locationName": "Cache-Control" |
|
}, |
|
"ContentDisposition": { |
|
"location": "header", |
|
"locationName": "Content-Disposition" |
|
}, |
|
"ContentEncoding": { |
|
"location": "header", |
|
"locationName": "Content-Encoding" |
|
}, |
|
"ContentLanguage": { |
|
"location": "header", |
|
"locationName": "Content-Language" |
|
}, |
|
"ContentType": { |
|
"location": "header", |
|
"locationName": "Content-Type" |
|
}, |
|
"CopySource": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source" |
|
}, |
|
"CopySourceIfMatch": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-match" |
|
}, |
|
"CopySourceIfModifiedSince": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-modified-since", |
|
"type": "timestamp" |
|
}, |
|
"CopySourceIfNoneMatch": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-none-match" |
|
}, |
|
"CopySourceIfUnmodifiedSince": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-unmodified-since", |
|
"type": "timestamp" |
|
}, |
|
"Expires": { |
|
"location": "header", |
|
"locationName": "Expires", |
|
"type": "timestamp" |
|
}, |
|
"GrantFullControl": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-full-control" |
|
}, |
|
"GrantRead": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read" |
|
}, |
|
"GrantReadACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read-acp" |
|
}, |
|
"GrantWriteACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write-acp" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"Metadata": { |
|
"shape": "S11", |
|
"location": "headers", |
|
"locationName": "x-amz-meta-" |
|
}, |
|
"MetadataDirective": { |
|
"location": "header", |
|
"locationName": "x-amz-metadata-directive" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"StorageClass": { |
|
"location": "header", |
|
"locationName": "x-amz-storage-class" |
|
}, |
|
"WebsiteRedirectLocation": { |
|
"location": "header", |
|
"locationName": "x-amz-website-redirect-location" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"CopySourceSSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-server-side-encryption-customer-algorithm" |
|
}, |
|
"CopySourceSSECustomerKey": { |
|
"shape": "S1b", |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-server-side-encryption-customer-key" |
|
}, |
|
"CopySourceSSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-server-side-encryption-customer-key-MD5" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"CopyObjectResult": { |
|
"type": "structure", |
|
"members": { |
|
"ETag": {}, |
|
"LastModified": { |
|
"type": "timestamp" |
|
} |
|
} |
|
}, |
|
"Expiration": { |
|
"location": "header", |
|
"locationName": "x-amz-expiration" |
|
}, |
|
"CopySourceVersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-version-id" |
|
}, |
|
"VersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-version-id" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
}, |
|
"payload": "CopyObjectResult" |
|
}, |
|
"alias": "PutObjectCopy" |
|
}, |
|
"CreateBucket": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"ACL": { |
|
"location": "header", |
|
"locationName": "x-amz-acl" |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"CreateBucketConfiguration": { |
|
"locationName": "CreateBucketConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"members": { |
|
"LocationConstraint": {} |
|
} |
|
}, |
|
"GrantFullControl": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-full-control" |
|
}, |
|
"GrantRead": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read" |
|
}, |
|
"GrantReadACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read-acp" |
|
}, |
|
"GrantWrite": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write" |
|
}, |
|
"GrantWriteACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write-acp" |
|
} |
|
}, |
|
"payload": "CreateBucketConfiguration" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Location": { |
|
"location": "header", |
|
"locationName": "Location" |
|
} |
|
} |
|
}, |
|
"alias": "PutBucket" |
|
}, |
|
"CreateMultipartUpload": { |
|
"http": { |
|
"requestUri": "/{Bucket}/{Key+}?uploads" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"ACL": { |
|
"location": "header", |
|
"locationName": "x-amz-acl" |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"CacheControl": { |
|
"location": "header", |
|
"locationName": "Cache-Control" |
|
}, |
|
"ContentDisposition": { |
|
"location": "header", |
|
"locationName": "Content-Disposition" |
|
}, |
|
"ContentEncoding": { |
|
"location": "header", |
|
"locationName": "Content-Encoding" |
|
}, |
|
"ContentLanguage": { |
|
"location": "header", |
|
"locationName": "Content-Language" |
|
}, |
|
"ContentType": { |
|
"location": "header", |
|
"locationName": "Content-Type" |
|
}, |
|
"Expires": { |
|
"location": "header", |
|
"locationName": "Expires", |
|
"type": "timestamp" |
|
}, |
|
"GrantFullControl": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-full-control" |
|
}, |
|
"GrantRead": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read" |
|
}, |
|
"GrantReadACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read-acp" |
|
}, |
|
"GrantWriteACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write-acp" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"Metadata": { |
|
"shape": "S11", |
|
"location": "headers", |
|
"locationName": "x-amz-meta-" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"StorageClass": { |
|
"location": "header", |
|
"locationName": "x-amz-storage-class" |
|
}, |
|
"WebsiteRedirectLocation": { |
|
"location": "header", |
|
"locationName": "x-amz-website-redirect-location" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"AbortDate": { |
|
"location": "header", |
|
"locationName": "x-amz-abort-date", |
|
"type": "timestamp" |
|
}, |
|
"AbortRuleId": { |
|
"location": "header", |
|
"locationName": "x-amz-abort-rule-id" |
|
}, |
|
"Bucket": { |
|
"locationName": "Bucket" |
|
}, |
|
"Key": {}, |
|
"UploadId": {}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
}, |
|
"alias": "InitiateMultipartUpload" |
|
}, |
|
"DeleteBucket": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteBucketCors": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}?cors" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteBucketLifecycle": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}?lifecycle" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteBucketPolicy": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}?policy" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteBucketReplication": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}?replication" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteBucketTagging": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}?tagging" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteBucketWebsite": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}?website" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteObject": { |
|
"http": { |
|
"method": "DELETE", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"MFA": { |
|
"location": "header", |
|
"locationName": "x-amz-mfa" |
|
}, |
|
"VersionId": { |
|
"location": "querystring", |
|
"locationName": "versionId" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"DeleteMarker": { |
|
"location": "header", |
|
"locationName": "x-amz-delete-marker", |
|
"type": "boolean" |
|
}, |
|
"VersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-version-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"DeleteObjects": { |
|
"http": { |
|
"requestUri": "/{Bucket}?delete" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Delete" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Delete": { |
|
"locationName": "Delete", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"Objects" |
|
], |
|
"members": { |
|
"Objects": { |
|
"locationName": "Object", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"Key" |
|
], |
|
"members": { |
|
"Key": {}, |
|
"VersionId": {} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"Quiet": { |
|
"type": "boolean" |
|
} |
|
} |
|
}, |
|
"MFA": { |
|
"location": "header", |
|
"locationName": "x-amz-mfa" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
}, |
|
"payload": "Delete" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Deleted": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"Key": {}, |
|
"VersionId": {}, |
|
"DeleteMarker": { |
|
"type": "boolean" |
|
}, |
|
"DeleteMarkerVersionId": {} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
}, |
|
"Errors": { |
|
"locationName": "Error", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"Key": {}, |
|
"VersionId": {}, |
|
"Code": {}, |
|
"Message": {} |
|
} |
|
}, |
|
"flattened": true |
|
} |
|
} |
|
}, |
|
"alias": "DeleteMultipleObjects" |
|
}, |
|
"GetBucketAccelerateConfiguration": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?accelerate" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Status": {} |
|
} |
|
} |
|
}, |
|
"GetBucketAcl": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?acl" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Owner": { |
|
"shape": "S2k" |
|
}, |
|
"Grants": { |
|
"shape": "S2n", |
|
"locationName": "AccessControlList" |
|
} |
|
} |
|
} |
|
}, |
|
"GetBucketCors": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?cors" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"CORSRules": { |
|
"shape": "S2w", |
|
"locationName": "CORSRule" |
|
} |
|
} |
|
} |
|
}, |
|
"GetBucketLifecycle": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?lifecycle" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Rules": { |
|
"shape": "S39", |
|
"locationName": "Rule" |
|
} |
|
} |
|
}, |
|
"deprecated": true |
|
}, |
|
"GetBucketLifecycleConfiguration": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?lifecycle" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Rules": { |
|
"shape": "S3p", |
|
"locationName": "Rule" |
|
} |
|
} |
|
} |
|
}, |
|
"GetBucketLocation": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?location" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"LocationConstraint": {} |
|
} |
|
} |
|
}, |
|
"GetBucketLogging": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?logging" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"LoggingEnabled": { |
|
"shape": "S3x" |
|
} |
|
} |
|
} |
|
}, |
|
"GetBucketNotification": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?notification" |
|
}, |
|
"input": { |
|
"shape": "S43" |
|
}, |
|
"output": { |
|
"shape": "S44" |
|
}, |
|
"deprecated": true |
|
}, |
|
"GetBucketNotificationConfiguration": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?notification" |
|
}, |
|
"input": { |
|
"shape": "S43" |
|
}, |
|
"output": { |
|
"shape": "S4f" |
|
} |
|
}, |
|
"GetBucketPolicy": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?policy" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Policy": {} |
|
}, |
|
"payload": "Policy" |
|
} |
|
}, |
|
"GetBucketReplication": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?replication" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"ReplicationConfiguration": { |
|
"shape": "S4y" |
|
} |
|
}, |
|
"payload": "ReplicationConfiguration" |
|
} |
|
}, |
|
"GetBucketRequestPayment": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?requestPayment" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Payer": {} |
|
} |
|
} |
|
}, |
|
"GetBucketTagging": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?tagging" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"required": [ |
|
"TagSet" |
|
], |
|
"members": { |
|
"TagSet": { |
|
"shape": "S59" |
|
} |
|
} |
|
} |
|
}, |
|
"GetBucketVersioning": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?versioning" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Status": {}, |
|
"MFADelete": { |
|
"locationName": "MfaDelete" |
|
} |
|
} |
|
} |
|
}, |
|
"GetBucketWebsite": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?website" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"RedirectAllRequestsTo": { |
|
"shape": "S5i" |
|
}, |
|
"IndexDocument": { |
|
"shape": "S5l" |
|
}, |
|
"ErrorDocument": { |
|
"shape": "S5n" |
|
}, |
|
"RoutingRules": { |
|
"shape": "S5o" |
|
} |
|
} |
|
} |
|
}, |
|
"GetObject": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"IfMatch": { |
|
"location": "header", |
|
"locationName": "If-Match" |
|
}, |
|
"IfModifiedSince": { |
|
"location": "header", |
|
"locationName": "If-Modified-Since", |
|
"type": "timestamp" |
|
}, |
|
"IfNoneMatch": { |
|
"location": "header", |
|
"locationName": "If-None-Match" |
|
}, |
|
"IfUnmodifiedSince": { |
|
"location": "header", |
|
"locationName": "If-Unmodified-Since", |
|
"type": "timestamp" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"Range": { |
|
"location": "header", |
|
"locationName": "Range" |
|
}, |
|
"ResponseCacheControl": { |
|
"location": "querystring", |
|
"locationName": "response-cache-control" |
|
}, |
|
"ResponseContentDisposition": { |
|
"location": "querystring", |
|
"locationName": "response-content-disposition" |
|
}, |
|
"ResponseContentEncoding": { |
|
"location": "querystring", |
|
"locationName": "response-content-encoding" |
|
}, |
|
"ResponseContentLanguage": { |
|
"location": "querystring", |
|
"locationName": "response-content-language" |
|
}, |
|
"ResponseContentType": { |
|
"location": "querystring", |
|
"locationName": "response-content-type" |
|
}, |
|
"ResponseExpires": { |
|
"location": "querystring", |
|
"locationName": "response-expires", |
|
"type": "timestamp" |
|
}, |
|
"VersionId": { |
|
"location": "querystring", |
|
"locationName": "versionId" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
}, |
|
"PartNumber": { |
|
"location": "querystring", |
|
"locationName": "partNumber", |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Body": { |
|
"streaming": true, |
|
"type": "blob" |
|
}, |
|
"DeleteMarker": { |
|
"location": "header", |
|
"locationName": "x-amz-delete-marker", |
|
"type": "boolean" |
|
}, |
|
"AcceptRanges": { |
|
"location": "header", |
|
"locationName": "accept-ranges" |
|
}, |
|
"Expiration": { |
|
"location": "header", |
|
"locationName": "x-amz-expiration" |
|
}, |
|
"Restore": { |
|
"location": "header", |
|
"locationName": "x-amz-restore" |
|
}, |
|
"LastModified": { |
|
"location": "header", |
|
"locationName": "Last-Modified", |
|
"type": "timestamp" |
|
}, |
|
"ContentLength": { |
|
"location": "header", |
|
"locationName": "Content-Length", |
|
"type": "long" |
|
}, |
|
"ETag": { |
|
"location": "header", |
|
"locationName": "ETag" |
|
}, |
|
"MissingMeta": { |
|
"location": "header", |
|
"locationName": "x-amz-missing-meta", |
|
"type": "integer" |
|
}, |
|
"VersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-version-id" |
|
}, |
|
"CacheControl": { |
|
"location": "header", |
|
"locationName": "Cache-Control" |
|
}, |
|
"ContentDisposition": { |
|
"location": "header", |
|
"locationName": "Content-Disposition" |
|
}, |
|
"ContentEncoding": { |
|
"location": "header", |
|
"locationName": "Content-Encoding" |
|
}, |
|
"ContentLanguage": { |
|
"location": "header", |
|
"locationName": "Content-Language" |
|
}, |
|
"ContentRange": { |
|
"location": "header", |
|
"locationName": "Content-Range" |
|
}, |
|
"ContentType": { |
|
"location": "header", |
|
"locationName": "Content-Type" |
|
}, |
|
"Expires": { |
|
"location": "header", |
|
"locationName": "Expires", |
|
"type": "timestamp" |
|
}, |
|
"WebsiteRedirectLocation": { |
|
"location": "header", |
|
"locationName": "x-amz-website-redirect-location" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"Metadata": { |
|
"shape": "S11", |
|
"location": "headers", |
|
"locationName": "x-amz-meta-" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"StorageClass": { |
|
"location": "header", |
|
"locationName": "x-amz-storage-class" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
}, |
|
"ReplicationStatus": { |
|
"location": "header", |
|
"locationName": "x-amz-replication-status" |
|
}, |
|
"PartsCount": { |
|
"location": "header", |
|
"locationName": "x-amz-mp-parts-count", |
|
"type": "integer" |
|
} |
|
}, |
|
"payload": "Body" |
|
} |
|
}, |
|
"GetObjectAcl": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}/{Key+}?acl" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"VersionId": { |
|
"location": "querystring", |
|
"locationName": "versionId" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Owner": { |
|
"shape": "S2k" |
|
}, |
|
"Grants": { |
|
"shape": "S2n", |
|
"locationName": "AccessControlList" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"GetObjectTorrent": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}/{Key+}?torrent" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Body": { |
|
"streaming": true, |
|
"type": "blob" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
}, |
|
"payload": "Body" |
|
} |
|
}, |
|
"HeadBucket": { |
|
"http": { |
|
"method": "HEAD", |
|
"requestUri": "/{Bucket}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
} |
|
}, |
|
"HeadObject": { |
|
"http": { |
|
"method": "HEAD", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"IfMatch": { |
|
"location": "header", |
|
"locationName": "If-Match" |
|
}, |
|
"IfModifiedSince": { |
|
"location": "header", |
|
"locationName": "If-Modified-Since", |
|
"type": "timestamp" |
|
}, |
|
"IfNoneMatch": { |
|
"location": "header", |
|
"locationName": "If-None-Match" |
|
}, |
|
"IfUnmodifiedSince": { |
|
"location": "header", |
|
"locationName": "If-Unmodified-Since", |
|
"type": "timestamp" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"Range": { |
|
"location": "header", |
|
"locationName": "Range" |
|
}, |
|
"VersionId": { |
|
"location": "querystring", |
|
"locationName": "versionId" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
}, |
|
"PartNumber": { |
|
"location": "querystring", |
|
"locationName": "partNumber", |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"DeleteMarker": { |
|
"location": "header", |
|
"locationName": "x-amz-delete-marker", |
|
"type": "boolean" |
|
}, |
|
"AcceptRanges": { |
|
"location": "header", |
|
"locationName": "accept-ranges" |
|
}, |
|
"Expiration": { |
|
"location": "header", |
|
"locationName": "x-amz-expiration" |
|
}, |
|
"Restore": { |
|
"location": "header", |
|
"locationName": "x-amz-restore" |
|
}, |
|
"LastModified": { |
|
"location": "header", |
|
"locationName": "Last-Modified", |
|
"type": "timestamp" |
|
}, |
|
"ContentLength": { |
|
"location": "header", |
|
"locationName": "Content-Length", |
|
"type": "long" |
|
}, |
|
"ETag": { |
|
"location": "header", |
|
"locationName": "ETag" |
|
}, |
|
"MissingMeta": { |
|
"location": "header", |
|
"locationName": "x-amz-missing-meta", |
|
"type": "integer" |
|
}, |
|
"VersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-version-id" |
|
}, |
|
"CacheControl": { |
|
"location": "header", |
|
"locationName": "Cache-Control" |
|
}, |
|
"ContentDisposition": { |
|
"location": "header", |
|
"locationName": "Content-Disposition" |
|
}, |
|
"ContentEncoding": { |
|
"location": "header", |
|
"locationName": "Content-Encoding" |
|
}, |
|
"ContentLanguage": { |
|
"location": "header", |
|
"locationName": "Content-Language" |
|
}, |
|
"ContentType": { |
|
"location": "header", |
|
"locationName": "Content-Type" |
|
}, |
|
"Expires": { |
|
"location": "header", |
|
"locationName": "Expires", |
|
"type": "timestamp" |
|
}, |
|
"WebsiteRedirectLocation": { |
|
"location": "header", |
|
"locationName": "x-amz-website-redirect-location" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"Metadata": { |
|
"shape": "S11", |
|
"location": "headers", |
|
"locationName": "x-amz-meta-" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"StorageClass": { |
|
"location": "header", |
|
"locationName": "x-amz-storage-class" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
}, |
|
"ReplicationStatus": { |
|
"location": "header", |
|
"locationName": "x-amz-replication-status" |
|
}, |
|
"PartsCount": { |
|
"location": "header", |
|
"locationName": "x-amz-mp-parts-count", |
|
"type": "integer" |
|
} |
|
} |
|
} |
|
}, |
|
"ListBuckets": { |
|
"http": { |
|
"method": "GET" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Buckets": { |
|
"type": "list", |
|
"member": { |
|
"locationName": "Bucket", |
|
"type": "structure", |
|
"members": { |
|
"Name": {}, |
|
"CreationDate": { |
|
"type": "timestamp" |
|
} |
|
} |
|
} |
|
}, |
|
"Owner": { |
|
"shape": "S2k" |
|
} |
|
} |
|
}, |
|
"alias": "GetService" |
|
}, |
|
"ListMultipartUploads": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?uploads" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Delimiter": { |
|
"location": "querystring", |
|
"locationName": "delimiter" |
|
}, |
|
"EncodingType": { |
|
"location": "querystring", |
|
"locationName": "encoding-type" |
|
}, |
|
"KeyMarker": { |
|
"location": "querystring", |
|
"locationName": "key-marker" |
|
}, |
|
"MaxUploads": { |
|
"location": "querystring", |
|
"locationName": "max-uploads", |
|
"type": "integer" |
|
}, |
|
"Prefix": { |
|
"location": "querystring", |
|
"locationName": "prefix" |
|
}, |
|
"UploadIdMarker": { |
|
"location": "querystring", |
|
"locationName": "upload-id-marker" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Bucket": {}, |
|
"KeyMarker": {}, |
|
"UploadIdMarker": {}, |
|
"NextKeyMarker": {}, |
|
"Prefix": {}, |
|
"Delimiter": {}, |
|
"NextUploadIdMarker": {}, |
|
"MaxUploads": { |
|
"type": "integer" |
|
}, |
|
"IsTruncated": { |
|
"type": "boolean" |
|
}, |
|
"Uploads": { |
|
"locationName": "Upload", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"UploadId": {}, |
|
"Key": {}, |
|
"Initiated": { |
|
"type": "timestamp" |
|
}, |
|
"StorageClass": {}, |
|
"Owner": { |
|
"shape": "S2k" |
|
}, |
|
"Initiator": { |
|
"shape": "S76" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"CommonPrefixes": { |
|
"shape": "S77" |
|
}, |
|
"EncodingType": {} |
|
} |
|
} |
|
}, |
|
"ListObjectVersions": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?versions" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Delimiter": { |
|
"location": "querystring", |
|
"locationName": "delimiter" |
|
}, |
|
"EncodingType": { |
|
"location": "querystring", |
|
"locationName": "encoding-type" |
|
}, |
|
"KeyMarker": { |
|
"location": "querystring", |
|
"locationName": "key-marker" |
|
}, |
|
"MaxKeys": { |
|
"location": "querystring", |
|
"locationName": "max-keys", |
|
"type": "integer" |
|
}, |
|
"Prefix": { |
|
"location": "querystring", |
|
"locationName": "prefix" |
|
}, |
|
"VersionIdMarker": { |
|
"location": "querystring", |
|
"locationName": "version-id-marker" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IsTruncated": { |
|
"type": "boolean" |
|
}, |
|
"KeyMarker": {}, |
|
"VersionIdMarker": {}, |
|
"NextKeyMarker": {}, |
|
"NextVersionIdMarker": {}, |
|
"Versions": { |
|
"locationName": "Version", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"ETag": {}, |
|
"Size": { |
|
"type": "integer" |
|
}, |
|
"StorageClass": {}, |
|
"Key": {}, |
|
"VersionId": {}, |
|
"IsLatest": { |
|
"type": "boolean" |
|
}, |
|
"LastModified": { |
|
"type": "timestamp" |
|
}, |
|
"Owner": { |
|
"shape": "S2k" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"DeleteMarkers": { |
|
"locationName": "DeleteMarker", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"Owner": { |
|
"shape": "S2k" |
|
}, |
|
"Key": {}, |
|
"VersionId": {}, |
|
"IsLatest": { |
|
"type": "boolean" |
|
}, |
|
"LastModified": { |
|
"type": "timestamp" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"Name": {}, |
|
"Prefix": {}, |
|
"Delimiter": {}, |
|
"MaxKeys": { |
|
"type": "integer" |
|
}, |
|
"CommonPrefixes": { |
|
"shape": "S77" |
|
}, |
|
"EncodingType": {} |
|
} |
|
}, |
|
"alias": "GetBucketObjectVersions" |
|
}, |
|
"ListObjects": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Delimiter": { |
|
"location": "querystring", |
|
"locationName": "delimiter" |
|
}, |
|
"EncodingType": { |
|
"location": "querystring", |
|
"locationName": "encoding-type" |
|
}, |
|
"Marker": { |
|
"location": "querystring", |
|
"locationName": "marker" |
|
}, |
|
"MaxKeys": { |
|
"location": "querystring", |
|
"locationName": "max-keys", |
|
"type": "integer" |
|
}, |
|
"Prefix": { |
|
"location": "querystring", |
|
"locationName": "prefix" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IsTruncated": { |
|
"type": "boolean" |
|
}, |
|
"Marker": {}, |
|
"NextMarker": {}, |
|
"Contents": { |
|
"shape": "S7p" |
|
}, |
|
"Name": {}, |
|
"Prefix": {}, |
|
"Delimiter": {}, |
|
"MaxKeys": { |
|
"type": "integer" |
|
}, |
|
"CommonPrefixes": { |
|
"shape": "S77" |
|
}, |
|
"EncodingType": {} |
|
} |
|
}, |
|
"alias": "GetBucket" |
|
}, |
|
"ListObjectsV2": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}?list-type=2" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Delimiter": { |
|
"location": "querystring", |
|
"locationName": "delimiter" |
|
}, |
|
"EncodingType": { |
|
"location": "querystring", |
|
"locationName": "encoding-type" |
|
}, |
|
"MaxKeys": { |
|
"location": "querystring", |
|
"locationName": "max-keys", |
|
"type": "integer" |
|
}, |
|
"Prefix": { |
|
"location": "querystring", |
|
"locationName": "prefix" |
|
}, |
|
"ContinuationToken": { |
|
"location": "querystring", |
|
"locationName": "continuation-token" |
|
}, |
|
"FetchOwner": { |
|
"location": "querystring", |
|
"locationName": "fetch-owner", |
|
"type": "boolean" |
|
}, |
|
"StartAfter": { |
|
"location": "querystring", |
|
"locationName": "start-after" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"IsTruncated": { |
|
"type": "boolean" |
|
}, |
|
"Contents": { |
|
"shape": "S7p" |
|
}, |
|
"Name": {}, |
|
"Prefix": {}, |
|
"Delimiter": {}, |
|
"MaxKeys": { |
|
"type": "integer" |
|
}, |
|
"CommonPrefixes": { |
|
"shape": "S77" |
|
}, |
|
"EncodingType": {}, |
|
"KeyCount": { |
|
"type": "integer" |
|
}, |
|
"ContinuationToken": {}, |
|
"NextContinuationToken": {}, |
|
"StartAfter": {} |
|
} |
|
} |
|
}, |
|
"ListParts": { |
|
"http": { |
|
"method": "GET", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key", |
|
"UploadId" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"MaxParts": { |
|
"location": "querystring", |
|
"locationName": "max-parts", |
|
"type": "integer" |
|
}, |
|
"PartNumberMarker": { |
|
"location": "querystring", |
|
"locationName": "part-number-marker", |
|
"type": "integer" |
|
}, |
|
"UploadId": { |
|
"location": "querystring", |
|
"locationName": "uploadId" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"AbortDate": { |
|
"location": "header", |
|
"locationName": "x-amz-abort-date", |
|
"type": "timestamp" |
|
}, |
|
"AbortRuleId": { |
|
"location": "header", |
|
"locationName": "x-amz-abort-rule-id" |
|
}, |
|
"Bucket": {}, |
|
"Key": {}, |
|
"UploadId": {}, |
|
"PartNumberMarker": { |
|
"type": "integer" |
|
}, |
|
"NextPartNumberMarker": { |
|
"type": "integer" |
|
}, |
|
"MaxParts": { |
|
"type": "integer" |
|
}, |
|
"IsTruncated": { |
|
"type": "boolean" |
|
}, |
|
"Parts": { |
|
"locationName": "Part", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"PartNumber": { |
|
"type": "integer" |
|
}, |
|
"LastModified": { |
|
"type": "timestamp" |
|
}, |
|
"ETag": {}, |
|
"Size": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"Initiator": { |
|
"shape": "S76" |
|
}, |
|
"Owner": { |
|
"shape": "S2k" |
|
}, |
|
"StorageClass": {}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"PutBucketAccelerateConfiguration": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?accelerate" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"AccelerateConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"AccelerateConfiguration": { |
|
"locationName": "AccelerateConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"members": { |
|
"Status": {} |
|
} |
|
} |
|
}, |
|
"payload": "AccelerateConfiguration" |
|
} |
|
}, |
|
"PutBucketAcl": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?acl" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"ACL": { |
|
"location": "header", |
|
"locationName": "x-amz-acl" |
|
}, |
|
"AccessControlPolicy": { |
|
"shape": "S89", |
|
"locationName": "AccessControlPolicy", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
} |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"GrantFullControl": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-full-control" |
|
}, |
|
"GrantRead": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read" |
|
}, |
|
"GrantReadACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read-acp" |
|
}, |
|
"GrantWrite": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write" |
|
}, |
|
"GrantWriteACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write-acp" |
|
} |
|
}, |
|
"payload": "AccessControlPolicy" |
|
} |
|
}, |
|
"PutBucketCors": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?cors" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"CORSConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"CORSConfiguration": { |
|
"locationName": "CORSConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"CORSRules" |
|
], |
|
"members": { |
|
"CORSRules": { |
|
"shape": "S2w", |
|
"locationName": "CORSRule" |
|
} |
|
} |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
} |
|
}, |
|
"payload": "CORSConfiguration" |
|
} |
|
}, |
|
"PutBucketLifecycle": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?lifecycle" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"LifecycleConfiguration": { |
|
"locationName": "LifecycleConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"Rules" |
|
], |
|
"members": { |
|
"Rules": { |
|
"shape": "S39", |
|
"locationName": "Rule" |
|
} |
|
} |
|
} |
|
}, |
|
"payload": "LifecycleConfiguration" |
|
}, |
|
"deprecated": true |
|
}, |
|
"PutBucketLifecycleConfiguration": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?lifecycle" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"LifecycleConfiguration": { |
|
"locationName": "LifecycleConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"Rules" |
|
], |
|
"members": { |
|
"Rules": { |
|
"shape": "S3p", |
|
"locationName": "Rule" |
|
} |
|
} |
|
} |
|
}, |
|
"payload": "LifecycleConfiguration" |
|
} |
|
}, |
|
"PutBucketLogging": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?logging" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"BucketLoggingStatus" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"BucketLoggingStatus": { |
|
"locationName": "BucketLoggingStatus", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"members": { |
|
"LoggingEnabled": { |
|
"shape": "S3x" |
|
} |
|
} |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
} |
|
}, |
|
"payload": "BucketLoggingStatus" |
|
} |
|
}, |
|
"PutBucketNotification": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?notification" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"NotificationConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"NotificationConfiguration": { |
|
"shape": "S44", |
|
"locationName": "NotificationConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
} |
|
} |
|
}, |
|
"payload": "NotificationConfiguration" |
|
}, |
|
"deprecated": true |
|
}, |
|
"PutBucketNotificationConfiguration": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?notification" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"NotificationConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"NotificationConfiguration": { |
|
"shape": "S4f", |
|
"locationName": "NotificationConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
} |
|
} |
|
}, |
|
"payload": "NotificationConfiguration" |
|
} |
|
}, |
|
"PutBucketPolicy": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?policy" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Policy" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"Policy": {} |
|
}, |
|
"payload": "Policy" |
|
} |
|
}, |
|
"PutBucketReplication": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?replication" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"ReplicationConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"ReplicationConfiguration": { |
|
"shape": "S4y", |
|
"locationName": "ReplicationConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
} |
|
} |
|
}, |
|
"payload": "ReplicationConfiguration" |
|
} |
|
}, |
|
"PutBucketRequestPayment": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?requestPayment" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"RequestPaymentConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"RequestPaymentConfiguration": { |
|
"locationName": "RequestPaymentConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"Payer" |
|
], |
|
"members": { |
|
"Payer": {} |
|
} |
|
} |
|
}, |
|
"payload": "RequestPaymentConfiguration" |
|
} |
|
}, |
|
"PutBucketTagging": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?tagging" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Tagging" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"Tagging": { |
|
"locationName": "Tagging", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"TagSet" |
|
], |
|
"members": { |
|
"TagSet": { |
|
"shape": "S59" |
|
} |
|
} |
|
} |
|
}, |
|
"payload": "Tagging" |
|
} |
|
}, |
|
"PutBucketVersioning": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?versioning" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"VersioningConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"MFA": { |
|
"location": "header", |
|
"locationName": "x-amz-mfa" |
|
}, |
|
"VersioningConfiguration": { |
|
"locationName": "VersioningConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"members": { |
|
"MFADelete": { |
|
"locationName": "MfaDelete" |
|
}, |
|
"Status": {} |
|
} |
|
} |
|
}, |
|
"payload": "VersioningConfiguration" |
|
} |
|
}, |
|
"PutBucketWebsite": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}?website" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"WebsiteConfiguration" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"WebsiteConfiguration": { |
|
"locationName": "WebsiteConfiguration", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"members": { |
|
"ErrorDocument": { |
|
"shape": "S5n" |
|
}, |
|
"IndexDocument": { |
|
"shape": "S5l" |
|
}, |
|
"RedirectAllRequestsTo": { |
|
"shape": "S5i" |
|
}, |
|
"RoutingRules": { |
|
"shape": "S5o" |
|
} |
|
} |
|
} |
|
}, |
|
"payload": "WebsiteConfiguration" |
|
} |
|
}, |
|
"PutObject": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"ACL": { |
|
"location": "header", |
|
"locationName": "x-amz-acl" |
|
}, |
|
"Body": { |
|
"streaming": true, |
|
"type": "blob" |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"CacheControl": { |
|
"location": "header", |
|
"locationName": "Cache-Control" |
|
}, |
|
"ContentDisposition": { |
|
"location": "header", |
|
"locationName": "Content-Disposition" |
|
}, |
|
"ContentEncoding": { |
|
"location": "header", |
|
"locationName": "Content-Encoding" |
|
}, |
|
"ContentLanguage": { |
|
"location": "header", |
|
"locationName": "Content-Language" |
|
}, |
|
"ContentLength": { |
|
"location": "header", |
|
"locationName": "Content-Length", |
|
"type": "long" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"ContentType": { |
|
"location": "header", |
|
"locationName": "Content-Type" |
|
}, |
|
"Expires": { |
|
"location": "header", |
|
"locationName": "Expires", |
|
"type": "timestamp" |
|
}, |
|
"GrantFullControl": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-full-control" |
|
}, |
|
"GrantRead": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read" |
|
}, |
|
"GrantReadACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read-acp" |
|
}, |
|
"GrantWriteACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write-acp" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"Metadata": { |
|
"shape": "S11", |
|
"location": "headers", |
|
"locationName": "x-amz-meta-" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"StorageClass": { |
|
"location": "header", |
|
"locationName": "x-amz-storage-class" |
|
}, |
|
"WebsiteRedirectLocation": { |
|
"location": "header", |
|
"locationName": "x-amz-website-redirect-location" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
}, |
|
"payload": "Body" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"Expiration": { |
|
"location": "header", |
|
"locationName": "x-amz-expiration" |
|
}, |
|
"ETag": { |
|
"location": "header", |
|
"locationName": "ETag" |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"VersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-version-id" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"PutObjectAcl": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}/{Key+}?acl" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"ACL": { |
|
"location": "header", |
|
"locationName": "x-amz-acl" |
|
}, |
|
"AccessControlPolicy": { |
|
"shape": "S89", |
|
"locationName": "AccessControlPolicy", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
} |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"GrantFullControl": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-full-control" |
|
}, |
|
"GrantRead": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read" |
|
}, |
|
"GrantReadACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-read-acp" |
|
}, |
|
"GrantWrite": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write" |
|
}, |
|
"GrantWriteACP": { |
|
"location": "header", |
|
"locationName": "x-amz-grant-write-acp" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
}, |
|
"VersionId": { |
|
"location": "querystring", |
|
"locationName": "versionId" |
|
} |
|
}, |
|
"payload": "AccessControlPolicy" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"RestoreObject": { |
|
"http": { |
|
"requestUri": "/{Bucket}/{Key+}?restore" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"VersionId": { |
|
"location": "querystring", |
|
"locationName": "versionId" |
|
}, |
|
"RestoreRequest": { |
|
"locationName": "RestoreRequest", |
|
"xmlNamespace": { |
|
"uri": "http://s3.amazonaws.com/doc/2006-03-01/" |
|
}, |
|
"type": "structure", |
|
"required": [ |
|
"Days" |
|
], |
|
"members": { |
|
"Days": { |
|
"type": "integer" |
|
}, |
|
"GlacierJobParameters": { |
|
"type": "structure", |
|
"required": [ |
|
"Tier" |
|
], |
|
"members": { |
|
"Tier": {} |
|
} |
|
} |
|
} |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
}, |
|
"payload": "RestoreRequest" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
}, |
|
"alias": "PostObjectRestore" |
|
}, |
|
"UploadPart": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"Key", |
|
"PartNumber", |
|
"UploadId" |
|
], |
|
"members": { |
|
"Body": { |
|
"streaming": true, |
|
"type": "blob" |
|
}, |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"ContentLength": { |
|
"location": "header", |
|
"locationName": "Content-Length", |
|
"type": "long" |
|
}, |
|
"ContentMD5": { |
|
"location": "header", |
|
"locationName": "Content-MD5" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"PartNumber": { |
|
"location": "querystring", |
|
"locationName": "partNumber", |
|
"type": "integer" |
|
}, |
|
"UploadId": { |
|
"location": "querystring", |
|
"locationName": "uploadId" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
}, |
|
"payload": "Body" |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"ETag": { |
|
"location": "header", |
|
"locationName": "ETag" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
} |
|
} |
|
}, |
|
"UploadPartCopy": { |
|
"http": { |
|
"method": "PUT", |
|
"requestUri": "/{Bucket}/{Key+}" |
|
}, |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket", |
|
"CopySource", |
|
"Key", |
|
"PartNumber", |
|
"UploadId" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
}, |
|
"CopySource": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source" |
|
}, |
|
"CopySourceIfMatch": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-match" |
|
}, |
|
"CopySourceIfModifiedSince": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-modified-since", |
|
"type": "timestamp" |
|
}, |
|
"CopySourceIfNoneMatch": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-none-match" |
|
}, |
|
"CopySourceIfUnmodifiedSince": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-if-unmodified-since", |
|
"type": "timestamp" |
|
}, |
|
"CopySourceRange": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-range" |
|
}, |
|
"Key": { |
|
"location": "uri", |
|
"locationName": "Key" |
|
}, |
|
"PartNumber": { |
|
"location": "querystring", |
|
"locationName": "partNumber", |
|
"type": "integer" |
|
}, |
|
"UploadId": { |
|
"location": "querystring", |
|
"locationName": "uploadId" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKey": { |
|
"shape": "S18", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"CopySourceSSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-server-side-encryption-customer-algorithm" |
|
}, |
|
"CopySourceSSECustomerKey": { |
|
"shape": "S1b", |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-server-side-encryption-customer-key" |
|
}, |
|
"CopySourceSSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-server-side-encryption-customer-key-MD5" |
|
}, |
|
"RequestPayer": { |
|
"location": "header", |
|
"locationName": "x-amz-request-payer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"type": "structure", |
|
"members": { |
|
"CopySourceVersionId": { |
|
"location": "header", |
|
"locationName": "x-amz-copy-source-version-id" |
|
}, |
|
"CopyPartResult": { |
|
"type": "structure", |
|
"members": { |
|
"ETag": {}, |
|
"LastModified": { |
|
"type": "timestamp" |
|
} |
|
} |
|
}, |
|
"ServerSideEncryption": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption" |
|
}, |
|
"SSECustomerAlgorithm": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-algorithm" |
|
}, |
|
"SSECustomerKeyMD5": { |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-customer-key-MD5" |
|
}, |
|
"SSEKMSKeyId": { |
|
"shape": "Sj", |
|
"location": "header", |
|
"locationName": "x-amz-server-side-encryption-aws-kms-key-id" |
|
}, |
|
"RequestCharged": { |
|
"location": "header", |
|
"locationName": "x-amz-request-charged" |
|
} |
|
}, |
|
"payload": "CopyPartResult" |
|
} |
|
} |
|
}, |
|
"shapes": { |
|
"Sj": { |
|
"type": "string", |
|
"sensitive": true |
|
}, |
|
"S11": { |
|
"type": "map", |
|
"key": {}, |
|
"value": {} |
|
}, |
|
"S18": { |
|
"type": "blob", |
|
"sensitive": true |
|
}, |
|
"S1b": { |
|
"type": "blob", |
|
"sensitive": true |
|
}, |
|
"S2k": { |
|
"type": "structure", |
|
"members": { |
|
"DisplayName": {}, |
|
"ID": {} |
|
} |
|
}, |
|
"S2n": { |
|
"type": "list", |
|
"member": { |
|
"locationName": "Grant", |
|
"type": "structure", |
|
"members": { |
|
"Grantee": { |
|
"shape": "S2p" |
|
}, |
|
"Permission": {} |
|
} |
|
} |
|
}, |
|
"S2p": { |
|
"type": "structure", |
|
"required": [ |
|
"Type" |
|
], |
|
"members": { |
|
"DisplayName": {}, |
|
"EmailAddress": {}, |
|
"ID": {}, |
|
"Type": { |
|
"locationName": "xsi:type", |
|
"xmlAttribute": true |
|
}, |
|
"URI": {} |
|
}, |
|
"xmlNamespace": { |
|
"prefix": "xsi", |
|
"uri": "http://www.w3.org/2001/XMLSchema-instance" |
|
} |
|
}, |
|
"S2w": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"AllowedMethods", |
|
"AllowedOrigins" |
|
], |
|
"members": { |
|
"AllowedHeaders": { |
|
"locationName": "AllowedHeader", |
|
"type": "list", |
|
"member": {}, |
|
"flattened": true |
|
}, |
|
"AllowedMethods": { |
|
"locationName": "AllowedMethod", |
|
"type": "list", |
|
"member": {}, |
|
"flattened": true |
|
}, |
|
"AllowedOrigins": { |
|
"locationName": "AllowedOrigin", |
|
"type": "list", |
|
"member": {}, |
|
"flattened": true |
|
}, |
|
"ExposeHeaders": { |
|
"locationName": "ExposeHeader", |
|
"type": "list", |
|
"member": {}, |
|
"flattened": true |
|
}, |
|
"MaxAgeSeconds": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"S39": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"Prefix", |
|
"Status" |
|
], |
|
"members": { |
|
"Expiration": { |
|
"shape": "S3b" |
|
}, |
|
"ID": {}, |
|
"Prefix": {}, |
|
"Status": {}, |
|
"Transition": { |
|
"shape": "S3h" |
|
}, |
|
"NoncurrentVersionTransition": { |
|
"shape": "S3j" |
|
}, |
|
"NoncurrentVersionExpiration": { |
|
"shape": "S3k" |
|
}, |
|
"AbortIncompleteMultipartUpload": { |
|
"shape": "S3l" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"S3b": { |
|
"type": "structure", |
|
"members": { |
|
"Date": { |
|
"shape": "S3c" |
|
}, |
|
"Days": { |
|
"type": "integer" |
|
}, |
|
"ExpiredObjectDeleteMarker": { |
|
"type": "boolean" |
|
} |
|
} |
|
}, |
|
"S3c": { |
|
"type": "timestamp", |
|
"timestampFormat": "iso8601" |
|
}, |
|
"S3h": { |
|
"type": "structure", |
|
"members": { |
|
"Date": { |
|
"shape": "S3c" |
|
}, |
|
"Days": { |
|
"type": "integer" |
|
}, |
|
"StorageClass": {} |
|
} |
|
}, |
|
"S3j": { |
|
"type": "structure", |
|
"members": { |
|
"NoncurrentDays": { |
|
"type": "integer" |
|
}, |
|
"StorageClass": {} |
|
} |
|
}, |
|
"S3k": { |
|
"type": "structure", |
|
"members": { |
|
"NoncurrentDays": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"S3l": { |
|
"type": "structure", |
|
"members": { |
|
"DaysAfterInitiation": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"S3p": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"Prefix", |
|
"Status" |
|
], |
|
"members": { |
|
"Expiration": { |
|
"shape": "S3b" |
|
}, |
|
"ID": {}, |
|
"Prefix": {}, |
|
"Status": {}, |
|
"Transitions": { |
|
"locationName": "Transition", |
|
"type": "list", |
|
"member": { |
|
"shape": "S3h" |
|
}, |
|
"flattened": true |
|
}, |
|
"NoncurrentVersionTransitions": { |
|
"locationName": "NoncurrentVersionTransition", |
|
"type": "list", |
|
"member": { |
|
"shape": "S3j" |
|
}, |
|
"flattened": true |
|
}, |
|
"NoncurrentVersionExpiration": { |
|
"shape": "S3k" |
|
}, |
|
"AbortIncompleteMultipartUpload": { |
|
"shape": "S3l" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"S3x": { |
|
"type": "structure", |
|
"members": { |
|
"TargetBucket": {}, |
|
"TargetGrants": { |
|
"type": "list", |
|
"member": { |
|
"locationName": "Grant", |
|
"type": "structure", |
|
"members": { |
|
"Grantee": { |
|
"shape": "S2p" |
|
}, |
|
"Permission": {} |
|
} |
|
} |
|
}, |
|
"TargetPrefix": {} |
|
} |
|
}, |
|
"S43": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": { |
|
"location": "uri", |
|
"locationName": "Bucket" |
|
} |
|
} |
|
}, |
|
"S44": { |
|
"type": "structure", |
|
"members": { |
|
"TopicConfiguration": { |
|
"type": "structure", |
|
"members": { |
|
"Id": {}, |
|
"Events": { |
|
"shape": "S47", |
|
"locationName": "Event" |
|
}, |
|
"Event": { |
|
"deprecated": true |
|
}, |
|
"Topic": {} |
|
} |
|
}, |
|
"QueueConfiguration": { |
|
"type": "structure", |
|
"members": { |
|
"Id": {}, |
|
"Event": { |
|
"deprecated": true |
|
}, |
|
"Events": { |
|
"shape": "S47", |
|
"locationName": "Event" |
|
}, |
|
"Queue": {} |
|
} |
|
}, |
|
"CloudFunctionConfiguration": { |
|
"type": "structure", |
|
"members": { |
|
"Id": {}, |
|
"Event": { |
|
"deprecated": true |
|
}, |
|
"Events": { |
|
"shape": "S47", |
|
"locationName": "Event" |
|
}, |
|
"CloudFunction": {}, |
|
"InvocationRole": {} |
|
} |
|
} |
|
} |
|
}, |
|
"S47": { |
|
"type": "list", |
|
"member": {}, |
|
"flattened": true |
|
}, |
|
"S4f": { |
|
"type": "structure", |
|
"members": { |
|
"TopicConfigurations": { |
|
"locationName": "TopicConfiguration", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"TopicArn", |
|
"Events" |
|
], |
|
"members": { |
|
"Id": {}, |
|
"TopicArn": { |
|
"locationName": "Topic" |
|
}, |
|
"Events": { |
|
"shape": "S47", |
|
"locationName": "Event" |
|
}, |
|
"Filter": { |
|
"shape": "S4i" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"QueueConfigurations": { |
|
"locationName": "QueueConfiguration", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"QueueArn", |
|
"Events" |
|
], |
|
"members": { |
|
"Id": {}, |
|
"QueueArn": { |
|
"locationName": "Queue" |
|
}, |
|
"Events": { |
|
"shape": "S47", |
|
"locationName": "Event" |
|
}, |
|
"Filter": { |
|
"shape": "S4i" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"LambdaFunctionConfigurations": { |
|
"locationName": "CloudFunctionConfiguration", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"LambdaFunctionArn", |
|
"Events" |
|
], |
|
"members": { |
|
"Id": {}, |
|
"LambdaFunctionArn": { |
|
"locationName": "CloudFunction" |
|
}, |
|
"Events": { |
|
"shape": "S47", |
|
"locationName": "Event" |
|
}, |
|
"Filter": { |
|
"shape": "S4i" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
} |
|
} |
|
}, |
|
"S4i": { |
|
"type": "structure", |
|
"members": { |
|
"Key": { |
|
"locationName": "S3Key", |
|
"type": "structure", |
|
"members": { |
|
"FilterRules": { |
|
"locationName": "FilterRule", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"Name": {}, |
|
"Value": {} |
|
} |
|
}, |
|
"flattened": true |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"S4y": { |
|
"type": "structure", |
|
"required": [ |
|
"Role", |
|
"Rules" |
|
], |
|
"members": { |
|
"Role": {}, |
|
"Rules": { |
|
"locationName": "Rule", |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"required": [ |
|
"Prefix", |
|
"Status", |
|
"Destination" |
|
], |
|
"members": { |
|
"ID": {}, |
|
"Prefix": {}, |
|
"Status": {}, |
|
"Destination": { |
|
"type": "structure", |
|
"required": [ |
|
"Bucket" |
|
], |
|
"members": { |
|
"Bucket": {}, |
|
"StorageClass": {} |
|
} |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
} |
|
} |
|
}, |
|
"S59": { |
|
"type": "list", |
|
"member": { |
|
"locationName": "Tag", |
|
"type": "structure", |
|
"required": [ |
|
"Key", |
|
"Value" |
|
], |
|
"members": { |
|
"Key": {}, |
|
"Value": {} |
|
} |
|
} |
|
}, |
|
"S5i": { |
|
"type": "structure", |
|
"required": [ |
|
"HostName" |
|
], |
|
"members": { |
|
"HostName": {}, |
|
"Protocol": {} |
|
} |
|
}, |
|
"S5l": { |
|
"type": "structure", |
|
"required": [ |
|
"Suffix" |
|
], |
|
"members": { |
|
"Suffix": {} |
|
} |
|
}, |
|
"S5n": { |
|
"type": "structure", |
|
"required": [ |
|
"Key" |
|
], |
|
"members": { |
|
"Key": {} |
|
} |
|
}, |
|
"S5o": { |
|
"type": "list", |
|
"member": { |
|
"locationName": "RoutingRule", |
|
"type": "structure", |
|
"required": [ |
|
"Redirect" |
|
], |
|
"members": { |
|
"Condition": { |
|
"type": "structure", |
|
"members": { |
|
"HttpErrorCodeReturnedEquals": {}, |
|
"KeyPrefixEquals": {} |
|
} |
|
}, |
|
"Redirect": { |
|
"type": "structure", |
|
"members": { |
|
"HostName": {}, |
|
"HttpRedirectCode": {}, |
|
"Protocol": {}, |
|
"ReplaceKeyPrefixWith": {}, |
|
"ReplaceKeyWith": {} |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"S76": { |
|
"type": "structure", |
|
"members": { |
|
"ID": {}, |
|
"DisplayName": {} |
|
} |
|
}, |
|
"S77": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"Prefix": {} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"S7p": { |
|
"type": "list", |
|
"member": { |
|
"type": "structure", |
|
"members": { |
|
"Key": {}, |
|
"LastModified": { |
|
"type": "timestamp" |
|
}, |
|
"ETag": {}, |
|
"Size": { |
|
"type": "integer" |
|
}, |
|
"StorageClass": {}, |
|
"Owner": { |
|
"shape": "S2k" |
|
} |
|
} |
|
}, |
|
"flattened": true |
|
}, |
|
"S89": { |
|
"type": "structure", |
|
"members": { |
|
"Grants": { |
|
"shape": "S2n", |
|
"locationName": "AccessControlList" |
|
}, |
|
"Owner": { |
|
"shape": "S2k" |
|
} |
|
} |
|
} |
|
} |
|
} |
|
},{}],4:[function(require,module,exports){ |
|
module.exports={ |
|
"pagination": { |
|
"ListBuckets": { |
|
"result_key": "Buckets" |
|
}, |
|
"ListMultipartUploads": { |
|
"limit_key": "MaxUploads", |
|
"more_results": "IsTruncated", |
|
"output_token": [ |
|
"NextKeyMarker", |
|
"NextUploadIdMarker" |
|
], |
|
"input_token": [ |
|
"KeyMarker", |
|
"UploadIdMarker" |
|
], |
|
"result_key": [ |
|
"Uploads", |
|
"CommonPrefixes" |
|
] |
|
}, |
|
"ListObjectVersions": { |
|
"more_results": "IsTruncated", |
|
"limit_key": "MaxKeys", |
|
"output_token": [ |
|
"NextKeyMarker", |
|
"NextVersionIdMarker" |
|
], |
|
"input_token": [ |
|
"KeyMarker", |
|
"VersionIdMarker" |
|
], |
|
"result_key": [ |
|
"Versions", |
|
"DeleteMarkers", |
|
"CommonPrefixes" |
|
] |
|
}, |
|
"ListObjects": { |
|
"more_results": "IsTruncated", |
|
"limit_key": "MaxKeys", |
|
"output_token": "NextMarker || Contents[-1].Key", |
|
"input_token": "Marker", |
|
"result_key": [ |
|
"Contents", |
|
"CommonPrefixes" |
|
] |
|
}, |
|
"ListObjectsV2": { |
|
"limit_key": "MaxKeys", |
|
"output_token": "NextContinuationToken", |
|
"input_token": "ContinuationToken", |
|
"result_key": [ |
|
"Contents", |
|
"CommonPrefixes" |
|
] |
|
}, |
|
"ListParts": { |
|
"more_results": "IsTruncated", |
|
"limit_key": "MaxParts", |
|
"output_token": "NextPartNumberMarker", |
|
"input_token": "PartNumberMarker", |
|
"result_key": "Parts" |
|
} |
|
} |
|
} |
|
|
|
},{}],5:[function(require,module,exports){ |
|
module.exports={ |
|
"version": 2, |
|
"waiters": { |
|
"BucketExists": { |
|
"delay": 5, |
|
"operation": "HeadBucket", |
|
"maxAttempts": 20, |
|
"acceptors": [ |
|
{ |
|
"expected": 200, |
|
"matcher": "status", |
|
"state": "success" |
|
}, |
|
{ |
|
"expected": 301, |
|
"matcher": "status", |
|
"state": "success" |
|
}, |
|
{ |
|
"expected": 403, |
|
"matcher": "status", |
|
"state": "success" |
|
}, |
|
{ |
|
"expected": 404, |
|
"matcher": "status", |
|
"state": "retry" |
|
} |
|
] |
|
}, |
|
"BucketNotExists": { |
|
"delay": 5, |
|
"operation": "HeadBucket", |
|
"maxAttempts": 20, |
|
"acceptors": [ |
|
{ |
|
"expected": 404, |
|
"matcher": "status", |
|
"state": "success" |
|
} |
|
] |
|
}, |
|
"ObjectExists": { |
|
"delay": 5, |
|
"operation": "HeadObject", |
|
"maxAttempts": 20, |
|
"acceptors": [ |
|
{ |
|
"expected": 200, |
|
"matcher": "status", |
|
"state": "success" |
|
}, |
|
{ |
|
"expected": 404, |
|
"matcher": "status", |
|
"state": "retry" |
|
} |
|
] |
|
}, |
|
"ObjectNotExists": { |
|
"delay": 5, |
|
"operation": "HeadObject", |
|
"maxAttempts": 20, |
|
"acceptors": [ |
|
{ |
|
"expected": 404, |
|
"matcher": "status", |
|
"state": "success" |
|
} |
|
] |
|
} |
|
} |
|
} |
|
|
|
},{}],6:[function(require,module,exports){ |
|
module.exports={ |
|
"version": "2.0", |
|
"metadata": { |
|
"apiVersion": "2011-06-15", |
|
"endpointPrefix": "sts", |
|
"globalEndpoint": "sts.amazonaws.com", |
|
"protocol": "query", |
|
"serviceAbbreviation": "AWS STS", |
|
"serviceFullName": "AWS Security Token Service", |
|
"signatureVersion": "v4", |
|
"xmlNamespace": "https://sts.amazonaws.com/doc/2011-06-15/" |
|
}, |
|
"operations": { |
|
"AssumeRole": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"RoleArn", |
|
"RoleSessionName" |
|
], |
|
"members": { |
|
"RoleArn": {}, |
|
"RoleSessionName": {}, |
|
"Policy": {}, |
|
"DurationSeconds": { |
|
"type": "integer" |
|
}, |
|
"ExternalId": {}, |
|
"SerialNumber": {}, |
|
"TokenCode": {} |
|
} |
|
}, |
|
"output": { |
|
"resultWrapper": "AssumeRoleResult", |
|
"type": "structure", |
|
"members": { |
|
"Credentials": { |
|
"shape": "Sa" |
|
}, |
|
"AssumedRoleUser": { |
|
"shape": "Sf" |
|
}, |
|
"PackedPolicySize": { |
|
"type": "integer" |
|
} |
|
} |
|
} |
|
}, |
|
"AssumeRoleWithSAML": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"RoleArn", |
|
"PrincipalArn", |
|
"SAMLAssertion" |
|
], |
|
"members": { |
|
"RoleArn": {}, |
|
"PrincipalArn": {}, |
|
"SAMLAssertion": {}, |
|
"Policy": {}, |
|
"DurationSeconds": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"resultWrapper": "AssumeRoleWithSAMLResult", |
|
"type": "structure", |
|
"members": { |
|
"Credentials": { |
|
"shape": "Sa" |
|
}, |
|
"AssumedRoleUser": { |
|
"shape": "Sf" |
|
}, |
|
"PackedPolicySize": { |
|
"type": "integer" |
|
}, |
|
"Subject": {}, |
|
"SubjectType": {}, |
|
"Issuer": {}, |
|
"Audience": {}, |
|
"NameQualifier": {} |
|
} |
|
} |
|
}, |
|
"AssumeRoleWithWebIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"RoleArn", |
|
"RoleSessionName", |
|
"WebIdentityToken" |
|
], |
|
"members": { |
|
"RoleArn": {}, |
|
"RoleSessionName": {}, |
|
"WebIdentityToken": {}, |
|
"ProviderId": {}, |
|
"Policy": {}, |
|
"DurationSeconds": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"resultWrapper": "AssumeRoleWithWebIdentityResult", |
|
"type": "structure", |
|
"members": { |
|
"Credentials": { |
|
"shape": "Sa" |
|
}, |
|
"SubjectFromWebIdentityToken": {}, |
|
"AssumedRoleUser": { |
|
"shape": "Sf" |
|
}, |
|
"PackedPolicySize": { |
|
"type": "integer" |
|
}, |
|
"Provider": {}, |
|
"Audience": {} |
|
} |
|
} |
|
}, |
|
"DecodeAuthorizationMessage": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"EncodedMessage" |
|
], |
|
"members": { |
|
"EncodedMessage": {} |
|
} |
|
}, |
|
"output": { |
|
"resultWrapper": "DecodeAuthorizationMessageResult", |
|
"type": "structure", |
|
"members": { |
|
"DecodedMessage": {} |
|
} |
|
} |
|
}, |
|
"GetCallerIdentity": { |
|
"input": { |
|
"type": "structure", |
|
"members": {} |
|
}, |
|
"output": { |
|
"resultWrapper": "GetCallerIdentityResult", |
|
"type": "structure", |
|
"members": { |
|
"UserId": {}, |
|
"Account": {}, |
|
"Arn": {} |
|
} |
|
} |
|
}, |
|
"GetFederationToken": { |
|
"input": { |
|
"type": "structure", |
|
"required": [ |
|
"Name" |
|
], |
|
"members": { |
|
"Name": {}, |
|
"Policy": {}, |
|
"DurationSeconds": { |
|
"type": "integer" |
|
} |
|
} |
|
}, |
|
"output": { |
|
"resultWrapper": "GetFederationTokenResult", |
|
"type": "structure", |
|
"members": { |
|
"Credentials": { |
|
"shape": "Sa" |
|
}, |
|
"FederatedUser": { |
|
"type": "structure", |
|
"required": [ |
|
"FederatedUserId", |
|
"Arn" |
|
], |
|
"members": { |
|
"FederatedUserId": {}, |
|
"Arn": {} |
|
} |
|
}, |
|
"PackedPolicySize": { |
|
"type": "integer" |
|
} |
|
} |
|
} |
|
}, |
|
"GetSessionToken": { |
|
"input": { |
|
"type": "structure", |
|
"members": { |
|
"DurationSeconds": { |
|
"type": "integer" |
|
}, |
|
"SerialNumber": {}, |
|
"TokenCode": {} |
|
} |
|
}, |
|
"output": { |
|
"resultWrapper": "GetSessionTokenResult", |
|
"type": "structure", |
|
"members": { |
|
"Credentials": { |
|
"shape": "Sa" |
|
} |
|
} |
|
} |
|
} |
|
}, |
|
"shapes": { |
|
"Sa": { |
|
"type": "structure", |
|
"required": [ |
|
"AccessKeyId", |
|
"SecretAccessKey", |
|
"SessionToken", |
|
"Expiration" |
|
], |
|
"members": { |
|
"AccessKeyId": {}, |
|
"SecretAccessKey": {}, |
|
"SessionToken": {}, |
|
"Expiration": { |
|
"type": "timestamp" |
|
} |
|
} |
|
}, |
|
"Sf": { |
|
"type": "structure", |
|
"required": [ |
|
"AssumedRoleId", |
|
"Arn" |
|
], |
|
"members": { |
|
"AssumedRoleId": {}, |
|
"Arn": {} |
|
} |
|
} |
|
} |
|
} |
|
},{}],7:[function(require,module,exports){ |
|
require('./lib/ns_loader'); |
|
var AWS = require('./lib/core'); |
|
|
|
// require lib you need |
|
require('./clients/s3'); |
|
|
|
if (typeof window !== 'undefined') window.AWS = AWS; |
|
if (typeof module !== 'undefined') module.exports = AWS; |
|
if (typeof self !== 'undefined') self.AWS = AWS; |
|
if (typeof NS !== 'undefined') NS.AWS = AWS; |
|
|
|
|
|
|
|
},{"./clients/s3":9,"./lib/core":14,"./lib/ns_loader":34}],8:[function(require,module,exports){ |
|
require('../lib/node_loader'); |
|
var AWS = require('../lib/core'); |
|
var Service = require('../lib/service'); |
|
var apiLoader = require('../lib/api_loader'); |
|
|
|
apiLoader.services['cognitoidentity'] = {}; |
|
AWS.CognitoIdentity = Service.defineService('cognitoidentity', ['2014-06-30']); |
|
require('../lib/services/cognitoidentity'); |
|
Object.defineProperty(apiLoader.services['cognitoidentity'], '2014-06-30', { |
|
get: function get() { |
|
var model = require('../apis/cognito-identity-2014-06-30.min.json'); |
|
return model; |
|
}, |
|
enumerable: true, |
|
configurable: true |
|
}); |
|
|
|
module.exports = AWS.CognitoIdentity; |
|
|
|
},{"../apis/cognito-identity-2014-06-30.min.json":1,"../lib/api_loader":11,"../lib/core":14,"../lib/node_loader":12,"../lib/service":49,"../lib/services/cognitoidentity":50}],9:[function(require,module,exports){ |
|
require('../lib/node_loader'); |
|
var AWS = require('../lib/core'); |
|
var Service = require('../lib/service'); |
|
var apiLoader = require('../lib/api_loader'); |
|
|
|
apiLoader.services['s3'] = {}; |
|
AWS.S3 = Service.defineService('s3', ['2006-03-01']); |
|
require('../lib/services/s3'); |
|
Object.defineProperty(apiLoader.services['s3'], '2006-03-01', { |
|
get: function get() { |
|
var model = require('../apis/s3-2006-03-01.min.json'); |
|
model.paginators = require('../apis/s3-2006-03-01.paginators.json').pagination; |
|
model.waiters = require('../apis/s3-2006-03-01.waiters2.json').waiters; |
|
return model; |
|
}, |
|
enumerable: true, |
|
configurable: true |
|
}); |
|
|
|
module.exports = AWS.S3; |
|
|
|
},{"../apis/s3-2006-03-01.min.json":3,"../apis/s3-2006-03-01.paginators.json":4,"../apis/s3-2006-03-01.waiters2.json":5,"../lib/api_loader":11,"../lib/core":14,"../lib/node_loader":12,"../lib/service":49,"../lib/services/s3":51}],10:[function(require,module,exports){ |
|
require('../lib/node_loader'); |
|
var AWS = require('../lib/core'); |
|
var Service = require('../lib/service'); |
|
var apiLoader = require('../lib/api_loader'); |
|
|
|
apiLoader.services['sts'] = {}; |
|
AWS.STS = Service.defineService('sts', ['2011-06-15']); |
|
require('../lib/services/sts'); |
|
Object.defineProperty(apiLoader.services['sts'], '2011-06-15', { |
|
get: function get() { |
|
var model = require('../apis/sts-2011-06-15.min.json'); |
|
return model; |
|
}, |
|
enumerable: true, |
|
configurable: true |
|
}); |
|
|
|
module.exports = AWS.STS; |
|
|
|
},{"../apis/sts-2011-06-15.min.json":6,"../lib/api_loader":11,"../lib/core":14,"../lib/node_loader":12,"../lib/service":49,"../lib/services/sts":52}],11:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
|
|
AWS.apiLoader = function(svc, version) { |
|
if (!AWS.apiLoader.services.hasOwnProperty(svc)) { |
|
throw new Error('InvalidService: Failed to load api for ' + svc); |
|
} |
|
return AWS.apiLoader.services[svc][version]; |
|
}; |
|
|
|
AWS.apiLoader.services = {}; |
|
|
|
module.exports = AWS.apiLoader; |
|
},{"./core":14}],12:[function(require,module,exports){ |
|
(function (process){ |
|
var util = require('./util'); |
|
|
|
// browser specific modules |
|
util.crypto.lib = require('crypto-browserify'); |
|
util.Buffer = require('buffer/').Buffer; |
|
util.url = require('url/'); |
|
util.querystring = require('querystring/'); |
|
|
|
var AWS = require('./core'); |
|
|
|
// Use default API loader function |
|
require('./api_loader'); |
|
|
|
// Load the DOMParser XML parser |
|
AWS.XML.Parser = require('./xml/browser_parser'); |
|
|
|
// Load the XHR HttpClient |
|
require('./http/xhr'); |
|
|
|
if (typeof process === 'undefined') { |
|
process = { |
|
browser: true |
|
}; |
|
} |
|
}).call(this,require('_process')) |
|
},{"./api_loader":11,"./core":14,"./http/xhr":24,"./util":61,"./xml/browser_parser":62,"_process":151,"buffer/":66,"crypto-browserify":68,"querystring/":126,"url/":127}],13:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
require('./credentials'); |
|
require('./credentials/credential_provider_chain'); |
|
var PromisesDependency; |
|
|
|
/** |
|
* The main configuration class used by all service objects to set |
|
* the region, credentials, and other options for requests. |
|
* |
|
* By default, credentials and region settings are left unconfigured. |
|
* This should be configured by the application before using any |
|
* AWS service APIs. |
|
* |
|
* In order to set global configuration options, properties should |
|
* be assigned to the global {AWS.config} object. |
|
* |
|
* @see AWS.config |
|
* |
|
* @!group General Configuration Options |
|
* |
|
* @!attribute credentials |
|
* @return [AWS.Credentials] the AWS credentials to sign requests with. |
|
* |
|
* @!attribute region |
|
* @example Set the global region setting to us-west-2 |
|
* AWS.config.update({region: 'us-west-2'}); |
|
* @return [AWS.Credentials] The region to send service requests to. |
|
* @see http://docs.amazonwebservices.com/general/latest/gr/rande.html |
|
* A list of available endpoints for each AWS service |
|
* |
|
* @!attribute maxRetries |
|
* @return [Integer] the maximum amount of retries to perform for a |
|
* service request. By default this value is calculated by the specific |
|
* service object that the request is being made to. |
|
* |
|
* @!attribute maxRedirects |
|
* @return [Integer] the maximum amount of redirects to follow for a |
|
* service request. Defaults to 10. |
|
* |
|
* @!attribute paramValidation |
|
* @return [Boolean|map] whether input parameters should be validated against |
|
* the operation description before sending the request. Defaults to true. |
|
* Pass a map to enable any of the following specific validation features: |
|
* |
|
* * **min** [Boolean] — Validates that a value meets the min |
|
* constraint. This is enabled by default when paramValidation is set |
|
* to `true`. |
|
* * **max** [Boolean] — Validates that a value meets the max |
|
* constraint. |
|
* * **pattern** [Boolean] — Validates that a string value matches a |
|
* regular expression. |
|
* * **enum** [Boolean] — Validates that a string value matches one |
|
* of the allowable enum values. |
|
* |
|
* @!attribute computeChecksums |
|
* @return [Boolean] whether to compute checksums for payload bodies when |
|
* the service accepts it (currently supported in S3 only). |
|
* |
|
* @!attribute convertResponseTypes |
|
* @return [Boolean] whether types are converted when parsing response data. |
|
* Currently only supported for JSON based services. Turning this off may |
|
* improve performance on large response payloads. Defaults to `true`. |
|
* |
|
* @!attribute correctClockSkew |
|
* @return [Boolean] whether to apply a clock skew correction and retry |
|
* requests that fail because of an skewed client clock. Defaults to |
|
* `false`. |
|
* |
|
* @!attribute sslEnabled |
|
* @return [Boolean] whether SSL is enabled for requests |
|
* |
|
* @!attribute s3ForcePathStyle |
|
* @return [Boolean] whether to force path style URLs for S3 objects |
|
* |
|
* @!attribute s3BucketEndpoint |
|
* @note Setting this configuration option requires an `endpoint` to be |
|
* provided explicitly to the service constructor. |
|
* @return [Boolean] whether the provided endpoint addresses an individual |
|
* bucket (false if it addresses the root API endpoint). |
|
* |
|
* @!attribute s3DisableBodySigning |
|
* @return [Boolean] whether to disable S3 body signing when using signature version `v4`. |
|
* Body signing can only be disabled when using https. Defaults to `true`. |
|
* |
|
* @!attribute useAccelerateEndpoint |
|
* @note This configuration option is only compatible with S3 while accessing |
|
* dns-compatible buckets. |
|
* @return [Boolean] Whether to use the Accelerate endpoint with the S3 service. |
|
* Defaults to `false`. |
|
* |
|
* @!attribute retryDelayOptions |
|
* @example Set the base retry delay for all services to 300 ms |
|
* AWS.config.update({retryDelayOptions: {base: 300}}); |
|
* // Delays with maxRetries = 3: 300, 600, 1200 |
|
* @example Set a custom backoff function to provide delay values on retries |
|
* AWS.config.update({retryDelayOptions: {customBackoff: function(retryCount) { |
|
* // returns delay in ms |
|
* }}}); |
|
* @note This works with all services except DynamoDB. |
|
* @return [map] A set of options to configure the retry delay on retryable errors. |
|
* Currently supported options are: |
|
* |
|
* * **base** [Integer] — The base number of milliseconds to use in the |
|
* exponential backoff for operation retries. Defaults to 100 ms. |
|
* * **customBackoff ** [function] — A custom function that accepts a retry count |
|
* and returns the amount of time to delay in milliseconds. The `base` option will be |
|
* ignored if this option is supplied. |
|
* |
|
* @!attribute httpOptions |
|
* @return [map] A set of options to pass to the low-level HTTP request. |
|
* Currently supported options are: |
|
* |
|
* * **proxy** [String] — the URL to proxy requests through |
|
* * **agent** [http.Agent, https.Agent] — the Agent object to perform |
|
* HTTP requests with. Used for connection pooling. Defaults to the global |
|
* agent (`http.globalAgent`) for non-SSL connections. Note that for |
|
* SSL connections, a special Agent object is used in order to enable |
|
* peer certificate verification. This feature is only supported in the |
|
* Node.js environment. |
|
* * **timeout** [Integer] — The number of milliseconds to wait before |
|
* giving up on a connection attempt. Defaults to two minutes (120000). |
|
* * **xhrAsync** [Boolean] — Whether the SDK will send asynchronous |
|
* HTTP requests. Used in the browser environment only. Set to false to |
|
* send requests synchronously. Defaults to true (async on). |
|
* * **xhrWithCredentials** [Boolean] — Sets the "withCredentials" |
|
* property of an XMLHttpRequest object. Used in the browser environment |
|
* only. Defaults to false. |
|
* @!attribute logger |
|
* @return [#write,#log] an object that responds to .write() (like a stream) |
|
* or .log() (like the console object) in order to log information about |
|
* requests |
|
* |
|
* @!attribute systemClockOffset |
|
* @return [Number] an offset value in milliseconds to apply to all signing |
|
* times. Use this to compensate for clock skew when your system may be |
|
* out of sync with the service time. Note that this configuration option |
|
* can only be applied to the global `AWS.config` object and cannot be |
|
* overridden in service-specific configuration. Defaults to 0 milliseconds. |
|
* |
|
* @!attribute signatureVersion |
|
* @return [String] the signature version to sign requests with (overriding |
|
* the API configuration). Possible values are: 'v2', 'v3', 'v4'. |
|
* |
|
* @!attribute signatureCache |
|
* @return [Boolean] whether the signature to sign requests with (overriding |
|
* the API configuration) is cached. Only applies to the signature version 'v4'. |
|
* Defaults to `true`. |
|
*/ |
|
AWS.Config = AWS.util.inherit({ |
|
/** |
|
* @!endgroup |
|
*/ |
|
|
|
/** |
|
* Creates a new configuration object. This is the object that passes |
|
* option data along to service requests, including credentials, security, |
|
* region information, and some service specific settings. |
|
* |
|
* @example Creating a new configuration object with credentials and region |
|
* var config = new AWS.Config({ |
|
* accessKeyId: 'AKID', secretAccessKey: 'SECRET', region: 'us-west-2' |
|
* }); |
|
* @option options accessKeyId [String] your AWS access key ID. |
|
* @option options secretAccessKey [String] your AWS secret access key. |
|
* @option options sessionToken [AWS.Credentials] the optional AWS |
|
* session token to sign requests with. |
|
* @option options credentials [AWS.Credentials] the AWS credentials |
|
* to sign requests with. You can either specify this object, or |
|
* specify the accessKeyId and secretAccessKey options directly. |
|
* @option options credentialProvider [AWS.CredentialProviderChain] the |
|
* provider chain used to resolve credentials if no static `credentials` |
|
* property is set. |
|
* @option options region [String] the region to send service requests to. |
|
* See {region} for more information. |
|
* @option options maxRetries [Integer] the maximum amount of retries to |
|
* attempt with a request. See {maxRetries} for more information. |
|
* @option options maxRedirects [Integer] the maximum amount of redirects to |
|
* follow with a request. See {maxRedirects} for more information. |
|
* @option options sslEnabled [Boolean] whether to enable SSL for |
|
* requests. |
|
* @option options paramValidation [Boolean|map] whether input parameters |
|
* should be validated against the operation description before sending |
|
* the request. Defaults to true. Pass a map to enable any of the |
|
* following specific validation features: |
|
* |
|
* * **min** [Boolean] — Validates that a value meets the min |
|
* constraint. This is enabled by default when paramValidation is set |
|
* to `true`. |
|
* * **max** [Boolean] — Validates that a value meets the max |
|
* constraint. |
|
* * **pattern** [Boolean] — Validates that a string value matches a |
|
* regular expression. |
|
* * **enum** [Boolean] — Validates that a string value matches one |
|
* of the allowable enum values. |
|
* @option options computeChecksums [Boolean] whether to compute checksums |
|
* for payload bodies when the service accepts it (currently supported |
|
* in S3 only) |
|
* @option options convertResponseTypes [Boolean] whether types are converted |
|
* when parsing response data. Currently only supported for JSON based |
|
* services. Turning this off may improve performance on large response |
|
* payloads. Defaults to `true`. |
|
* @option options correctClockSkew [Boolean] whether to apply a clock skew |
|
* correction and retry requests that fail because of an skewed client |
|
* clock. Defaults to `false`. |
|
* @option options s3ForcePathStyle [Boolean] whether to force path |
|
* style URLs for S3 objects. |
|
* @option options s3BucketEndpoint [Boolean] whether the provided endpoint |
|
* addresses an individual bucket (false if it addresses the root API |
|
* endpoint). Note that setting this configuration option requires an |
|
* `endpoint` to be provided explicitly to the service constructor. |
|
* @option options s3DisableBodySigning [Boolean] whether S3 body signing |
|
* should be disabled when using signature version `v4`. Body signing |
|
* can only be disabled when using https. Defaults to `true`. |
|
* |
|
* @option options retryDelayOptions [map] A set of options to configure |
|
* the retry delay on retryable errors. Currently supported options are: |
|
* |
|
* * **base** [Integer] — The base number of milliseconds to use in the |
|
* exponential backoff for operation retries. Defaults to 100 ms. |
|
* * **customBackoff ** [function] — A custom function that accepts a retry count |
|
* and returns the amount of time to delay in milliseconds. The `base` option will be |
|
* ignored if this option is supplied. |
|
* @option options httpOptions [map] A set of options to pass to the low-level |
|
* HTTP request. Currently supported options are: |
|
* |
|
* * **proxy** [String] — the URL to proxy requests through |
|
* * **agent** [http.Agent, https.Agent] — the Agent object to perform |
|
* HTTP requests with. Used for connection pooling. Defaults to the global |
|
* agent (`http.globalAgent`) for non-SSL connections. Note that for |
|
* SSL connections, a special Agent object is used in order to enable |
|
* peer certificate verification. This feature is only available in the |
|
* Node.js environment. |
|
* * **timeout** [Integer] — Sets the socket to timeout after timeout |
|
* milliseconds of inactivity on the socket. Defaults to two minutes |
|
* (120000). |
|
* * **xhrAsync** [Boolean] — Whether the SDK will send asynchronous |
|
* HTTP requests. Used in the browser environment only. Set to false to |
|
* send requests synchronously. Defaults to true (async on). |
|
* * **xhrWithCredentials** [Boolean] — Sets the "withCredentials" |
|
* property of an XMLHttpRequest object. Used in the browser environment |
|
* only. Defaults to false. |
|
* @option options apiVersion [String, Date] a String in YYYY-MM-DD format |
|
* (or a date) that represents the latest possible API version that can be |
|
* used in all services (unless overridden by `apiVersions`). Specify |
|
* 'latest' to use the latest possible version. |
|
* @option options apiVersions [map<String, String|Date>] a map of service |
|
* identifiers (the lowercase service class name) with the API version to |
|
* use when instantiating a service. Specify 'latest' for each individual |
|
* that can use the latest available version. |
|
* @option options logger [#write,#log] an object that responds to .write() |
|
* (like a stream) or .log() (like the console object) in order to log |
|
* information about requests |
|
* @option options systemClockOffset [Number] an offset value in milliseconds |
|
* to apply to all signing times. Use this to compensate for clock skew |
|
* when your system may be out of sync with the service time. Note that |
|
* this configuration option can only be applied to the global `AWS.config` |
|
* object and cannot be overridden in service-specific configuration. |
|
* Defaults to 0 milliseconds. |
|
* @option options signatureVersion [String] the signature version to sign |
|
* requests with (overriding the API configuration). Possible values are: |
|
* 'v2', 'v3', 'v4'. |
|
* @option options signatureCache [Boolean] whether the signature to sign |
|
* requests with (overriding the API configuration) is cached. Only applies |
|
* to the signature version 'v4'. Defaults to `true`. |
|
*/ |
|
constructor: function Config(options) { |
|
if (options === undefined) options = {}; |
|
options = this.extractCredentials(options); |
|
|
|
AWS.util.each.call(this, this.keys, function (key, value) { |
|
this.set(key, options[key], value); |
|
}); |
|
}, |
|
|
|
/** |
|
* @!group Managing Credentials |
|
*/ |
|
|
|
/** |
|
* Loads credentials from the configuration object. This is used internally |
|
* by the SDK to ensure that refreshable {Credentials} objects are properly |
|
* refreshed and loaded when sending a request. If you want to ensure that |
|
* your credentials are loaded prior to a request, you can use this method |
|
* directly to provide accurate credential data stored in the object. |
|
* |
|
* @note If you configure the SDK with static or environment credentials, |
|
* the credential data should already be present in {credentials} attribute. |
|
* This method is primarily necessary to load credentials from asynchronous |
|
* sources, or sources that can refresh credentials periodically. |
|
* @example Getting your access key |
|
* AWS.config.getCredentials(function(err) { |
|
* if (err) console.log(err.stack); // credentials not loaded |
|
* else console.log("Access Key:", AWS.config.credentials.accessKeyId); |
|
* }) |
|
* @callback callback function(err) |
|
* Called when the {credentials} have been properly set on the configuration |
|
* object. |
|
* |
|
* @param err [Error] if this is set, credentials were not successfuly |
|
* loaded and this error provides information why. |
|
* @see credentials |
|
* @see Credentials |
|
*/ |
|
getCredentials: function getCredentials(callback) { |
|
var self = this; |
|
|
|
function finish(err) { |
|
callback(err, err ? null : self.credentials); |
|
} |
|
|
|
function credError(msg, err) { |
|
return new AWS.util.error(err || new Error(), { |
|
code: 'CredentialsError', message: msg |
|
}); |
|
} |
|
|
|
function getAsyncCredentials() { |
|
self.credentials.get(function(err) { |
|
if (err) { |
|
var msg = 'Could not load credentials from ' + |
|
self.credentials.constructor.name; |
|
err = credError(msg, err); |
|
} |
|
finish(err); |
|
}); |
|
} |
|
|
|
function getStaticCredentials() { |
|
var err = null; |
|
if (!self.credentials.accessKeyId || !self.credentials.secretAccessKey) { |
|
err = credError('Missing credentials'); |
|
} |
|
finish(err); |
|
} |
|
|
|
if (self.credentials) { |
|
if (typeof self.credentials.get === 'function') { |
|
getAsyncCredentials(); |
|
} else { // static credentials |
|
getStaticCredentials(); |
|
} |
|
} else if (self.credentialProvider) { |
|
self.credentialProvider.resolve(function(err, creds) { |
|
if (err) { |
|
err = credError('Could not load credentials from any providers', err); |
|
} |
|
self.credentials = creds; |
|
finish(err); |
|
}); |
|
} else { |
|
finish(credError('No credentials to load')); |
|
} |
|
}, |
|
|
|
/** |
|
* @!group Loading and Setting Configuration Options |
|
*/ |
|
|
|
/** |
|
* @overload update(options, allowUnknownKeys = false) |
|
* Updates the current configuration object with new options. |
|
* |
|
* @example Update maxRetries property of a configuration object |
|
* config.update({maxRetries: 10}); |
|
* @param [Object] options a map of option keys and values. |
|
* @param [Boolean] allowUnknownKeys whether unknown keys can be set on |
|
* the configuration object. Defaults to `false`. |
|
* @see constructor |
|
*/ |
|
update: function update(options, allowUnknownKeys) { |
|
allowUnknownKeys = allowUnknownKeys || false; |
|
options = this.extractCredentials(options); |
|
AWS.util.each.call(this, options, function (key, value) { |
|
if (allowUnknownKeys || Object.prototype.hasOwnProperty.call(this.keys, key) || |
|
AWS.Service.hasService(key)) { |
|
this.set(key, value); |
|
} |
|
}); |
|
}, |
|
|
|
/** |
|
* Loads configuration data from a JSON file into this config object. |
|
* @note Loading configuration will reset all existing configuration |
|
* on the object. |
|
* @!macro nobrowser |
|
* @param path [String] the path relative to your process's current |
|
* working directory to load configuration from. |
|
* @return [AWS.Config] the same configuration object |
|
*/ |
|
loadFromPath: function loadFromPath(path) { |
|
this.clear(); |
|
|
|
var options = JSON.parse(AWS.util.readFileSync(path)); |
|
var fileSystemCreds = new AWS.FileSystemCredentials(path); |
|
var chain = new AWS.CredentialProviderChain(); |
|
chain.providers.unshift(fileSystemCreds); |
|
chain.resolve(function (err, creds) { |
|
if (err) throw err; |
|
else options.credentials = creds; |
|
}); |
|
|
|
this.constructor(options); |
|
|
|
return this; |
|
}, |
|
|
|
/** |
|
* Clears configuration data on this object |
|
* |
|
* @api private |
|
*/ |
|
clear: function clear() { |
|
/*jshint forin:false */ |
|
AWS.util.each.call(this, this.keys, function (key) { |
|
delete this[key]; |
|
}); |
|
|
|
// reset credential provider |
|
this.set('credentials', undefined); |
|
this.set('credentialProvider', undefined); |
|
}, |
|
|
|
/** |
|
* Sets a property on the configuration object, allowing for a |
|
* default value |
|
* @api private |
|
*/ |
|
set: function set(property, value, defaultValue) { |
|
if (value === undefined) { |
|
if (defaultValue === undefined) { |
|
defaultValue = this.keys[property]; |
|
} |
|
if (typeof defaultValue === 'function') { |
|
this[property] = defaultValue.call(this); |
|
} else { |
|
this[property] = defaultValue; |
|
} |
|
} else if (property === 'httpOptions' && this[property]) { |
|
// deep merge httpOptions |
|
this[property] = AWS.util.merge(this[property], value); |
|
} else { |
|
this[property] = value; |
|
} |
|
}, |
|
|
|
/** |
|
* All of the keys with their default values. |
|
* |
|
* @constant |
|
* @api private |
|
*/ |
|
keys: { |
|
credentials: null, |
|
credentialProvider: null, |
|
region: null, |
|
logger: null, |
|
apiVersions: {}, |
|
apiVersion: null, |
|
endpoint: undefined, |
|
httpOptions: { |
|
timeout: 120000 |
|
}, |
|
maxRetries: undefined, |
|
maxRedirects: 10, |
|
paramValidation: true, |
|
sslEnabled: true, |
|
s3ForcePathStyle: false, |
|
s3BucketEndpoint: false, |
|
s3DisableBodySigning: true, |
|
computeChecksums: true, |
|
convertResponseTypes: true, |
|
correctClockSkew: false, |
|
customUserAgent: null, |
|
dynamoDbCrc32: true, |
|
systemClockOffset: 0, |
|
signatureVersion: null, |
|
signatureCache: true, |
|
retryDelayOptions: { |
|
base: 100 |
|
}, |
|
useAccelerateEndpoint: false |
|
}, |
|
|
|
/** |
|
* Extracts accessKeyId, secretAccessKey and sessionToken |
|
* from a configuration hash. |
|
* |
|
* @api private |
|
*/ |
|
extractCredentials: function extractCredentials(options) { |
|
if (options.accessKeyId && options.secretAccessKey) { |
|
options = AWS.util.copy(options); |
|
options.credentials = new AWS.Credentials(options); |
|
} |
|
return options; |
|
}, |
|
|
|
/** |
|
* Sets the promise dependency the SDK will use wherever Promises are returned. |
|
* @param [Constructor] dep A reference to a Promise constructor |
|
*/ |
|
setPromisesDependency: function setPromisesDependency(dep) { |
|
PromisesDependency = dep; |
|
var constructors = [AWS.Request, AWS.Credentials, AWS.CredentialProviderChain]; |
|
if (AWS.S3 && AWS.S3.ManagedUpload) constructors.push(AWS.S3.ManagedUpload); |
|
AWS.util.addPromises(constructors, dep); |
|
}, |
|
|
|
/** |
|
* Gets the promise dependency set by `AWS.config.setPromisesDependency`. |
|
*/ |
|
getPromisesDependency: function getPromisesDependency() { |
|
return PromisesDependency; |
|
} |
|
}); |
|
|
|
/** |
|
* @return [AWS.Config] The global configuration object singleton instance |
|
* @readonly |
|
* @see AWS.Config |
|
*/ |
|
AWS.config = new AWS.Config(); |
|
|
|
},{"./core":14,"./credentials":15,"./credentials/credential_provider_chain":17}],14:[function(require,module,exports){ |
|
/** |
|
* The main AWS namespace |
|
*/ |
|
var AWS = { util: require('./util') }; |
|
|
|
/** |
|
* @api private |
|
* @!macro [new] nobrowser |
|
* @note This feature is not supported in the browser environment of the SDK. |
|
*/ |
|
var _hidden = {}; _hidden.toString(); // hack to parse macro |
|
|
|
module.exports = AWS; |
|
|
|
AWS.util.update(AWS, { |
|
|
|
/** |
|
* @constant |
|
*/ |
|
VERSION: '2.7.7', |
|
|
|
/** |
|
* @api private |
|
*/ |
|
Signers: {}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
Protocol: { |
|
Json: require('./protocol/json'), |
|
Query: require('./protocol/query'), |
|
Rest: require('./protocol/rest'), |
|
RestJson: require('./protocol/rest_json'), |
|
RestXml: require('./protocol/rest_xml') |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
XML: { |
|
Builder: require('./xml/builder'), |
|
Parser: null // conditionally set based on environment |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
JSON: { |
|
Builder: require('./json/builder'), |
|
Parser: require('./json/parser') |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
Model: { |
|
Api: require('./model/api'), |
|
Operation: require('./model/operation'), |
|
Shape: require('./model/shape'), |
|
Paginator: require('./model/paginator'), |
|
ResourceWaiter: require('./model/resource_waiter') |
|
}, |
|
|
|
util: require('./util'), |
|
|
|
/** |
|
* @api private |
|
*/ |
|
apiLoader: function() { throw new Error('No API loader set'); } |
|
}); |
|
|
|
require('./service'); |
|
|
|
require('./credentials'); |
|
require('./credentials/credential_provider_chain'); |
|
require('./credentials/temporary_credentials'); |
|
require('./credentials/web_identity_credentials'); |
|
require('./credentials/cognito_identity_credentials'); |
|
require('./credentials/saml_credentials'); |
|
|
|
require('./config'); |
|
require('./http'); |
|
require('./sequential_executor'); |
|
require('./event_listeners'); |
|
require('./request'); |
|
require('./response'); |
|
require('./resource_waiter'); |
|
require('./signers/request_signer'); |
|
require('./param_validator'); |
|
|
|
/** |
|
* @readonly |
|
* @return [AWS.SequentialExecutor] a collection of global event listeners that |
|
* are attached to every sent request. |
|
* @see AWS.Request AWS.Request for a list of events to listen for |
|
* @example Logging the time taken to send a request |
|
* AWS.events.on('send', function startSend(resp) { |
|
* resp.startTime = new Date().getTime(); |
|
* }).on('complete', function calculateTime(resp) { |
|
* var time = (new Date().getTime() - resp.startTime) / 1000; |
|
* console.log('Request took ' + time + ' seconds'); |
|
* }); |
|
* |
|
* new AWS.S3().listBuckets(); // prints 'Request took 0.285 seconds' |
|
*/ |
|
AWS.events = new AWS.SequentialExecutor(); |
|
|
|
},{"./config":13,"./credentials":15,"./credentials/cognito_identity_credentials":16,"./credentials/credential_provider_chain":17,"./credentials/saml_credentials":18,"./credentials/temporary_credentials":19,"./credentials/web_identity_credentials":20,"./event_listeners":21,"./http":22,"./json/builder":25,"./json/parser":26,"./model/api":27,"./model/operation":29,"./model/paginator":30,"./model/resource_waiter":31,"./model/shape":32,"./param_validator":35,"./protocol/json":36,"./protocol/query":37,"./protocol/rest":38,"./protocol/rest_json":39,"./protocol/rest_xml":40,"./request":44,"./resource_waiter":45,"./response":46,"./sequential_executor":48,"./service":49,"./signers/request_signer":54,"./util":61,"./xml/builder":63}],15:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
|
|
/** |
|
* Represents your AWS security credentials, specifically the |
|
* {accessKeyId}, {secretAccessKey}, and optional {sessionToken}. |
|
* Creating a `Credentials` object allows you to pass around your |
|
* security information to configuration and service objects. |
|
* |
|
* Note that this class typically does not need to be constructed manually, |
|
* as the {AWS.Config} and {AWS.Service} classes both accept simple |
|
* options hashes with the three keys. These structures will be converted |
|
* into Credentials objects automatically. |
|
* |
|
* ## Expiring and Refreshing Credentials |
|
* |
|
* Occasionally credentials can expire in the middle of a long-running |
|
* application. In this case, the SDK will automatically attempt to |
|
* refresh the credentials from the storage location if the Credentials |
|
* class implements the {refresh} method. |
|
* |
|
* If you are implementing a credential storage location, you |
|
* will want to create a subclass of the `Credentials` class and |
|
* override the {refresh} method. This method allows credentials to be |
|
* retrieved from the backing store, be it a file system, database, or |
|
* some network storage. The method should reset the credential attributes |
|
* on the object. |
|
* |
|
* @!attribute expired |
|
* @return [Boolean] whether the credentials have been expired and |
|
* require a refresh. Used in conjunction with {expireTime}. |
|
* @!attribute expireTime |
|
* @return [Date] a time when credentials should be considered expired. Used |
|
* in conjunction with {expired}. |
|
* @!attribute accessKeyId |
|
* @return [String] the AWS access key ID |
|
* @!attribute secretAccessKey |
|
* @return [String] the AWS secret access key |
|
* @!attribute sessionToken |
|
* @return [String] an optional AWS session token |
|
*/ |
|
AWS.Credentials = AWS.util.inherit({ |
|
/** |
|
* A credentials object can be created using positional arguments or an options |
|
* hash. |
|
* |
|
* @overload AWS.Credentials(accessKeyId, secretAccessKey, sessionToken=null) |
|
* Creates a Credentials object with a given set of credential information |
|
* as positional arguments. |
|
* @param accessKeyId [String] the AWS access key ID |
|
* @param secretAccessKey [String] the AWS secret access key |
|
* @param sessionToken [String] the optional AWS session token |
|
* @example Create a credentials object with AWS credentials |
|
* var creds = new AWS.Credentials('akid', 'secret', 'session'); |
|
* @overload AWS.Credentials(options) |
|
* Creates a Credentials object with a given set of credential information |
|
* as an options hash. |
|
* @option options accessKeyId [String] the AWS access key ID |
|
* @option options secretAccessKey [String] the AWS secret access key |
|
* @option options sessionToken [String] the optional AWS session token |
|
* @example Create a credentials object with AWS credentials |
|
* var creds = new AWS.Credentials({ |
|
* accessKeyId: 'akid', secretAccessKey: 'secret', sessionToken: 'session' |
|
* }); |
|
*/ |
|
constructor: function Credentials() { |
|
// hide secretAccessKey from being displayed with util.inspect |
|
AWS.util.hideProperties(this, ['secretAccessKey']); |
|
|
|
this.expired = false; |
|
this.expireTime = null; |
|
if (arguments.length === 1 && typeof arguments[0] === 'object') { |
|
var creds = arguments[0].credentials || arguments[0]; |
|
this.accessKeyId = creds.accessKeyId; |
|
this.secretAccessKey = creds.secretAccessKey; |
|
this.sessionToken = creds.sessionToken; |
|
} else { |
|
this.accessKeyId = arguments[0]; |
|
this.secretAccessKey = arguments[1]; |
|
this.sessionToken = arguments[2]; |
|
} |
|
}, |
|
|
|
/** |
|
* @return [Integer] the window size in seconds to attempt refreshing of |
|
* credentials before the expireTime occurs. |
|
*/ |
|
expiryWindow: 15, |
|
|
|
/** |
|
* @return [Boolean] whether the credentials object should call {refresh} |
|
* @note Subclasses should override this method to provide custom refresh |
|
* logic. |
|
*/ |
|
needsRefresh: function needsRefresh() { |
|
var currentTime = AWS.util.date.getDate().getTime(); |
|
var adjustedTime = new Date(currentTime + this.expiryWindow * 1000); |
|
|
|
if (this.expireTime && adjustedTime > this.expireTime) { |
|
return true; |
|
} else { |
|
return this.expired || !this.accessKeyId || !this.secretAccessKey; |
|
} |
|
}, |
|
|
|
/** |
|
* Gets the existing credentials, refreshing them if they are not yet loaded |
|
* or have expired. Users should call this method before using {refresh}, |
|
* as this will not attempt to reload credentials when they are already |
|
* loaded into the object. |
|
* |
|
* @callback callback function(err) |
|
* When this callback is called with no error, it means either credentials |
|
* do not need to be refreshed or refreshed credentials information has |
|
* been loaded into the object (as the `accessKeyId`, `secretAccessKey`, |
|
* and `sessionToken` properties). |
|
* @param err [Error] if an error occurred, this value will be filled |
|
*/ |
|
get: function get(callback) { |
|
var self = this; |
|
if (this.needsRefresh()) { |
|
this.refresh(function(err) { |
|
if (!err) self.expired = false; // reset expired flag |
|
if (callback) callback(err); |
|
}); |
|
} else if (callback) { |
|
callback(); |
|
} |
|
}, |
|
|
|
/** |
|
* @!method getPromise() |
|
* Returns a 'thenable' promise. |
|
* Gets the existing credentials, refreshing them if they are not yet loaded |
|
* or have expired. Users should call this method before using {refresh}, |
|
* as this will not attempt to reload credentials when they are already |
|
* loaded into the object. |
|
* |
|
* Two callbacks can be provided to the `then` method on the returned promise. |
|
* The first callback will be called if the promise is fulfilled, and the second |
|
* callback will be called if the promise is rejected. |
|
* @callback fulfilledCallback function() |
|
* Called if the promise is fulfilled. When this callback is called, it |
|
* means either credentials do not need to be refreshed or refreshed |
|
* credentials information has been loaded into the object (as the |
|
* `accessKeyId`, `secretAccessKey`, and `sessionToken` properties). |
|
* @callback rejectedCallback function(err) |
|
* Called if the promise is rejected. |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @return [Promise] A promise that represents the state of the `get` call. |
|
* @example Calling the `getPromise` method. |
|
* var promise = credProvider.getPromise(); |
|
* promise.then(function() { ... }, function(err) { ... }); |
|
*/ |
|
|
|
/** |
|
* @!method refreshPromise() |
|
* Returns a 'thenable' promise. |
|
* Refreshes the credentials. Users should call {get} before attempting |
|
* to forcibly refresh credentials. |
|
* |
|
* Two callbacks can be provided to the `then` method on the returned promise. |
|
* The first callback will be called if the promise is fulfilled, and the second |
|
* callback will be called if the promise is rejected. |
|
* @callback fulfilledCallback function() |
|
* Called if the promise is fulfilled. When this callback is called, it |
|
* means refreshed credentials information has been loaded into the object |
|
* (as the `accessKeyId`, `secretAccessKey`, and `sessionToken` properties). |
|
* @callback rejectedCallback function(err) |
|
* Called if the promise is rejected. |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @return [Promise] A promise that represents the state of the `refresh` call. |
|
* @example Calling the `refreshPromise` method. |
|
* var promise = credProvider.refreshPromise(); |
|
* promise.then(function() { ... }, function(err) { ... }); |
|
*/ |
|
|
|
/** |
|
* Refreshes the credentials. Users should call {get} before attempting |
|
* to forcibly refresh credentials. |
|
* |
|
* @callback callback function(err) |
|
* When this callback is called with no error, it means refreshed |
|
* credentials information has been loaded into the object (as the |
|
* `accessKeyId`, `secretAccessKey`, and `sessionToken` properties). |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @note Subclasses should override this class to reset the |
|
* {accessKeyId}, {secretAccessKey} and optional {sessionToken} |
|
* on the credentials object and then call the callback with |
|
* any error information. |
|
* @see get |
|
*/ |
|
refresh: function refresh(callback) { |
|
this.expired = false; |
|
callback(); |
|
} |
|
}); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Credentials.addPromisesToClass = function addPromisesToClass(PromiseDependency) { |
|
this.prototype.getPromise = AWS.util.promisifyMethod('get', PromiseDependency); |
|
this.prototype.refreshPromise = AWS.util.promisifyMethod('refresh', PromiseDependency); |
|
}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Credentials.deletePromisesFromClass = function deletePromisesFromClass() { |
|
delete this.prototype.getPromise; |
|
delete this.prototype.refreshPromise; |
|
}; |
|
|
|
AWS.util.addPromises(AWS.Credentials); |
|
|
|
},{"./core":14}],16:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var CognitoIdentity = require('../../clients/cognitoidentity'); |
|
var STS = require('../../clients/sts'); |
|
|
|
/** |
|
* Represents credentials retrieved from STS Web Identity Federation using |
|
* the Amazon Cognito Identity service. |
|
* |
|
* By default this provider gets credentials using the |
|
* {AWS.CognitoIdentity.getCredentialsForIdentity} service operation, which |
|
* requires either an `IdentityId` or an `IdentityPoolId` (Amazon Cognito |
|
* Identity Pool ID), which is used to call {AWS.CognitoIdentity.getId} to |
|
* obtain an `IdentityId`. If the identity or identity pool is not configured in |
|
* the Amazon Cognito Console to use IAM roles with the appropriate permissions, |
|
* then additionally a `RoleArn` is required containing the ARN of the IAM trust |
|
* policy for the Amazon Cognito role that the user will log into. If a `RoleArn` |
|
* is provided, then this provider gets credentials using the |
|
* {AWS.STS.assumeRoleWithWebIdentity} service operation, after first getting an |
|
* Open ID token from {AWS.CognitoIdentity.getOpenIdToken}. |
|
* |
|
* In addition, if this credential provider is used to provide authenticated |
|
* login, the `Logins` map may be set to the tokens provided by the respective |
|
* identity providers. See {constructor} for an example on creating a credentials |
|
* object with proper property values. |
|
* |
|
* ## Refreshing Credentials from Identity Service |
|
* |
|
* In addition to AWS credentials expiring after a given amount of time, the |
|
* login token from the identity provider will also expire. Once this token |
|
* expires, it will not be usable to refresh AWS credentials, and another |
|
* token will be needed. The SDK does not manage refreshing of the token value, |
|
* but this can be done through a "refresh token" supported by most identity |
|
* providers. Consult the documentation for the identity provider for refreshing |
|
* tokens. Once the refreshed token is acquired, you should make sure to update |
|
* this new token in the credentials object's {params} property. The following |
|
* code will update the WebIdentityToken, assuming you have retrieved an updated |
|
* token from the identity provider: |
|
* |
|
* ```javascript |
|
* AWS.config.credentials.params.Logins['graph.facebook.com'] = updatedToken; |
|
* ``` |
|
* |
|
* Future calls to `credentials.refresh()` will now use the new token. |
|
* |
|
* @!attribute params |
|
* @return [map] the map of params passed to |
|
* {AWS.CognitoIdentity.getId}, |
|
* {AWS.CognitoIdentity.getOpenIdToken}, and |
|
* {AWS.STS.assumeRoleWithWebIdentity}. To update the token, set the |
|
* `params.WebIdentityToken` property. |
|
* @!attribute data |
|
* @return [map] the raw data response from the call to |
|
* {AWS.CognitoIdentity.getCredentialsForIdentity}, or |
|
* {AWS.STS.assumeRoleWithWebIdentity}. Use this if you want to get |
|
* access to other properties from the response. |
|
* @!attribute identityId |
|
* @return [String] the Cognito ID returned by the last call to |
|
* {AWS.CognitoIdentity.getOpenIdToken}. This ID represents the actual |
|
* final resolved identity ID from Amazon Cognito. |
|
*/ |
|
AWS.CognitoIdentityCredentials = AWS.util.inherit(AWS.Credentials, { |
|
/** |
|
* @api private |
|
*/ |
|
localStorageKey: { |
|
id: 'aws.cognito.identity-id.', |
|
providers: 'aws.cognito.identity-providers.' |
|
}, |
|
|
|
/** |
|
* Creates a new credentials object. |
|
* @example Creating a new credentials object |
|
* AWS.config.credentials = new AWS.CognitoIdentityCredentials({ |
|
* |
|
* // either IdentityPoolId or IdentityId is required |
|
* // See the IdentityPoolId param for AWS.CognitoIdentity.getID (linked below) |
|
* // See the IdentityId param for AWS.CognitoIdentity.getCredentialsForIdentity |
|
* // or AWS.CognitoIdentity.getOpenIdToken (linked below) |
|
* IdentityPoolId: 'us-east-1:1699ebc0-7900-4099-b910-2df94f52a030', |
|
* IdentityId: 'us-east-1:128d0a74-c82f-4553-916d-90053e4a8b0f' |
|
* |
|
* // optional, only necessary when the identity pool is not configured |
|
* // to use IAM roles in the Amazon Cognito Console |
|
* // See the RoleArn param for AWS.STS.assumeRoleWithWebIdentity (linked below) |
|
* RoleArn: 'arn:aws:iam::1234567890:role/MYAPP-CognitoIdentity', |
|
* |
|
* // optional tokens, used for authenticated login |
|
* // See the Logins param for AWS.CognitoIdentity.getID (linked below) |
|
* Logins: { |
|
* 'graph.facebook.com': 'FBTOKEN', |
|
* 'www.amazon.com': 'AMAZONTOKEN', |
|
* 'accounts.google.com': 'GOOGLETOKEN', |
|
* 'api.twitter.com': 'TWITTERTOKEN', |
|
* 'www.digits.com': 'DIGITSTOKEN' |
|
* }, |
|
* |
|
* // optional name, defaults to web-identity |
|
* // See the RoleSessionName param for AWS.STS.assumeRoleWithWebIdentity (linked below) |
|
* RoleSessionName: 'web', |
|
* |
|
* // optional, only necessary when application runs in a browser |
|
* // and multiple users are signed in at once, used for caching |
|
* LoginId: '[email protected]' |
|
* |
|
* }); |
|
* @see AWS.CognitoIdentity.getId |
|
* @see AWS.CognitoIdentity.getCredentialsForIdentity |
|
* @see AWS.STS.assumeRoleWithWebIdentity |
|
* @see AWS.CognitoIdentity.getOpenIdToken |
|
*/ |
|
constructor: function CognitoIdentityCredentials(params) { |
|
AWS.Credentials.call(this); |
|
this.expired = true; |
|
this.params = params; |
|
this.data = null; |
|
this.identityId = null; |
|
this.loadCachedId(); |
|
}, |
|
|
|
/** |
|
* Refreshes credentials using {AWS.CognitoIdentity.getCredentialsForIdentity}, |
|
* or {AWS.STS.assumeRoleWithWebIdentity}. |
|
* |
|
* @callback callback function(err) |
|
* Called when the STS service responds (or fails). When |
|
* this callback is called with no error, it means that the credentials |
|
* information has been loaded into the object (as the `accessKeyId`, |
|
* `secretAccessKey`, and `sessionToken` properties). |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @see get |
|
*/ |
|
refresh: function refresh(callback) { |
|
var self = this; |
|
self.createClients(); |
|
self.data = null; |
|
self.identityId = null; |
|
self.getId(function(err) { |
|
if (!err) { |
|
if (!self.params.RoleArn) { |
|
self.getCredentialsForIdentity(callback); |
|
} else { |
|
self.getCredentialsFromSTS(callback); |
|
} |
|
} else { |
|
self.clearIdOnNotAuthorized(err); |
|
callback(err); |
|
} |
|
}); |
|
}, |
|
|
|
/** |
|
* Clears the cached Cognito ID associated with the currently configured |
|
* identity pool ID. Use this to manually invalidate your cache if |
|
* the identity pool ID was deleted. |
|
*/ |
|
clearCachedId: function clearCache() { |
|
this.identityId = null; |
|
delete this.params.IdentityId; |
|
|
|
var poolId = this.params.IdentityPoolId; |
|
var loginId = this.params.LoginId || ''; |
|
delete this.storage[this.localStorageKey.id + poolId + loginId]; |
|
delete this.storage[this.localStorageKey.providers + poolId + loginId]; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
clearIdOnNotAuthorized: function clearIdOnNotAuthorized(err) { |
|
var self = this; |
|
if (err.code == 'NotAuthorizedException') { |
|
self.clearCachedId(); |
|
} |
|
}, |
|
|
|
/** |
|
* Retrieves a Cognito ID, loading from cache if it was already retrieved |
|
* on this device. |
|
* |
|
* @callback callback function(err, identityId) |
|
* @param err [Error, null] an error object if the call failed or null if |
|
* it succeeded. |
|
* @param identityId [String, null] if successful, the callback will return |
|
* the Cognito ID. |
|
* @note If not loaded explicitly, the Cognito ID is loaded and stored in |
|
* localStorage in the browser environment of a device. |
|
* @api private |
|
*/ |
|
getId: function getId(callback) { |
|
var self = this; |
|
if (typeof self.params.IdentityId === 'string') { |
|
return callback(null, self.params.IdentityId); |
|
} |
|
|
|
self.cognito.getId(function(err, data) { |
|
if (!err && data.IdentityId) { |
|
self.params.IdentityId = data.IdentityId; |
|
callback(null, data.IdentityId); |
|
} else { |
|
callback(err); |
|
} |
|
}); |
|
}, |
|
|
|
|
|
/** |
|
* @api private |
|
*/ |
|
loadCredentials: function loadCredentials(data, credentials) { |
|
if (!data || !credentials) return; |
|
credentials.expired = false; |
|
credentials.accessKeyId = data.Credentials.AccessKeyId; |
|
credentials.secretAccessKey = data.Credentials.SecretKey; |
|
credentials.sessionToken = data.Credentials.SessionToken; |
|
credentials.expireTime = data.Credentials.Expiration; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
getCredentialsForIdentity: function getCredentialsForIdentity(callback) { |
|
var self = this; |
|
self.cognito.getCredentialsForIdentity(function(err, data) { |
|
if (!err) { |
|
self.cacheId(data); |
|
self.data = data; |
|
self.loadCredentials(self.data, self); |
|
} else { |
|
self.clearIdOnNotAuthorized(err); |
|
} |
|
callback(err); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
getCredentialsFromSTS: function getCredentialsFromSTS(callback) { |
|
var self = this; |
|
self.cognito.getOpenIdToken(function(err, data) { |
|
if (!err) { |
|
self.cacheId(data); |
|
self.params.WebIdentityToken = data.Token; |
|
self.webIdentityCredentials.refresh(function(webErr) { |
|
if (!webErr) { |
|
self.data = self.webIdentityCredentials.data; |
|
self.sts.credentialsFrom(self.data, self); |
|
} |
|
callback(webErr); |
|
}); |
|
} else { |
|
self.clearIdOnNotAuthorized(err); |
|
callback(err); |
|
} |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
loadCachedId: function loadCachedId() { |
|
var self = this; |
|
|
|
// in the browser we source default IdentityId from localStorage |
|
if (AWS.util.isBrowser() && !self.params.IdentityId) { |
|
var id = self.getStorage('id'); |
|
if (id && self.params.Logins) { |
|
var actualProviders = Object.keys(self.params.Logins); |
|
var cachedProviders = |
|
(self.getStorage('providers') || '').split(','); |
|
|
|
// only load ID if at least one provider used this ID before |
|
var intersect = cachedProviders.filter(function(n) { |
|
return actualProviders.indexOf(n) !== -1; |
|
}); |
|
if (intersect.length !== 0) { |
|
self.params.IdentityId = id; |
|
} |
|
} else if (id) { |
|
self.params.IdentityId = id; |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
createClients: function() { |
|
this.webIdentityCredentials = this.webIdentityCredentials || |
|
new AWS.WebIdentityCredentials(this.params); |
|
this.cognito = this.cognito || |
|
new CognitoIdentity({params: this.params}); |
|
this.sts = this.sts || new STS(); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
cacheId: function cacheId(data) { |
|
this.identityId = data.IdentityId; |
|
this.params.IdentityId = this.identityId; |
|
|
|
// cache this IdentityId in browser localStorage if possible |
|
if (AWS.util.isBrowser()) { |
|
this.setStorage('id', data.IdentityId); |
|
|
|
if (this.params.Logins) { |
|
this.setStorage('providers', Object.keys(this.params.Logins).join(',')); |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
getStorage: function getStorage(key) { |
|
return this.storage[this.localStorageKey[key] + this.params.IdentityPoolId + (this.params.LoginId || '')]; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
setStorage: function setStorage(key, val) { |
|
try { |
|
this.storage[this.localStorageKey[key] + this.params.IdentityPoolId + (this.params.LoginId || '')] = val; |
|
} catch (_) {} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
storage: (function() { |
|
try { |
|
return AWS.util.isBrowser() && window.localStorage !== null && typeof window.localStorage === 'object' ? |
|
window.localStorage : {}; |
|
} catch (_) { |
|
return {}; |
|
} |
|
})() |
|
}); |
|
|
|
},{"../../clients/cognitoidentity":8,"../../clients/sts":10,"../core":14}],17:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
|
|
/** |
|
* Creates a credential provider chain that searches for AWS credentials |
|
* in a list of credential providers specified by the {providers} property. |
|
* |
|
* By default, the chain will use the {defaultProviders} to resolve credentials. |
|
* These providers will look in the environment using the |
|
* {AWS.EnvironmentCredentials} class with the 'AWS' and 'AMAZON' prefixes. |
|
* |
|
* ## Setting Providers |
|
* |
|
* Each provider in the {providers} list should be a function that returns |
|
* a {AWS.Credentials} object, or a hardcoded credentials object. The function |
|
* form allows for delayed execution of the credential construction. |
|
* |
|
* ## Resolving Credentials from a Chain |
|
* |
|
* Call {resolve} to return the first valid credential object that can be |
|
* loaded by the provider chain. |
|
* |
|
* For example, to resolve a chain with a custom provider that checks a file |
|
* on disk after the set of {defaultProviders}: |
|
* |
|
* ```javascript |
|
* var diskProvider = new AWS.FileSystemCredentials('./creds.json'); |
|
* var chain = new AWS.CredentialProviderChain(); |
|
* chain.providers.push(diskProvider); |
|
* chain.resolve(); |
|
* ``` |
|
* |
|
* The above code will return the `diskProvider` object if the |
|
* file contains credentials and the `defaultProviders` do not contain |
|
* any credential settings. |
|
* |
|
* @!attribute providers |
|
* @return [Array<AWS.Credentials, Function>] |
|
* a list of credentials objects or functions that return credentials |
|
* objects. If the provider is a function, the function will be |
|
* executed lazily when the provider needs to be checked for valid |
|
* credentials. By default, this object will be set to the |
|
* {defaultProviders}. |
|
* @see defaultProviders |
|
*/ |
|
AWS.CredentialProviderChain = AWS.util.inherit(AWS.Credentials, { |
|
|
|
/** |
|
* Creates a new CredentialProviderChain with a default set of providers |
|
* specified by {defaultProviders}. |
|
*/ |
|
constructor: function CredentialProviderChain(providers) { |
|
if (providers) { |
|
this.providers = providers; |
|
} else { |
|
this.providers = AWS.CredentialProviderChain.defaultProviders.slice(0); |
|
} |
|
}, |
|
|
|
/** |
|
* @!method resolvePromise() |
|
* Returns a 'thenable' promise. |
|
* Resolves the provider chain by searching for the first set of |
|
* credentials in {providers}. |
|
* |
|
* Two callbacks can be provided to the `then` method on the returned promise. |
|
* The first callback will be called if the promise is fulfilled, and the second |
|
* callback will be called if the promise is rejected. |
|
* @callback fulfilledCallback function(credentials) |
|
* Called if the promise is fulfilled and the provider resolves the chain |
|
* to a credentials object |
|
* @param credentials [AWS.Credentials] the credentials object resolved |
|
* by the provider chain. |
|
* @callback rejectedCallback function(error) |
|
* Called if the promise is rejected. |
|
* @param err [Error] the error object returned if no credentials are found. |
|
* @return [Promise] A promise that represents the state of the `resolve` method call. |
|
* @example Calling the `resolvePromise` method. |
|
* var promise = chain.resolvePromise(); |
|
* promise.then(function(credentials) { ... }, function(err) { ... }); |
|
*/ |
|
|
|
/** |
|
* Resolves the provider chain by searching for the first set of |
|
* credentials in {providers}. |
|
* |
|
* @callback callback function(err, credentials) |
|
* Called when the provider resolves the chain to a credentials object |
|
* or null if no credentials can be found. |
|
* |
|
* @param err [Error] the error object returned if no credentials are |
|
* found. |
|
* @param credentials [AWS.Credentials] the credentials object resolved |
|
* by the provider chain. |
|
* @return [AWS.CredentialProviderChain] the provider, for chaining. |
|
*/ |
|
resolve: function resolve(callback) { |
|
if (this.providers.length === 0) { |
|
callback(new Error('No providers')); |
|
return this; |
|
} |
|
|
|
var index = 0; |
|
var providers = this.providers.slice(0); |
|
|
|
function resolveNext(err, creds) { |
|
if ((!err && creds) || index === providers.length) { |
|
callback(err, creds); |
|
return; |
|
} |
|
|
|
var provider = providers[index++]; |
|
if (typeof provider === 'function') { |
|
creds = provider.call(); |
|
} else { |
|
creds = provider; |
|
} |
|
|
|
if (creds.get) { |
|
creds.get(function(getErr) { |
|
resolveNext(getErr, getErr ? null : creds); |
|
}); |
|
} else { |
|
resolveNext(null, creds); |
|
} |
|
} |
|
|
|
resolveNext(); |
|
return this; |
|
} |
|
}); |
|
|
|
/** |
|
* The default set of providers used by a vanilla CredentialProviderChain. |
|
* |
|
* In the browser: |
|
* |
|
* ```javascript |
|
* AWS.CredentialProviderChain.defaultProviders = [] |
|
* ``` |
|
* |
|
* In Node.js: |
|
* |
|
* ```javascript |
|
* AWS.CredentialProviderChain.defaultProviders = [ |
|
* function () { return new AWS.EnvironmentCredentials('AWS'); }, |
|
* function () { return new AWS.EnvironmentCredentials('AMAZON'); }, |
|
* function () { return new AWS.SharedIniFileCredentials(); }, |
|
* function () { |
|
* // if AWS_CONTAINER_CREDENTIALS_RELATIVE_URI is set |
|
* return new AWS.ECSCredentials(); |
|
* // else |
|
* return new AWS.EC2MetadataCredentials(); |
|
* } |
|
* ] |
|
* ``` |
|
*/ |
|
AWS.CredentialProviderChain.defaultProviders = []; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.CredentialProviderChain.addPromisesToClass = function addPromisesToClass(PromiseDependency) { |
|
this.prototype.resolvePromise = AWS.util.promisifyMethod('resolve', PromiseDependency); |
|
}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.CredentialProviderChain.deletePromisesFromClass = function deletePromisesFromClass() { |
|
delete this.prototype.resolvePromise; |
|
}; |
|
|
|
AWS.util.addPromises(AWS.CredentialProviderChain); |
|
|
|
},{"../core":14}],18:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var STS = require('../../clients/sts'); |
|
|
|
/** |
|
* Represents credentials retrieved from STS SAML support. |
|
* |
|
* By default this provider gets credentials using the |
|
* {AWS.STS.assumeRoleWithSAML} service operation. This operation |
|
* requires a `RoleArn` containing the ARN of the IAM trust policy for the |
|
* application for which credentials will be given, as well as a `PrincipalArn` |
|
* representing the ARN for the SAML identity provider. In addition, the |
|
* `SAMLAssertion` must be set to the token provided by the identity |
|
* provider. See {constructor} for an example on creating a credentials |
|
* object with proper `RoleArn`, `PrincipalArn`, and `SAMLAssertion` values. |
|
* |
|
* ## Refreshing Credentials from Identity Service |
|
* |
|
* In addition to AWS credentials expiring after a given amount of time, the |
|
* login token from the identity provider will also expire. Once this token |
|
* expires, it will not be usable to refresh AWS credentials, and another |
|
* token will be needed. The SDK does not manage refreshing of the token value, |
|
* but this can be done through a "refresh token" supported by most identity |
|
* providers. Consult the documentation for the identity provider for refreshing |
|
* tokens. Once the refreshed token is acquired, you should make sure to update |
|
* this new token in the credentials object's {params} property. The following |
|
* code will update the SAMLAssertion, assuming you have retrieved an updated |
|
* token from the identity provider: |
|
* |
|
* ```javascript |
|
* AWS.config.credentials.params.SAMLAssertion = updatedToken; |
|
* ``` |
|
* |
|
* Future calls to `credentials.refresh()` will now use the new token. |
|
* |
|
* @!attribute params |
|
* @return [map] the map of params passed to |
|
* {AWS.STS.assumeRoleWithSAML}. To update the token, set the |
|
* `params.SAMLAssertion` property. |
|
*/ |
|
AWS.SAMLCredentials = AWS.util.inherit(AWS.Credentials, { |
|
/** |
|
* Creates a new credentials object. |
|
* @param (see AWS.STS.assumeRoleWithSAML) |
|
* @example Creating a new credentials object |
|
* AWS.config.credentials = new AWS.SAMLCredentials({ |
|
* RoleArn: 'arn:aws:iam::1234567890:role/SAMLRole', |
|
* PrincipalArn: 'arn:aws:iam::1234567890:role/SAMLPrincipal', |
|
* SAMLAssertion: 'base64-token', // base64-encoded token from IdP |
|
* }); |
|
* @see AWS.STS.assumeRoleWithSAML |
|
*/ |
|
constructor: function SAMLCredentials(params) { |
|
AWS.Credentials.call(this); |
|
this.expired = true; |
|
this.params = params; |
|
}, |
|
|
|
/** |
|
* Refreshes credentials using {AWS.STS.assumeRoleWithSAML} |
|
* |
|
* @callback callback function(err) |
|
* Called when the STS service responds (or fails). When |
|
* this callback is called with no error, it means that the credentials |
|
* information has been loaded into the object (as the `accessKeyId`, |
|
* `secretAccessKey`, and `sessionToken` properties). |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @see get |
|
*/ |
|
refresh: function refresh(callback) { |
|
var self = this; |
|
self.createClients(); |
|
if (!callback) callback = function(err) { if (err) throw err; }; |
|
|
|
self.service.assumeRoleWithSAML(function (err, data) { |
|
if (!err) { |
|
self.service.credentialsFrom(data, self); |
|
} |
|
callback(err); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
createClients: function() { |
|
this.service = this.service || new STS({params: this.params}); |
|
} |
|
|
|
}); |
|
|
|
},{"../../clients/sts":10,"../core":14}],19:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var STS = require('../../clients/sts'); |
|
|
|
/** |
|
* Represents temporary credentials retrieved from {AWS.STS}. Without any |
|
* extra parameters, credentials will be fetched from the |
|
* {AWS.STS.getSessionToken} operation. If an IAM role is provided, the |
|
* {AWS.STS.assumeRole} operation will be used to fetch credentials for the |
|
* role instead. |
|
* |
|
* To setup temporary credentials, configure a set of master credentials |
|
* using the standard credentials providers (environment, EC2 instance metadata, |
|
* or from the filesystem), then set the global credentials to a new |
|
* temporary credentials object: |
|
* |
|
* ```javascript |
|
* // Note that environment credentials are loaded by default, |
|
* // the following line is shown for clarity: |
|
* AWS.config.credentials = new AWS.EnvironmentCredentials('AWS'); |
|
* |
|
* // Now set temporary credentials seeded from the master credentials |
|
* AWS.config.credentials = new AWS.TemporaryCredentials(); |
|
* |
|
* // subsequent requests will now use temporary credentials from AWS STS. |
|
* new AWS.S3().listBucket(function(err, data) { ... }); |
|
* ``` |
|
* |
|
* @!attribute masterCredentials |
|
* @return [AWS.Credentials] the master (non-temporary) credentials used to |
|
* get and refresh temporary credentials from AWS STS. |
|
* @note (see constructor) |
|
*/ |
|
AWS.TemporaryCredentials = AWS.util.inherit(AWS.Credentials, { |
|
/** |
|
* Creates a new temporary credentials object. |
|
* |
|
* @note In order to create temporary credentials, you first need to have |
|
* "master" credentials configured in {AWS.Config.credentials}. These |
|
* master credentials are necessary to retrieve the temporary credentials, |
|
* as well as refresh the credentials when they expire. |
|
* @param params [map] a map of options that are passed to the |
|
* {AWS.STS.assumeRole} or {AWS.STS.getSessionToken} operations. |
|
* If a `RoleArn` parameter is passed in, credentials will be based on the |
|
* IAM role. |
|
* @example Creating a new credentials object for generic temporary credentials |
|
* AWS.config.credentials = new AWS.TemporaryCredentials(); |
|
* @example Creating a new credentials object for an IAM role |
|
* AWS.config.credentials = new AWS.TemporaryCredentials({ |
|
* RoleArn: 'arn:aws:iam::1234567890:role/TemporaryCredentials', |
|
* }); |
|
* @see AWS.STS.assumeRole |
|
* @see AWS.STS.getSessionToken |
|
*/ |
|
constructor: function TemporaryCredentials(params) { |
|
AWS.Credentials.call(this); |
|
this.loadMasterCredentials(); |
|
this.expired = true; |
|
|
|
this.params = params || {}; |
|
if (this.params.RoleArn) { |
|
this.params.RoleSessionName = |
|
this.params.RoleSessionName || 'temporary-credentials'; |
|
} |
|
}, |
|
|
|
/** |
|
* Refreshes credentials using {AWS.STS.assumeRole} or |
|
* {AWS.STS.getSessionToken}, depending on whether an IAM role ARN was passed |
|
* to the credentials {constructor}. |
|
* |
|
* @callback callback function(err) |
|
* Called when the STS service responds (or fails). When |
|
* this callback is called with no error, it means that the credentials |
|
* information has been loaded into the object (as the `accessKeyId`, |
|
* `secretAccessKey`, and `sessionToken` properties). |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @see get |
|
*/ |
|
refresh: function refresh(callback) { |
|
var self = this; |
|
self.createClients(); |
|
if (!callback) callback = function(err) { if (err) throw err; }; |
|
|
|
self.service.config.credentials = self.masterCredentials; |
|
var operation = self.params.RoleArn ? |
|
self.service.assumeRole : self.service.getSessionToken; |
|
operation.call(self.service, function (err, data) { |
|
if (!err) { |
|
self.service.credentialsFrom(data, self); |
|
} |
|
callback(err); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
loadMasterCredentials: function loadMasterCredentials() { |
|
this.masterCredentials = AWS.config.credentials; |
|
while (this.masterCredentials.masterCredentials) { |
|
this.masterCredentials = this.masterCredentials.masterCredentials; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
createClients: function() { |
|
this.service = this.service || new STS({params: this.params}); |
|
} |
|
|
|
}); |
|
|
|
},{"../../clients/sts":10,"../core":14}],20:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var STS = require('../../clients/sts'); |
|
|
|
/** |
|
* Represents credentials retrieved from STS Web Identity Federation support. |
|
* |
|
* By default this provider gets credentials using the |
|
* {AWS.STS.assumeRoleWithWebIdentity} service operation. This operation |
|
* requires a `RoleArn` containing the ARN of the IAM trust policy for the |
|
* application for which credentials will be given. In addition, the |
|
* `WebIdentityToken` must be set to the token provided by the identity |
|
* provider. See {constructor} for an example on creating a credentials |
|
* object with proper `RoleArn` and `WebIdentityToken` values. |
|
* |
|
* ## Refreshing Credentials from Identity Service |
|
* |
|
* In addition to AWS credentials expiring after a given amount of time, the |
|
* login token from the identity provider will also expire. Once this token |
|
* expires, it will not be usable to refresh AWS credentials, and another |
|
* token will be needed. The SDK does not manage refreshing of the token value, |
|
* but this can be done through a "refresh token" supported by most identity |
|
* providers. Consult the documentation for the identity provider for refreshing |
|
* tokens. Once the refreshed token is acquired, you should make sure to update |
|
* this new token in the credentials object's {params} property. The following |
|
* code will update the WebIdentityToken, assuming you have retrieved an updated |
|
* token from the identity provider: |
|
* |
|
* ```javascript |
|
* AWS.config.credentials.params.WebIdentityToken = updatedToken; |
|
* ``` |
|
* |
|
* Future calls to `credentials.refresh()` will now use the new token. |
|
* |
|
* @!attribute params |
|
* @return [map] the map of params passed to |
|
* {AWS.STS.assumeRoleWithWebIdentity}. To update the token, set the |
|
* `params.WebIdentityToken` property. |
|
* @!attribute data |
|
* @return [map] the raw data response from the call to |
|
* {AWS.STS.assumeRoleWithWebIdentity}. Use this if you want to get |
|
* access to other properties from the response. |
|
*/ |
|
AWS.WebIdentityCredentials = AWS.util.inherit(AWS.Credentials, { |
|
/** |
|
* Creates a new credentials object. |
|
* @param (see AWS.STS.assumeRoleWithWebIdentity) |
|
* @example Creating a new credentials object |
|
* AWS.config.credentials = new AWS.WebIdentityCredentials({ |
|
* RoleArn: 'arn:aws:iam::1234567890:role/WebIdentity', |
|
* WebIdentityToken: 'ABCDEFGHIJKLMNOP', // token from identity service |
|
* RoleSessionName: 'web' // optional name, defaults to web-identity |
|
* }); |
|
* @see AWS.STS.assumeRoleWithWebIdentity |
|
*/ |
|
constructor: function WebIdentityCredentials(params) { |
|
AWS.Credentials.call(this); |
|
this.expired = true; |
|
this.params = params; |
|
this.params.RoleSessionName = this.params.RoleSessionName || 'web-identity'; |
|
this.data = null; |
|
}, |
|
|
|
/** |
|
* Refreshes credentials using {AWS.STS.assumeRoleWithWebIdentity} |
|
* |
|
* @callback callback function(err) |
|
* Called when the STS service responds (or fails). When |
|
* this callback is called with no error, it means that the credentials |
|
* information has been loaded into the object (as the `accessKeyId`, |
|
* `secretAccessKey`, and `sessionToken` properties). |
|
* @param err [Error] if an error occurred, this value will be filled |
|
* @see get |
|
*/ |
|
refresh: function refresh(callback) { |
|
var self = this; |
|
self.createClients(); |
|
if (!callback) callback = function(err) { if (err) throw err; }; |
|
|
|
self.service.assumeRoleWithWebIdentity(function (err, data) { |
|
self.data = null; |
|
if (!err) { |
|
self.data = data; |
|
self.service.credentialsFrom(data, self); |
|
} |
|
callback(err); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
createClients: function() { |
|
this.service = this.service || new STS({params: this.params}); |
|
} |
|
|
|
}); |
|
|
|
},{"../../clients/sts":10,"../core":14}],21:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
var SequentialExecutor = require('./sequential_executor'); |
|
|
|
/** |
|
* The namespace used to register global event listeners for request building |
|
* and sending. |
|
*/ |
|
AWS.EventListeners = { |
|
/** |
|
* @!attribute VALIDATE_CREDENTIALS |
|
* A request listener that validates whether the request is being |
|
* sent with credentials. |
|
* Handles the {AWS.Request~validate 'validate' Request event} |
|
* @example Sending a request without validating credentials |
|
* var listener = AWS.EventListeners.Core.VALIDATE_CREDENTIALS; |
|
* request.removeListener('validate', listener); |
|
* @readonly |
|
* @return [Function] |
|
* @!attribute VALIDATE_REGION |
|
* A request listener that validates whether the region is set |
|
* for a request. |
|
* Handles the {AWS.Request~validate 'validate' Request event} |
|
* @example Sending a request without validating region configuration |
|
* var listener = AWS.EventListeners.Core.VALIDATE_REGION; |
|
* request.removeListener('validate', listener); |
|
* @readonly |
|
* @return [Function] |
|
* @!attribute VALIDATE_PARAMETERS |
|
* A request listener that validates input parameters in a request. |
|
* Handles the {AWS.Request~validate 'validate' Request event} |
|
* @example Sending a request without validating parameters |
|
* var listener = AWS.EventListeners.Core.VALIDATE_PARAMETERS; |
|
* request.removeListener('validate', listener); |
|
* @example Disable parameter validation globally |
|
* AWS.EventListeners.Core.removeListener('validate', |
|
* AWS.EventListeners.Core.VALIDATE_REGION); |
|
* @readonly |
|
* @return [Function] |
|
* @!attribute SEND |
|
* A request listener that initiates the HTTP connection for a |
|
* request being sent. Handles the {AWS.Request~send 'send' Request event} |
|
* @example Replacing the HTTP handler |
|
* var listener = AWS.EventListeners.Core.SEND; |
|
* request.removeListener('send', listener); |
|
* request.on('send', function(response) { |
|
* customHandler.send(response); |
|
* }); |
|
* @return [Function] |
|
* @readonly |
|
* @!attribute HTTP_DATA |
|
* A request listener that reads data from the HTTP connection in order |
|
* to build the response data. |
|
* Handles the {AWS.Request~httpData 'httpData' Request event}. |
|
* Remove this handler if you are overriding the 'httpData' event and |
|
* do not want extra data processing and buffering overhead. |
|
* @example Disabling default data processing |
|
* var listener = AWS.EventListeners.Core.HTTP_DATA; |
|
* request.removeListener('httpData', listener); |
|
* @return [Function] |
|
* @readonly |
|
*/ |
|
Core: {} /* doc hack */ |
|
}; |
|
|
|
AWS.EventListeners = { |
|
Core: new SequentialExecutor().addNamedListeners(function(add, addAsync) { |
|
addAsync('VALIDATE_CREDENTIALS', 'validate', |
|
function VALIDATE_CREDENTIALS(req, done) { |
|
if (!req.service.api.signatureVersion) return done(); // none |
|
req.service.config.getCredentials(function(err) { |
|
if (err) { |
|
req.response.error = AWS.util.error(err, |
|
{code: 'CredentialsError', message: 'Missing credentials in config'}); |
|
} |
|
done(); |
|
}); |
|
}); |
|
|
|
add('VALIDATE_REGION', 'validate', function VALIDATE_REGION(req) { |
|
if (!req.service.config.region && !req.service.isGlobalEndpoint) { |
|
req.response.error = AWS.util.error(new Error(), |
|
{code: 'ConfigError', message: 'Missing region in config'}); |
|
} |
|
}); |
|
|
|
add('VALIDATE_PARAMETERS', 'validate', function VALIDATE_PARAMETERS(req) { |
|
var rules = req.service.api.operations[req.operation].input; |
|
var validation = req.service.config.paramValidation; |
|
new AWS.ParamValidator(validation).validate(rules, req.params); |
|
}); |
|
|
|
addAsync('COMPUTE_SHA256', 'afterBuild', function COMPUTE_SHA256(req, done) { |
|
req.haltHandlersOnError(); |
|
if (!req.service.api.signatureVersion) return done(); // none |
|
if (req.service.getSignerClass(req) === AWS.Signers.V4) { |
|
var body = req.httpRequest.body || ''; |
|
AWS.util.computeSha256(body, function(err, sha) { |
|
if (err) { |
|
done(err); |
|
} |
|
else { |
|
req.httpRequest.headers['X-Amz-Content-Sha256'] = sha; |
|
done(); |
|
} |
|
}); |
|
} else { |
|
done(); |
|
} |
|
}); |
|
|
|
add('SET_CONTENT_LENGTH', 'afterBuild', function SET_CONTENT_LENGTH(req) { |
|
if (req.httpRequest.headers['Content-Length'] === undefined) { |
|
var length = AWS.util.string.byteLength(req.httpRequest.body); |
|
req.httpRequest.headers['Content-Length'] = length; |
|
} |
|
}); |
|
|
|
add('SET_HTTP_HOST', 'afterBuild', function SET_HTTP_HOST(req) { |
|
req.httpRequest.headers['Host'] = req.httpRequest.endpoint.host; |
|
}); |
|
|
|
add('RESTART', 'restart', function RESTART() { |
|
var err = this.response.error; |
|
if (!err || !err.retryable) return; |
|
|
|
this.httpRequest = new AWS.HttpRequest( |
|
this.service.endpoint, |
|
this.service.region |
|
); |
|
|
|
if (this.response.retryCount < this.service.config.maxRetries) { |
|
this.response.retryCount++; |
|
} else { |
|
this.response.error = null; |
|
} |
|
}); |
|
|
|
addAsync('SIGN', 'sign', function SIGN(req, done) { |
|
var service = req.service; |
|
if (!service.api.signatureVersion) return done(); // none |
|
|
|
service.config.getCredentials(function (err, credentials) { |
|
if (err) { |
|
req.response.error = err; |
|
return done(); |
|
} |
|
|
|
try { |
|
var date = AWS.util.date.getDate(); |
|
var SignerClass = service.getSignerClass(req); |
|
var signer = new SignerClass(req.httpRequest, |
|
service.api.signingName || service.api.endpointPrefix, |
|
service.config.signatureCache); |
|
signer.setServiceClientId(service._clientId); |
|
|
|
// clear old authorization headers |
|
delete req.httpRequest.headers['Authorization']; |
|
delete req.httpRequest.headers['Date']; |
|
delete req.httpRequest.headers['X-Amz-Date']; |
|
|
|
// add new authorization |
|
signer.addAuthorization(credentials, date); |
|
req.signedAt = date; |
|
} catch (e) { |
|
req.response.error = e; |
|
} |
|
done(); |
|
}); |
|
}); |
|
|
|
add('VALIDATE_RESPONSE', 'validateResponse', function VALIDATE_RESPONSE(resp) { |
|
if (this.service.successfulResponse(resp, this)) { |
|
resp.data = {}; |
|
resp.error = null; |
|
} else { |
|
resp.data = null; |
|
resp.error = AWS.util.error(new Error(), |
|
{code: 'UnknownError', message: 'An unknown error occurred.'}); |
|
} |
|
}); |
|
|
|
addAsync('SEND', 'send', function SEND(resp, done) { |
|
resp.httpResponse._abortCallback = done; |
|
resp.error = null; |
|
resp.data = null; |
|
|
|
function callback(httpResp) { |
|
resp.httpResponse.stream = httpResp; |
|
|
|
httpResp.on('headers', function onHeaders(statusCode, headers) { |
|
resp.request.emit('httpHeaders', [statusCode, headers, resp]); |
|
|
|
if (!resp.httpResponse.streaming) { |
|
if (AWS.HttpClient.streamsApiVersion === 2) { // streams2 API check |
|
httpResp.on('readable', function onReadable() { |
|
var data = httpResp.read(); |
|
if (data !== null) { |
|
resp.request.emit('httpData', [data, resp]); |
|
} |
|
}); |
|
} else { // legacy streams API |
|
httpResp.on('data', function onData(data) { |
|
resp.request.emit('httpData', [data, resp]); |
|
}); |
|
} |
|
} |
|
}); |
|
|
|
httpResp.on('end', function onEnd() { |
|
resp.request.emit('httpDone'); |
|
done(); |
|
}); |
|
} |
|
|
|
function progress(httpResp) { |
|
httpResp.on('sendProgress', function onSendProgress(value) { |
|
resp.request.emit('httpUploadProgress', [value, resp]); |
|
}); |
|
|
|
httpResp.on('receiveProgress', function onReceiveProgress(value) { |
|
resp.request.emit('httpDownloadProgress', [value, resp]); |
|
}); |
|
} |
|
|
|
function error(err) { |
|
resp.error = AWS.util.error(err, { |
|
code: 'NetworkingError', |
|
region: resp.request.httpRequest.region, |
|
hostname: resp.request.httpRequest.endpoint.hostname, |
|
retryable: true |
|
}); |
|
resp.request.emit('httpError', [resp.error, resp], function() { |
|
done(); |
|
}); |
|
} |
|
|
|
function executeSend() { |
|
var http = AWS.HttpClient.getInstance(); |
|
var httpOptions = resp.request.service.config.httpOptions || {}; |
|
try { |
|
var stream = http.handleRequest(resp.request.httpRequest, httpOptions, |
|
callback, error); |
|
progress(stream); |
|
} catch (err) { |
|
error(err); |
|
} |
|
} |
|
|
|
var timeDiff = (AWS.util.date.getDate() - this.signedAt) / 1000; |
|
if (timeDiff >= 60 * 10) { // if we signed 10min ago, re-sign |
|
this.emit('sign', [this], function(err) { |
|
if (err) done(err); |
|
else executeSend(); |
|
}); |
|
} else { |
|
executeSend(); |
|
} |
|
}); |
|
|
|
add('HTTP_HEADERS', 'httpHeaders', |
|
function HTTP_HEADERS(statusCode, headers, resp) { |
|
resp.httpResponse.statusCode = statusCode; |
|
resp.httpResponse.headers = headers; |
|
resp.httpResponse.body = new AWS.util.Buffer(''); |
|
resp.httpResponse.buffers = []; |
|
resp.httpResponse.numBytes = 0; |
|
var dateHeader = headers.date || headers.Date; |
|
if (dateHeader) { |
|
var serverTime = Date.parse(dateHeader); |
|
if (resp.request.service.config.correctClockSkew |
|
&& AWS.util.isClockSkewed(serverTime)) { |
|
AWS.util.applyClockOffset(serverTime); |
|
} |
|
} |
|
}); |
|
|
|
add('HTTP_DATA', 'httpData', function HTTP_DATA(chunk, resp) { |
|
if (chunk) { |
|
if (AWS.util.isNode()) { |
|
resp.httpResponse.numBytes += chunk.length; |
|
|
|
var total = resp.httpResponse.headers['content-length']; |
|
var progress = { loaded: resp.httpResponse.numBytes, total: total }; |
|
resp.request.emit('httpDownloadProgress', [progress, resp]); |
|
} |
|
|
|
resp.httpResponse.buffers.push(new AWS.util.Buffer(chunk)); |
|
} |
|
}); |
|
|
|
add('HTTP_DONE', 'httpDone', function HTTP_DONE(resp) { |
|
// convert buffers array into single buffer |
|
if (resp.httpResponse.buffers && resp.httpResponse.buffers.length > 0) { |
|
var body = AWS.util.buffer.concat(resp.httpResponse.buffers); |
|
resp.httpResponse.body = body; |
|
} |
|
delete resp.httpResponse.numBytes; |
|
delete resp.httpResponse.buffers; |
|
}); |
|
|
|
add('FINALIZE_ERROR', 'retry', function FINALIZE_ERROR(resp) { |
|
if (resp.httpResponse.statusCode) { |
|
resp.error.statusCode = resp.httpResponse.statusCode; |
|
if (resp.error.retryable === undefined) { |
|
resp.error.retryable = this.service.retryableError(resp.error, this); |
|
} |
|
} |
|
}); |
|
|
|
add('INVALIDATE_CREDENTIALS', 'retry', function INVALIDATE_CREDENTIALS(resp) { |
|
if (!resp.error) return; |
|
switch (resp.error.code) { |
|
case 'RequestExpired': // EC2 only |
|
case 'ExpiredTokenException': |
|
case 'ExpiredToken': |
|
resp.error.retryable = true; |
|
resp.request.service.config.credentials.expired = true; |
|
} |
|
}); |
|
|
|
add('EXPIRED_SIGNATURE', 'retry', function EXPIRED_SIGNATURE(resp) { |
|
var err = resp.error; |
|
if (!err) return; |
|
if (typeof err.code === 'string' && typeof err.message === 'string') { |
|
if (err.code.match(/Signature/) && err.message.match(/expired/)) { |
|
resp.error.retryable = true; |
|
} |
|
} |
|
}); |
|
|
|
add('CLOCK_SKEWED', 'retry', function CLOCK_SKEWED(resp) { |
|
if (!resp.error) return; |
|
if (this.service.clockSkewError(resp.error) |
|
&& this.service.config.correctClockSkew |
|
&& AWS.config.isClockSkewed) { |
|
resp.error.retryable = true; |
|
} |
|
}); |
|
|
|
add('REDIRECT', 'retry', function REDIRECT(resp) { |
|
if (resp.error && resp.error.statusCode >= 300 && |
|
resp.error.statusCode < 400 && resp.httpResponse.headers['location']) { |
|
this.httpRequest.endpoint = |
|
new AWS.Endpoint(resp.httpResponse.headers['location']); |
|
this.httpRequest.headers['Host'] = this.httpRequest.endpoint.host; |
|
resp.error.redirect = true; |
|
resp.error.retryable = true; |
|
} |
|
}); |
|
|
|
add('RETRY_CHECK', 'retry', function RETRY_CHECK(resp) { |
|
if (resp.error) { |
|
if (resp.error.redirect && resp.redirectCount < resp.maxRedirects) { |
|
resp.error.retryDelay = 0; |
|
} else if (resp.retryCount < resp.maxRetries) { |
|
resp.error.retryDelay = this.service.retryDelays(resp.retryCount) || 0; |
|
} |
|
} |
|
}); |
|
|
|
addAsync('RESET_RETRY_STATE', 'afterRetry', function RESET_RETRY_STATE(resp, done) { |
|
var delay, willRetry = false; |
|
|
|
if (resp.error) { |
|
delay = resp.error.retryDelay || 0; |
|
if (resp.error.retryable && resp.retryCount < resp.maxRetries) { |
|
resp.retryCount++; |
|
willRetry = true; |
|
} else if (resp.error.redirect && resp.redirectCount < resp.maxRedirects) { |
|
resp.redirectCount++; |
|
willRetry = true; |
|
} |
|
} |
|
|
|
if (willRetry) { |
|
resp.error = null; |
|
setTimeout(done, delay); |
|
} else { |
|
done(); |
|
} |
|
}); |
|
}), |
|
|
|
CorePost: new SequentialExecutor().addNamedListeners(function(add) { |
|
add('EXTRACT_REQUEST_ID', 'extractData', AWS.util.extractRequestId); |
|
add('EXTRACT_REQUEST_ID', 'extractError', AWS.util.extractRequestId); |
|
|
|
add('ENOTFOUND_ERROR', 'httpError', function ENOTFOUND_ERROR(err) { |
|
if (err.code === 'NetworkingError' && err.errno === 'ENOTFOUND') { |
|
var message = 'Inaccessible host: `' + err.hostname + |
|
'\'. This service may not be available in the `' + err.region + |
|
'\' region.'; |
|
this.response.error = AWS.util.error(new Error(message), { |
|
code: 'UnknownEndpoint', |
|
region: err.region, |
|
hostname: err.hostname, |
|
retryable: true, |
|
originalError: err |
|
}); |
|
} |
|
}); |
|
}), |
|
|
|
Logger: new SequentialExecutor().addNamedListeners(function(add) { |
|
add('LOG_REQUEST', 'complete', function LOG_REQUEST(resp) { |
|
var req = resp.request; |
|
var logger = req.service.config.logger; |
|
if (!logger) return; |
|
|
|
function buildMessage() { |
|
var time = AWS.util.date.getDate().getTime(); |
|
var delta = (time - req.startTime.getTime()) / 1000; |
|
var ansi = logger.isTTY ? true : false; |
|
var status = resp.httpResponse.statusCode; |
|
var params = require('util').inspect(req.params, true, null); |
|
|
|
var message = ''; |
|
if (ansi) message += '\x1B[33m'; |
|
message += '[AWS ' + req.service.serviceIdentifier + ' ' + status; |
|
message += ' ' + delta.toString() + 's ' + resp.retryCount + ' retries]'; |
|
if (ansi) message += '\x1B[0;1m'; |
|
message += ' ' + AWS.util.string.lowerFirst(req.operation); |
|
message += '(' + params + ')'; |
|
if (ansi) message += '\x1B[0m'; |
|
return message; |
|
} |
|
|
|
var line = buildMessage(); |
|
if (typeof logger.log === 'function') { |
|
logger.log(line); |
|
} else if (typeof logger.write === 'function') { |
|
logger.write(line + '\n'); |
|
} |
|
}); |
|
}), |
|
|
|
Json: new SequentialExecutor().addNamedListeners(function(add) { |
|
var svc = require('./protocol/json'); |
|
add('BUILD', 'build', svc.buildRequest); |
|
add('EXTRACT_DATA', 'extractData', svc.extractData); |
|
add('EXTRACT_ERROR', 'extractError', svc.extractError); |
|
}), |
|
|
|
Rest: new SequentialExecutor().addNamedListeners(function(add) { |
|
var svc = require('./protocol/rest'); |
|
add('BUILD', 'build', svc.buildRequest); |
|
add('EXTRACT_DATA', 'extractData', svc.extractData); |
|
add('EXTRACT_ERROR', 'extractError', svc.extractError); |
|
}), |
|
|
|
RestJson: new SequentialExecutor().addNamedListeners(function(add) { |
|
var svc = require('./protocol/rest_json'); |
|
add('BUILD', 'build', svc.buildRequest); |
|
add('EXTRACT_DATA', 'extractData', svc.extractData); |
|
add('EXTRACT_ERROR', 'extractError', svc.extractError); |
|
}), |
|
|
|
RestXml: new SequentialExecutor().addNamedListeners(function(add) { |
|
var svc = require('./protocol/rest_xml'); |
|
add('BUILD', 'build', svc.buildRequest); |
|
add('EXTRACT_DATA', 'extractData', svc.extractData); |
|
add('EXTRACT_ERROR', 'extractError', svc.extractError); |
|
}), |
|
|
|
Query: new SequentialExecutor().addNamedListeners(function(add) { |
|
var svc = require('./protocol/query'); |
|
add('BUILD', 'build', svc.buildRequest); |
|
add('EXTRACT_DATA', 'extractData', svc.extractData); |
|
add('EXTRACT_ERROR', 'extractError', svc.extractError); |
|
}) |
|
}; |
|
|
|
},{"./core":14,"./protocol/json":36,"./protocol/query":37,"./protocol/rest":38,"./protocol/rest_json":39,"./protocol/rest_xml":40,"./sequential_executor":48,"util":158}],22:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* The endpoint that a service will talk to, for example, |
|
* `'https://ec2.ap-southeast-1.amazonaws.com'`. If |
|
* you need to override an endpoint for a service, you can |
|
* set the endpoint on a service by passing the endpoint |
|
* object with the `endpoint` option key: |
|
* |
|
* ```javascript |
|
* var ep = new AWS.Endpoint('awsproxy.example.com'); |
|
* var s3 = new AWS.S3({endpoint: ep}); |
|
* s3.service.endpoint.hostname == 'awsproxy.example.com' |
|
* ``` |
|
* |
|
* Note that if you do not specify a protocol, the protocol will |
|
* be selected based on your current {AWS.config} configuration. |
|
* |
|
* @!attribute protocol |
|
* @return [String] the protocol (http or https) of the endpoint |
|
* URL |
|
* @!attribute hostname |
|
* @return [String] the host portion of the endpoint, e.g., |
|
* example.com |
|
* @!attribute host |
|
* @return [String] the host portion of the endpoint including |
|
* the port, e.g., example.com:80 |
|
* @!attribute port |
|
* @return [Integer] the port of the endpoint |
|
* @!attribute href |
|
* @return [String] the full URL of the endpoint |
|
*/ |
|
AWS.Endpoint = inherit({ |
|
|
|
/** |
|
* @overload Endpoint(endpoint) |
|
* Constructs a new endpoint given an endpoint URL. If the |
|
* URL omits a protocol (http or https), the default protocol |
|
* set in the global {AWS.config} will be used. |
|
* @param endpoint [String] the URL to construct an endpoint from |
|
*/ |
|
constructor: function Endpoint(endpoint, config) { |
|
AWS.util.hideProperties(this, ['slashes', 'auth', 'hash', 'search', 'query']); |
|
|
|
if (typeof endpoint === 'undefined' || endpoint === null) { |
|
throw new Error('Invalid endpoint: ' + endpoint); |
|
} else if (typeof endpoint !== 'string') { |
|
return AWS.util.copy(endpoint); |
|
} |
|
|
|
if (!endpoint.match(/^http/)) { |
|
var useSSL = config && config.sslEnabled !== undefined ? |
|
config.sslEnabled : AWS.config.sslEnabled; |
|
endpoint = (useSSL ? 'https' : 'http') + '://' + endpoint; |
|
} |
|
|
|
AWS.util.update(this, AWS.util.urlParse(endpoint)); |
|
|
|
// Ensure the port property is set as an integer |
|
if (this.port) { |
|
this.port = parseInt(this.port, 10); |
|
} else { |
|
this.port = this.protocol === 'https:' ? 443 : 80; |
|
} |
|
} |
|
|
|
}); |
|
|
|
/** |
|
* The low level HTTP request object, encapsulating all HTTP header |
|
* and body data sent by a service request. |
|
* |
|
* @!attribute method |
|
* @return [String] the HTTP method of the request |
|
* @!attribute path |
|
* @return [String] the path portion of the URI, e.g., |
|
* "/list/?start=5&num=10" |
|
* @!attribute headers |
|
* @return [map<String,String>] |
|
* a map of header keys and their respective values |
|
* @!attribute body |
|
* @return [String] the request body payload |
|
* @!attribute endpoint |
|
* @return [AWS.Endpoint] the endpoint for the request |
|
* @!attribute region |
|
* @api private |
|
* @return [String] the region, for signing purposes only. |
|
*/ |
|
AWS.HttpRequest = inherit({ |
|
|
|
/** |
|
* @api private |
|
*/ |
|
constructor: function HttpRequest(endpoint, region, customUserAgent) { |
|
endpoint = new AWS.Endpoint(endpoint); |
|
this.method = 'POST'; |
|
this.path = endpoint.path || '/'; |
|
this.headers = {}; |
|
this.body = ''; |
|
this.endpoint = endpoint; |
|
this.region = region; |
|
this.setUserAgent(customUserAgent); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
setUserAgent: function setUserAgent(customUserAgent) { |
|
var prefix = AWS.util.isBrowser() ? 'X-Amz-' : ''; |
|
var customSuffix = ''; |
|
if (typeof customUserAgent === 'string' && customUserAgent) { |
|
customSuffix += ' ' + customUserAgent; |
|
} |
|
this.headers[prefix + 'User-Agent'] = AWS.util.userAgent() + customSuffix; |
|
}, |
|
|
|
/** |
|
* @return [String] the part of the {path} excluding the |
|
* query string |
|
*/ |
|
pathname: function pathname() { |
|
return this.path.split('?', 1)[0]; |
|
}, |
|
|
|
/** |
|
* @return [String] the query string portion of the {path} |
|
*/ |
|
search: function search() { |
|
var query = this.path.split('?', 2)[1]; |
|
if (query) { |
|
query = AWS.util.queryStringParse(query); |
|
return AWS.util.queryParamsToString(query); |
|
} |
|
return ''; |
|
} |
|
|
|
}); |
|
|
|
/** |
|
* The low level HTTP response object, encapsulating all HTTP header |
|
* and body data returned from the request. |
|
* |
|
* @!attribute statusCode |
|
* @return [Integer] the HTTP status code of the response (e.g., 200, 404) |
|
* @!attribute headers |
|
* @return [map<String,String>] |
|
* a map of response header keys and their respective values |
|
* @!attribute body |
|
* @return [String] the response body payload |
|
* @!attribute [r] streaming |
|
* @return [Boolean] whether this response is being streamed at a low-level. |
|
* Defaults to `false` (buffered reads). Do not modify this manually, use |
|
* {createUnbufferedStream} to convert the stream to unbuffered mode |
|
* instead. |
|
*/ |
|
AWS.HttpResponse = inherit({ |
|
|
|
/** |
|
* @api private |
|
*/ |
|
constructor: function HttpResponse() { |
|
this.statusCode = undefined; |
|
this.headers = {}; |
|
this.body = undefined; |
|
this.streaming = false; |
|
this.stream = null; |
|
}, |
|
|
|
/** |
|
* Disables buffering on the HTTP response and returns the stream for reading. |
|
* @return [Stream, XMLHttpRequest, null] the underlying stream object. |
|
* Use this object to directly read data off of the stream. |
|
* @note This object is only available after the {AWS.Request~httpHeaders} |
|
* event has fired. This method must be called prior to |
|
* {AWS.Request~httpData}. |
|
* @example Taking control of a stream |
|
* request.on('httpHeaders', function(statusCode, headers) { |
|
* if (statusCode < 300) { |
|
* if (headers.etag === 'xyz') { |
|
* // pipe the stream, disabling buffering |
|
* var stream = this.response.httpResponse.createUnbufferedStream(); |
|
* stream.pipe(process.stdout); |
|
* } else { // abort this request and set a better error message |
|
* this.abort(); |
|
* this.response.error = new Error('Invalid ETag'); |
|
* } |
|
* } |
|
* }).send(console.log); |
|
*/ |
|
createUnbufferedStream: function createUnbufferedStream() { |
|
this.streaming = true; |
|
return this.stream; |
|
} |
|
}); |
|
|
|
|
|
AWS.HttpClient = inherit({}); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.HttpClient.getInstance = function getInstance() { |
|
if (this.singleton === undefined) { |
|
this.singleton = new this(); |
|
} |
|
return this.singleton; |
|
}; |
|
|
|
},{"./core":14}],23:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var EventEmitter = require('events').EventEmitter; |
|
require('../http'); |
|
|
|
var NSTrace = require('../netsuite_trace'); |
|
|
|
|
|
AWS.NsHttpClient = AWS.util.inherit({ |
|
handleRequest : function handleRequest(httpRequest, httpOptions, callback, errCallback) { |
|
var self = this; |
|
var endpoint = httpRequest.endpoint; |
|
var emitter = new EventEmitter(); |
|
var href = endpoint.protocol + '//' + endpoint.hostname; |
|
if (endpoint.port !== 80 && endpoint.port !== 443) { |
|
href += ':' + endpoint.port; |
|
} |
|
href += httpRequest.path; |
|
var useSSL = endpoint.protocol === 'https:'; |
|
var http = useSSL ? NS.https : NS.http; |
|
var emitter = new EventEmitter(); |
|
|
|
if (AWS.NsHttpClient._nst_constructor) { |
|
NSTrace.attachObjectInstance('AWS.NsHttpClient.emitter', emitter, 'debug', true /*no recursion attachment*/); |
|
} |
|
|
|
callback(emitter); |
|
var data = null; |
|
try { |
|
var response = http.request({ |
|
method : httpRequest.method, |
|
url : href, |
|
headers : httpRequest.headers, |
|
body : (httpRequest.body && typeof httpRequest.body.buffer === 'object') ? httpRequest.body.buffer |
|
: httpRequest.body |
|
}); |
|
|
|
if (AWS.NsHttpClient._nst_constructor) { |
|
log.debug('AWS.NsHttpClient.handleRequest [afterRequest]', JSON.stringify(response)); |
|
} |
|
emitter.statusCode = response.code; |
|
emitter.headers = response.headers; |
|
data = response.body; |
|
} catch (ex) { |
|
if (AWS.NsHttpClient._nst_constructor) { |
|
log.debug('requestError', JSON.stringify(ex)); |
|
} |
|
if (errCallback) { |
|
errCallback(AWS.util.error(new Error('NetSuite Error'), { |
|
code : 'NetSuiteError', |
|
cause : ex |
|
})); |
|
} |
|
return emitter; |
|
} |
|
emitter.emit('headers', emitter.statusCode, emitter.headers); |
|
|
|
if (data) { |
|
emitter.body = new AWS.util.Buffer(data); |
|
emitter.emit('data', emitter.body); |
|
} |
|
|
|
emitter.emit('end'); |
|
return emitter; |
|
}, |
|
emitter : null |
|
}); |
|
|
|
|
|
AWS.HttpClient.prototype = AWS.NsHttpClient.prototype; |
|
|
|
AWS.HttpClient.streamsApiVersion = 1; |
|
|
|
},{"../core":14,"../http":22,"../netsuite_trace":33,"events":148}],24:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var EventEmitter = require('events').EventEmitter; |
|
require('../http'); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.XHRClient = AWS.util.inherit({ |
|
handleRequest: function handleRequest(httpRequest, httpOptions, callback, errCallback) { |
|
var self = this; |
|
var endpoint = httpRequest.endpoint; |
|
var emitter = new EventEmitter(); |
|
var href = endpoint.protocol + '//' + endpoint.hostname; |
|
if (endpoint.port !== 80 && endpoint.port !== 443) { |
|
href += ':' + endpoint.port; |
|
} |
|
href += httpRequest.path; |
|
|
|
var xhr = new XMLHttpRequest(), headersEmitted = false; |
|
httpRequest.stream = xhr; |
|
|
|
xhr.addEventListener('readystatechange', function() { |
|
try { |
|
if (xhr.status === 0) return; // 0 code is invalid |
|
} catch (e) { return; } |
|
|
|
if (this.readyState >= this.HEADERS_RECEIVED && !headersEmitted) { |
|
try { xhr.responseType = 'arraybuffer'; } catch (e) {} |
|
emitter.statusCode = xhr.status; |
|
emitter.headers = self.parseHeaders(xhr.getAllResponseHeaders()); |
|
emitter.emit('headers', emitter.statusCode, emitter.headers); |
|
headersEmitted = true; |
|
} |
|
if (this.readyState === this.DONE) { |
|
self.finishRequest(xhr, emitter); |
|
} |
|
}, false); |
|
xhr.upload.addEventListener('progress', function (evt) { |
|
emitter.emit('sendProgress', evt); |
|
}); |
|
xhr.addEventListener('progress', function (evt) { |
|
emitter.emit('receiveProgress', evt); |
|
}, false); |
|
xhr.addEventListener('timeout', function () { |
|
errCallback(AWS.util.error(new Error('Timeout'), {code: 'TimeoutError'})); |
|
}, false); |
|
xhr.addEventListener('error', function () { |
|
errCallback(AWS.util.error(new Error('Network Failure'), { |
|
code: 'NetworkingError' |
|
})); |
|
}, false); |
|
|
|
callback(emitter); |
|
xhr.open(httpRequest.method, href, httpOptions.xhrAsync !== false); |
|
AWS.util.each(httpRequest.headers, function (key, value) { |
|
if (key !== 'Content-Length' && key !== 'User-Agent' && key !== 'Host') { |
|
xhr.setRequestHeader(key, value); |
|
} |
|
}); |
|
|
|
if (httpOptions.timeout && httpOptions.xhrAsync !== false) { |
|
xhr.timeout = httpOptions.timeout; |
|
} |
|
|
|
if (httpOptions.xhrWithCredentials) { |
|
xhr.withCredentials = true; |
|
} |
|
|
|
try { |
|
xhr.send(httpRequest.body); |
|
} catch (err) { |
|
if (httpRequest.body && typeof httpRequest.body.buffer === 'object') { |
|
xhr.send(httpRequest.body.buffer); // send ArrayBuffer directly |
|
} else { |
|
throw err; |
|
} |
|
} |
|
|
|
return emitter; |
|
}, |
|
|
|
parseHeaders: function parseHeaders(rawHeaders) { |
|
var headers = {}; |
|
AWS.util.arrayEach(rawHeaders.split(/\r?\n/), function (line) { |
|
var key = line.split(':', 1)[0]; |
|
var value = line.substring(key.length + 2); |
|
if (key.length > 0) headers[key.toLowerCase()] = value; |
|
}); |
|
return headers; |
|
}, |
|
|
|
finishRequest: function finishRequest(xhr, emitter) { |
|
var buffer; |
|
if (xhr.responseType === 'arraybuffer' && xhr.response) { |
|
var ab = xhr.response; |
|
buffer = new AWS.util.Buffer(ab.byteLength); |
|
var view = new Uint8Array(ab); |
|
for (var i = 0; i < buffer.length; ++i) { |
|
buffer[i] = view[i]; |
|
} |
|
} |
|
|
|
try { |
|
if (!buffer && typeof xhr.responseText === 'string') { |
|
buffer = new AWS.util.Buffer(xhr.responseText); |
|
} |
|
} catch (e) {} |
|
|
|
if (buffer) emitter.emit('data', buffer); |
|
emitter.emit('end'); |
|
} |
|
}); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.HttpClient.prototype = AWS.XHRClient.prototype; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.HttpClient.streamsApiVersion = 1; |
|
|
|
},{"../core":14,"../http":22,"events":148}],25:[function(require,module,exports){ |
|
var util = require('../util'); |
|
|
|
function JsonBuilder() { } |
|
|
|
JsonBuilder.prototype.build = function(value, shape) { |
|
return JSON.stringify(translate(value, shape)); |
|
}; |
|
|
|
function translate(value, shape) { |
|
if (!shape || value === undefined || value === null) return undefined; |
|
|
|
switch (shape.type) { |
|
case 'structure': return translateStructure(value, shape); |
|
case 'map': return translateMap(value, shape); |
|
case 'list': return translateList(value, shape); |
|
default: return translateScalar(value, shape); |
|
} |
|
} |
|
|
|
function translateStructure(structure, shape) { |
|
var struct = {}; |
|
util.each(structure, function(name, value) { |
|
var memberShape = shape.members[name]; |
|
if (memberShape) { |
|
if (memberShape.location !== 'body') return; |
|
var locationName = memberShape.isLocationName ? memberShape.name : name; |
|
var result = translate(value, memberShape); |
|
if (result !== undefined) struct[locationName] = result; |
|
} |
|
}); |
|
return struct; |
|
} |
|
|
|
function translateList(list, shape) { |
|
var out = []; |
|
util.arrayEach(list, function(value) { |
|
var result = translate(value, shape.member); |
|
if (result !== undefined) out.push(result); |
|
}); |
|
return out; |
|
} |
|
|
|
function translateMap(map, shape) { |
|
var out = {}; |
|
util.each(map, function(key, value) { |
|
var result = translate(value, shape.value); |
|
if (result !== undefined) out[key] = result; |
|
}); |
|
return out; |
|
} |
|
|
|
function translateScalar(value, shape) { |
|
return shape.toWireFormat(value); |
|
} |
|
|
|
module.exports = JsonBuilder; |
|
|
|
},{"../util":61}],26:[function(require,module,exports){ |
|
var util = require('../util'); |
|
|
|
function JsonParser() { } |
|
|
|
JsonParser.prototype.parse = function(value, shape) { |
|
return translate(JSON.parse(value), shape); |
|
}; |
|
|
|
function translate(value, shape) { |
|
if (!shape || value === undefined) return undefined; |
|
|
|
switch (shape.type) { |
|
case 'structure': return translateStructure(value, shape); |
|
case 'map': return translateMap(value, shape); |
|
case 'list': return translateList(value, shape); |
|
default: return translateScalar(value, shape); |
|
} |
|
} |
|
|
|
function translateStructure(structure, shape) { |
|
if (structure == null) return undefined; |
|
|
|
var struct = {}; |
|
var shapeMembers = shape.members; |
|
util.each(shapeMembers, function(name, memberShape) { |
|
var locationName = memberShape.isLocationName ? memberShape.name : name; |
|
if (Object.prototype.hasOwnProperty.call(structure, locationName)) { |
|
var value = structure[locationName]; |
|
var result = translate(value, memberShape); |
|
if (result !== undefined) struct[name] = result; |
|
} |
|
}); |
|
return struct; |
|
} |
|
|
|
function translateList(list, shape) { |
|
if (list == null) return undefined; |
|
|
|
var out = []; |
|
util.arrayEach(list, function(value) { |
|
var result = translate(value, shape.member); |
|
if (result === undefined) out.push(null); |
|
else out.push(result); |
|
}); |
|
return out; |
|
} |
|
|
|
function translateMap(map, shape) { |
|
if (map == null) return undefined; |
|
|
|
var out = {}; |
|
util.each(map, function(key, value) { |
|
var result = translate(value, shape.value); |
|
if (result === undefined) out[key] = null; |
|
else out[key] = result; |
|
}); |
|
return out; |
|
} |
|
|
|
function translateScalar(value, shape) { |
|
return shape.toType(value); |
|
} |
|
|
|
module.exports = JsonParser; |
|
|
|
},{"../util":61}],27:[function(require,module,exports){ |
|
var Collection = require('./collection'); |
|
var Operation = require('./operation'); |
|
var Shape = require('./shape'); |
|
var Paginator = require('./paginator'); |
|
var ResourceWaiter = require('./resource_waiter'); |
|
|
|
var util = require('../util'); |
|
var property = util.property; |
|
var memoizedProperty = util.memoizedProperty; |
|
|
|
function Api(api, options) { |
|
api = api || {}; |
|
options = options || {}; |
|
options.api = this; |
|
|
|
api.metadata = api.metadata || {}; |
|
|
|
property(this, 'isApi', true, false); |
|
property(this, 'apiVersion', api.metadata.apiVersion); |
|
property(this, 'endpointPrefix', api.metadata.endpointPrefix); |
|
property(this, 'signingName', api.metadata.signingName); |
|
property(this, 'globalEndpoint', api.metadata.globalEndpoint); |
|
property(this, 'signatureVersion', api.metadata.signatureVersion); |
|
property(this, 'jsonVersion', api.metadata.jsonVersion); |
|
property(this, 'targetPrefix', api.metadata.targetPrefix); |
|
property(this, 'protocol', api.metadata.protocol); |
|
property(this, 'timestampFormat', api.metadata.timestampFormat); |
|
property(this, 'xmlNamespaceUri', api.metadata.xmlNamespace); |
|
property(this, 'abbreviation', api.metadata.serviceAbbreviation); |
|
property(this, 'fullName', api.metadata.serviceFullName); |
|
|
|
memoizedProperty(this, 'className', function() { |
|
var name = api.metadata.serviceAbbreviation || api.metadata.serviceFullName; |
|
if (!name) return null; |
|
|
|
name = name.replace(/^Amazon|AWS\s*|\(.*|\s+|\W+/g, ''); |
|
if (name === 'ElasticLoadBalancing') name = 'ELB'; |
|
return name; |
|
}); |
|
|
|
property(this, 'operations', new Collection(api.operations, options, function(name, operation) { |
|
return new Operation(name, operation, options); |
|
}, util.string.lowerFirst)); |
|
|
|
property(this, 'shapes', new Collection(api.shapes, options, function(name, shape) { |
|
return Shape.create(shape, options); |
|
})); |
|
|
|
property(this, 'paginators', new Collection(api.paginators, options, function(name, paginator) { |
|
return new Paginator(name, paginator, options); |
|
})); |
|
|
|
property(this, 'waiters', new Collection(api.waiters, options, function(name, waiter) { |
|
return new ResourceWaiter(name, waiter, options); |
|
}, util.string.lowerFirst)); |
|
|
|
if (options.documentation) { |
|
property(this, 'documentation', api.documentation); |
|
property(this, 'documentationUrl', api.documentationUrl); |
|
} |
|
} |
|
|
|
module.exports = Api; |
|
|
|
},{"../util":61,"./collection":28,"./operation":29,"./paginator":30,"./resource_waiter":31,"./shape":32}],28:[function(require,module,exports){ |
|
var memoizedProperty = require('../util').memoizedProperty; |
|
|
|
function memoize(name, value, fn, nameTr) { |
|
memoizedProperty(this, nameTr(name), function() { |
|
return fn(name, value); |
|
}); |
|
} |
|
|
|
function Collection(iterable, options, fn, nameTr) { |
|
nameTr = nameTr || String; |
|
var self = this; |
|
|
|
for (var id in iterable) { |
|
if (Object.prototype.hasOwnProperty.call(iterable, id)) { |
|
memoize.call(self, id, iterable[id], fn, nameTr); |
|
} |
|
} |
|
} |
|
|
|
module.exports = Collection; |
|
|
|
},{"../util":61}],29:[function(require,module,exports){ |
|
var Shape = require('./shape'); |
|
|
|
var util = require('../util'); |
|
var property = util.property; |
|
var memoizedProperty = util.memoizedProperty; |
|
|
|
function Operation(name, operation, options) { |
|
options = options || {}; |
|
|
|
property(this, 'name', operation.name || name); |
|
property(this, 'api', options.api, false); |
|
|
|
operation.http = operation.http || {}; |
|
property(this, 'httpMethod', operation.http.method || 'POST'); |
|
property(this, 'httpPath', operation.http.requestUri || '/'); |
|
property(this, 'authtype', operation.authtype || ''); |
|
|
|
memoizedProperty(this, 'input', function() { |
|
if (!operation.input) { |
|
return new Shape.create({type: 'structure'}, options); |
|
} |
|
return Shape.create(operation.input, options); |
|
}); |
|
|
|
memoizedProperty(this, 'output', function() { |
|
if (!operation.output) { |
|
return new Shape.create({type: 'structure'}, options); |
|
} |
|
return Shape.create(operation.output, options); |
|
}); |
|
|
|
memoizedProperty(this, 'errors', function() { |
|
var list = []; |
|
if (!operation.errors) return null; |
|
|
|
for (var i = 0; i < operation.errors.length; i++) { |
|
list.push(Shape.create(operation.errors[i], options)); |
|
} |
|
|
|
return list; |
|
}); |
|
|
|
memoizedProperty(this, 'paginator', function() { |
|
return options.api.paginators[name]; |
|
}); |
|
|
|
if (options.documentation) { |
|
property(this, 'documentation', operation.documentation); |
|
property(this, 'documentationUrl', operation.documentationUrl); |
|
} |
|
} |
|
|
|
module.exports = Operation; |
|
|
|
},{"../util":61,"./shape":32}],30:[function(require,module,exports){ |
|
var property = require('../util').property; |
|
|
|
function Paginator(name, paginator) { |
|
property(this, 'inputToken', paginator.input_token); |
|
property(this, 'limitKey', paginator.limit_key); |
|
property(this, 'moreResults', paginator.more_results); |
|
property(this, 'outputToken', paginator.output_token); |
|
property(this, 'resultKey', paginator.result_key); |
|
} |
|
|
|
module.exports = Paginator; |
|
|
|
},{"../util":61}],31:[function(require,module,exports){ |
|
var util = require('../util'); |
|
var property = util.property; |
|
|
|
function ResourceWaiter(name, waiter, options) { |
|
options = options || {}; |
|
property(this, 'name', name); |
|
property(this, 'api', options.api, false); |
|
|
|
if (waiter.operation) { |
|
property(this, 'operation', util.string.lowerFirst(waiter.operation)); |
|
} |
|
|
|
var self = this; |
|
var keys = [ |
|
'type', |
|
'description', |
|
'delay', |
|
'maxAttempts', |
|
'acceptors' |
|
]; |
|
|
|
keys.forEach(function(key) { |
|
var value = waiter[key]; |
|
if (value) { |
|
property(self, key, value); |
|
} |
|
}); |
|
} |
|
|
|
module.exports = ResourceWaiter; |
|
|
|
},{"../util":61}],32:[function(require,module,exports){ |
|
var Collection = require('./collection'); |
|
|
|
var util = require('../util'); |
|
|
|
function property(obj, name, value) { |
|
if (value !== null && value !== undefined) { |
|
util.property.apply(this, arguments); |
|
} |
|
} |
|
|
|
function memoizedProperty(obj, name) { |
|
if (!obj.constructor.prototype[name]) { |
|
util.memoizedProperty.apply(this, arguments); |
|
} |
|
} |
|
|
|
function Shape(shape, options, memberName) { |
|
options = options || {}; |
|
|
|
property(this, 'shape', shape.shape); |
|
property(this, 'api', options.api, false); |
|
property(this, 'type', shape.type); |
|
property(this, 'enum', shape.enum); |
|
property(this, 'min', shape.min); |
|
property(this, 'max', shape.max); |
|
property(this, 'pattern', shape.pattern); |
|
property(this, 'location', shape.location || this.location || 'body'); |
|
property(this, 'name', this.name || shape.xmlName || shape.queryName || |
|
shape.locationName || memberName); |
|
property(this, 'isStreaming', shape.streaming || this.isStreaming || false); |
|
property(this, 'isComposite', shape.isComposite || false); |
|
property(this, 'isShape', true, false); |
|
property(this, 'isQueryName', shape.queryName ? true : false, false); |
|
property(this, 'isLocationName', shape.locationName ? true : false, false); |
|
|
|
if (options.documentation) { |
|
property(this, 'documentation', shape.documentation); |
|
property(this, 'documentationUrl', shape.documentationUrl); |
|
} |
|
|
|
if (shape.xmlAttribute) { |
|
property(this, 'isXmlAttribute', shape.xmlAttribute || false); |
|
} |
|
|
|
// type conversion and parsing |
|
property(this, 'defaultValue', null); |
|
this.toWireFormat = function(value) { |
|
if (value === null || value === undefined) return ''; |
|
return value; |
|
}; |
|
this.toType = function(value) { return value; }; |
|
} |
|
|
|
/** |
|
* @api private |
|
*/ |
|
Shape.normalizedTypes = { |
|
character: 'string', |
|
double: 'float', |
|
long: 'integer', |
|
short: 'integer', |
|
biginteger: 'integer', |
|
bigdecimal: 'float', |
|
blob: 'binary' |
|
}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
Shape.types = { |
|
'structure': StructureShape, |
|
'list': ListShape, |
|
'map': MapShape, |
|
'boolean': BooleanShape, |
|
'timestamp': TimestampShape, |
|
'float': FloatShape, |
|
'integer': IntegerShape, |
|
'string': StringShape, |
|
'base64': Base64Shape, |
|
'binary': BinaryShape |
|
}; |
|
|
|
Shape.resolve = function resolve(shape, options) { |
|
if (shape.shape) { |
|
var refShape = options.api.shapes[shape.shape]; |
|
if (!refShape) { |
|
throw new Error('Cannot find shape reference: ' + shape.shape); |
|
} |
|
|
|
return refShape; |
|
} else { |
|
return null; |
|
} |
|
}; |
|
|
|
Shape.create = function create(shape, options, memberName) { |
|
if (shape.isShape) return shape; |
|
|
|
var refShape = Shape.resolve(shape, options); |
|
if (refShape) { |
|
var filteredKeys = Object.keys(shape); |
|
if (!options.documentation) { |
|
filteredKeys = filteredKeys.filter(function(name) { |
|
return !name.match(/documentation/); |
|
}); |
|
} |
|
if (filteredKeys === ['shape']) { // no inline customizations |
|
return refShape; |
|
} |
|
|
|
// create an inline shape with extra members |
|
var InlineShape = function() { |
|
refShape.constructor.call(this, shape, options, memberName); |
|
}; |
|
InlineShape.prototype = refShape; |
|
return new InlineShape(); |
|
} else { |
|
// set type if not set |
|
if (!shape.type) { |
|
if (shape.members) shape.type = 'structure'; |
|
else if (shape.member) shape.type = 'list'; |
|
else if (shape.key) shape.type = 'map'; |
|
else shape.type = 'string'; |
|
} |
|
|
|
// normalize types |
|
var origType = shape.type; |
|
if (Shape.normalizedTypes[shape.type]) { |
|
shape.type = Shape.normalizedTypes[shape.type]; |
|
} |
|
|
|
if (Shape.types[shape.type]) { |
|
return new Shape.types[shape.type](shape, options, memberName); |
|
} else { |
|
throw new Error('Unrecognized shape type: ' + origType); |
|
} |
|
} |
|
}; |
|
|
|
function CompositeShape(shape) { |
|
Shape.apply(this, arguments); |
|
property(this, 'isComposite', true); |
|
|
|
if (shape.flattened) { |
|
property(this, 'flattened', shape.flattened || false); |
|
} |
|
} |
|
|
|
function StructureShape(shape, options) { |
|
var requiredMap = null, firstInit = !this.isShape; |
|
|
|
CompositeShape.apply(this, arguments); |
|
|
|
if (firstInit) { |
|
property(this, 'defaultValue', function() { return {}; }); |
|
property(this, 'members', {}); |
|
property(this, 'memberNames', []); |
|
property(this, 'required', []); |
|
property(this, 'isRequired', function() { return false; }); |
|
} |
|
|
|
if (shape.members) { |
|
property(this, 'members', new Collection(shape.members, options, function(name, member) { |
|
return Shape.create(member, options, name); |
|
})); |
|
memoizedProperty(this, 'memberNames', function() { |
|
return shape.xmlOrder || Object.keys(shape.members); |
|
}); |
|
} |
|
|
|
if (shape.required) { |
|
property(this, 'required', shape.required); |
|
property(this, 'isRequired', function(name) { |
|
if (!requiredMap) { |
|
requiredMap = {}; |
|
for (var i = 0; i < shape.required.length; i++) { |
|
requiredMap[shape.required[i]] = true; |
|
} |
|
} |
|
|
|
return requiredMap[name]; |
|
}, false, true); |
|
} |
|
|
|
property(this, 'resultWrapper', shape.resultWrapper || null); |
|
|
|
if (shape.payload) { |
|
property(this, 'payload', shape.payload); |
|
} |
|
|
|
if (typeof shape.xmlNamespace === 'string') { |
|
property(this, 'xmlNamespaceUri', shape.xmlNamespace); |
|
} else if (typeof shape.xmlNamespace === 'object') { |
|
property(this, 'xmlNamespacePrefix', shape.xmlNamespace.prefix); |
|
property(this, 'xmlNamespaceUri', shape.xmlNamespace.uri); |
|
} |
|
} |
|
|
|
function ListShape(shape, options) { |
|
var self = this, firstInit = !this.isShape; |
|
CompositeShape.apply(this, arguments); |
|
|
|
if (firstInit) { |
|
property(this, 'defaultValue', function() { return []; }); |
|
} |
|
|
|
if (shape.member) { |
|
memoizedProperty(this, 'member', function() { |
|
return Shape.create(shape.member, options); |
|
}); |
|
} |
|
|
|
if (this.flattened) { |
|
var oldName = this.name; |
|
memoizedProperty(this, 'name', function() { |
|
return self.member.name || oldName; |
|
}); |
|
} |
|
} |
|
|
|
function MapShape(shape, options) { |
|
var firstInit = !this.isShape; |
|
CompositeShape.apply(this, arguments); |
|
|
|
if (firstInit) { |
|
property(this, 'defaultValue', function() { return {}; }); |
|
property(this, 'key', Shape.create({type: 'string'}, options)); |
|
property(this, 'value', Shape.create({type: 'string'}, options)); |
|
} |
|
|
|
if (shape.key) { |
|
memoizedProperty(this, 'key', function() { |
|
return Shape.create(shape.key, options); |
|
}); |
|
} |
|
if (shape.value) { |
|
memoizedProperty(this, 'value', function() { |
|
return Shape.create(shape.value, options); |
|
}); |
|
} |
|
} |
|
|
|
function TimestampShape(shape) { |
|
var self = this; |
|
Shape.apply(this, arguments); |
|
|
|
if (this.location === 'header') { |
|
property(this, 'timestampFormat', 'rfc822'); |
|
} else if (shape.timestampFormat) { |
|
property(this, 'timestampFormat', shape.timestampFormat); |
|
} else if (this.api) { |
|
if (this.api.timestampFormat) { |
|
property(this, 'timestampFormat', this.api.timestampFormat); |
|
} else { |
|
switch (this.api.protocol) { |
|
case 'json': |
|
case 'rest-json': |
|
property(this, 'timestampFormat', 'unixTimestamp'); |
|
break; |
|
case 'rest-xml': |
|
case 'query': |
|
case 'ec2': |
|
property(this, 'timestampFormat', 'iso8601'); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
this.toType = function(value) { |
|
if (value === null || value === undefined) return null; |
|
if (typeof value.toUTCString === 'function') return value; |
|
return typeof value === 'string' || typeof value === 'number' ? |
|
util.date.parseTimestamp(value) : null; |
|
}; |
|
|
|
this.toWireFormat = function(value) { |
|
return util.date.format(value, self.timestampFormat); |
|
}; |
|
} |
|
|
|
function StringShape() { |
|
Shape.apply(this, arguments); |
|
|
|
if (this.api) { |
|
switch (this.api.protocol) { |
|
case 'rest-xml': |
|
case 'query': |
|
case 'ec2': |
|
this.toType = function(value) { return value || ''; }; |
|
} |
|
} |
|
} |
|
|
|
function FloatShape() { |
|
Shape.apply(this, arguments); |
|
|
|
this.toType = function(value) { |
|
if (value === null || value === undefined) return null; |
|
return parseFloat(value); |
|
}; |
|
this.toWireFormat = this.toType; |
|
} |
|
|
|
function IntegerShape() { |
|
Shape.apply(this, arguments); |
|
|
|
this.toType = function(value) { |
|
if (value === null || value === undefined) return null; |
|
return parseInt(value, 10); |
|
}; |
|
this.toWireFormat = this.toType; |
|
} |
|
|
|
function BinaryShape() { |
|
Shape.apply(this, arguments); |
|
this.toType = util.base64.decode; |
|
this.toWireFormat = util.base64.encode; |
|
} |
|
|
|
function Base64Shape() { |
|
BinaryShape.apply(this, arguments); |
|
} |
|
|
|
function BooleanShape() { |
|
Shape.apply(this, arguments); |
|
|
|
this.toType = function(value) { |
|
if (typeof value === 'boolean') return value; |
|
if (value === null || value === undefined) return null; |
|
return value === 'true'; |
|
}; |
|
} |
|
|
|
/** |
|
* @api private |
|
*/ |
|
Shape.shapes = { |
|
StructureShape: StructureShape, |
|
ListShape: ListShape, |
|
MapShape: MapShape, |
|
StringShape: StringShape, |
|
BooleanShape: BooleanShape, |
|
Base64Shape: Base64Shape |
|
}; |
|
|
|
module.exports = Shape; |
|
|
|
},{"../util":61,"./collection":28}],33:[function(require,module,exports){ |
|
|
|
var AWS = {}; |
|
var NS = {}; |
|
|
|
var notFound = []; |
|
|
|
|
|
function safeStringify(value, recursed) { |
|
var type = typeof value; |
|
try { |
|
return type == 'function' ? ('' + value) : JSON.stringify(value); |
|
} |
|
catch (ex) { |
|
if (recursed || type !== 'object') { |
|
return "safe: " + value; |
|
} |
|
else { |
|
var output = {}; |
|
for (var member in value) { |
|
if (typeof value[member] == 'function') { |
|
output[member] = 'function: ' + value[member]; |
|
} |
|
else { |
|
output[member] = safeStringify(value[member], true); |
|
} |
|
} |
|
|
|
return "safe: " + JSON.stringify(output); |
|
} |
|
} |
|
} |
|
|
|
|
|
function resolveTarget(targetName, parentTarget) { |
|
var current = AWS; |
|
var parts = targetName.split('.'); |
|
if (parentTarget) { |
|
parts.splice(parts.length - 1, 1); |
|
} |
|
parts.forEach(function(member) { |
|
if (current) { |
|
current = current[member]; |
|
} |
|
}); |
|
|
|
return current; |
|
} |
|
|
|
|
|
function stringifyArguments(args, trace) { |
|
var obj = []; |
|
for (var index = 0; index < args.length; index ++) { |
|
var type = (typeof args[index]); |
|
var value; |
|
if (type == 'function') { |
|
value = trace ? ('' + args[index]) : (type + ': ' + args[index].name); |
|
} |
|
else { |
|
value = type + ': ' + args[index]; |
|
} |
|
obj.push(value); |
|
} |
|
|
|
return safeStringify(obj); |
|
} |
|
|
|
|
|
function attachFunction(targetName, func, level) { |
|
if (func._nst_attach) return func; |
|
|
|
var logFunc = function() { |
|
var nsLogFunc = NS.log[level]; |
|
var begin = new Date(); |
|
if (nsLogFunc) { |
|
var argsInfo = stringifyArguments(arguments, level == 'debug'); |
|
nsLogFunc.apply(NS.log, ['[' + begin.getTime() + ' ' + targetName + ']', argsInfo]); |
|
} |
|
var retVal = func.apply(this, arguments); |
|
if (nsLogFunc) { |
|
var params = ['[~' + begin.getTime() + ' ' + targetName + '] in ' + ((new Date()).getTime() - begin.getTime()) + 'ms']; |
|
if (retVal !== undefined) params.push(safeStringify(retVal)); |
|
nsLogFunc.apply(NS.log, params); |
|
} |
|
return retVal; |
|
}; |
|
logFunc._nst_attach = true; |
|
return logFunc; |
|
} |
|
|
|
|
|
function attachConstructor(parentName, parentType, memberName, level) { |
|
var returnType; |
|
if (!parentType._nst_constructor) { |
|
returnType = AWS.util.inherit(parentType, { |
|
constructor: function() { |
|
var instance = parentType.apply(this, arguments); |
|
var self = instance ? instance : this; |
|
for (var memberName in returnType._nst_attachList) { |
|
var attached = true; |
|
if (self[memberName]) { |
|
switch(typeof self[memberName]) { |
|
case 'function': |
|
self[memberName] = attachFunction(parentName + '.' + memberName, self[memberName], returnType._nst_attachList[memberName]); |
|
break; |
|
case 'object': |
|
self[memberName] = attachObjectInstance(parentName + '.' + memberName, self[memberName], returnType._nst_attachList[memberName], true); |
|
break; |
|
default: |
|
attached = false; |
|
} |
|
} |
|
else { |
|
attached = memberName == '__all__'; |
|
} |
|
if (attached) continue; |
|
var attachName = parentName + '.prototype.' + memberName; |
|
if (notFound.indexOf(attachName) == -1) { |
|
notFound.push(attachName); |
|
NS.log.debug('reloadAwsLoggers target not found', attachName); |
|
} |
|
} |
|
|
|
if (returnType._nst_attachList['__all__'] !== undefined) { |
|
instance = attachObjectInstance(parentName, self, returnType._nst_attachList['__all__'], false); |
|
} |
|
|
|
return instance ? instance : self; |
|
}, |
|
}); |
|
for(var member in parentType) { |
|
if (returnType[member] === undefined) { |
|
returnType[member] = parentType[member]; |
|
} |
|
}; |
|
returnType._nst_constructor = parentType; |
|
} |
|
else { |
|
returnType = parentType; |
|
} |
|
|
|
if (!returnType._nst_attachList) { |
|
returnType._nst_attachList = {}; |
|
} |
|
if (returnType._nst_attachList[memberName] === undefined) { |
|
returnType._nst_attachList[memberName] = level; |
|
} |
|
return returnType; |
|
} |
|
|
|
|
|
function attachObjectInstance(targetName, target, level, noRecursion, noAlter) { |
|
if (target._nst_attach) return; |
|
for (var member in target) { |
|
if (!target[member] || ['console', 'constructor', 'prototype', '__super__'].indexOf(member)!==-1) continue; |
|
var type = typeof target[member]; |
|
switch (type) { |
|
case 'function': |
|
target[member] = attachFunction(targetName + '.' + member, target[member], level, target); |
|
break; |
|
case 'object': |
|
if (!noRecursion) { |
|
attachObjectInstance(targetName + '.' + member, target[member], level, true, member == 'params'); |
|
} |
|
break; |
|
} |
|
} |
|
if (!noAlter) { |
|
target._nst_attach = true; |
|
} |
|
return target; |
|
} |
|
|
|
|
|
function reloadAwsLoggers(theNS, awslog) { |
|
NS = theNS; |
|
if (!awslog && NS && NS.awslog) awslog = NS.awslog; |
|
AWS = NS.AWS ? NS.AWS : require('./core'); |
|
|
|
AWS.util.each(awslog, function(targetName) { |
|
var targetLevel = 'debug'; |
|
if (NS.util.isNumber(targetName)) { |
|
targetName = NS.awslog[targetName]; |
|
} |
|
else { |
|
targetLevel = NS.awslog[targetName]; |
|
if (typeof targetLevel == 'function') { |
|
targetLevel = NS.awslog[targetName](); |
|
}; |
|
} |
|
var target = (targetName == 'NS.AWS') ? AWS : resolveTarget(targetName); |
|
var parts = targetName.split('.'); |
|
var memberName = parts[parts.length - 1]; |
|
|
|
if (!target) { |
|
if (parts.length > 2 && parts[parts.length-2]=='prototype') { |
|
parts.splice(parts.length-2, 2); |
|
var parentName = parts.join('.'); |
|
var parent = resolveTarget(parentName); |
|
if (parent && typeof parent == 'function' && parent.prototype) { |
|
parts.splice(parts.length-1, 1); |
|
var ancestor = parts.length == 0 ? AWS:resolveTarget(parts.join('.')); |
|
if (ancestor) { |
|
ancestor[parentName] = attachConstructor(parentName + '.prototype', parent, memberName, targetLevel); |
|
return; |
|
} |
|
} |
|
} |
|
if (notFound.indexOf(targetName)==-1) { |
|
notFound.push(targetName); |
|
} |
|
return; |
|
} |
|
parts.splice(parts.length-1, 1); |
|
var parentName = parts.join('.'); |
|
var parent = parts.length ? resolveTarget(parentName):AWS; |
|
var type = typeof target; |
|
switch (type) { |
|
case 'function': |
|
if (target.__super__ || targetName.indexOf('.prototype.') == -1) { |
|
if (target.prototype) { |
|
parent[memberName] = attachConstructor(targetName, target, '__all__', targetLevel); |
|
} |
|
else { |
|
attachObjectInstance(targetName, target, level); |
|
} |
|
} |
|
else { |
|
parent[memberName] = attachFunction(targetName, target, targetLevel); |
|
} |
|
break; |
|
default: |
|
if (NS.error) { |
|
throw NS.error.create({ |
|
name: 'UNKNOWN_MEMBER_TYPE', |
|
message: 'name: ' + targetName + ' type: ' + type |
|
}); |
|
} |
|
else { |
|
throw new Error('UNKOWN_MEMBER_TYPE name: ' + targetName + ' type: ' + type); |
|
} |
|
} |
|
|
|
}); |
|
if (notFound.length > 0) { |
|
NS.log.debug('reloadAwsLoggers target not found', notFound.join(', ')); |
|
} |
|
} |
|
|
|
|
|
module.exports = { |
|
attachConstructor: attachConstructor, |
|
attachObjectInstance: attachObjectInstance, |
|
attachFunction: attachFunction, |
|
reloadAwsLoggers: reloadAwsLoggers |
|
}; |
|
},{"./core":14}],34:[function(require,module,exports){ |
|
(function (process){ |
|
var util = require('./util'); |
|
|
|
// browser specific modules |
|
util.crypto.lib = require('crypto-browserify'); |
|
util.Buffer = require('buffer/').Buffer; |
|
util.url = require('url/'); |
|
util.querystring = require('querystring/'); |
|
|
|
var AWS = require('./core'); |
|
|
|
// Use default API loader function |
|
require('./api_loader'); |
|
|
|
// Load the DOMParser XML parser |
|
AWS.XML.Parser = require('./xml/ns_parser'); |
|
|
|
// Load the XHR HttpClient |
|
require('./http/ns'); |
|
|
|
if (typeof process === 'undefined') { |
|
process = { |
|
browser: true |
|
}; |
|
} |
|
}).call(this,require('_process')) |
|
},{"./api_loader":11,"./core":14,"./http/ns":23,"./util":61,"./xml/ns_parser":64,"_process":151,"buffer/":66,"crypto-browserify":68,"querystring/":126,"url/":127}],35:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.ParamValidator = AWS.util.inherit({ |
|
/** |
|
* Create a new validator object. |
|
* |
|
* @param validation [Boolean|map] whether input parameters should be |
|
* validated against the operation description before sending the |
|
* request. Pass a map to enable any of the following specific |
|
* validation features: |
|
* |
|
* * **min** [Boolean] — Validates that a value meets the min |
|
* constraint. This is enabled by default when paramValidation is set |
|
* to `true`. |
|
* * **max** [Boolean] — Validates that a value meets the max |
|
* constraint. |
|
* * **pattern** [Boolean] — Validates that a string value matches a |
|
* regular expression. |
|
* * **enum** [Boolean] — Validates that a string value matches one |
|
* of the allowable enum values. |
|
*/ |
|
constructor: function ParamValidator(validation) { |
|
if (validation === true || validation === undefined) { |
|
validation = {'min': true}; |
|
} |
|
this.validation = validation; |
|
}, |
|
|
|
validate: function validate(shape, params, context) { |
|
this.errors = []; |
|
this.validateMember(shape, params || {}, context || 'params'); |
|
|
|
if (this.errors.length > 1) { |
|
var msg = this.errors.join('\n* '); |
|
msg = 'There were ' + this.errors.length + |
|
' validation errors:\n* ' + msg; |
|
throw AWS.util.error(new Error(msg), |
|
{code: 'MultipleValidationErrors', errors: this.errors}); |
|
} else if (this.errors.length === 1) { |
|
throw this.errors[0]; |
|
} else { |
|
return true; |
|
} |
|
}, |
|
|
|
fail: function fail(code, message) { |
|
this.errors.push(AWS.util.error(new Error(message), {code: code})); |
|
}, |
|
|
|
validateStructure: function validateStructure(shape, params, context) { |
|
this.validateType(params, context, ['object'], 'structure'); |
|
|
|
var paramName; |
|
for (var i = 0; shape.required && i < shape.required.length; i++) { |
|
paramName = shape.required[i]; |
|
var value = params[paramName]; |
|
if (value === undefined || value === null) { |
|
this.fail('MissingRequiredParameter', |
|
'Missing required key \'' + paramName + '\' in ' + context); |
|
} |
|
} |
|
|
|
// validate hash members |
|
for (paramName in params) { |
|
if (!Object.prototype.hasOwnProperty.call(params, paramName)) continue; |
|
|
|
var paramValue = params[paramName], |
|
memberShape = shape.members[paramName]; |
|
|
|
if (memberShape !== undefined) { |
|
var memberContext = [context, paramName].join('.'); |
|
this.validateMember(memberShape, paramValue, memberContext); |
|
} else { |
|
this.fail('UnexpectedParameter', |
|
'Unexpected key \'' + paramName + '\' found in ' + context); |
|
} |
|
} |
|
|
|
return true; |
|
}, |
|
|
|
validateMember: function validateMember(shape, param, context) { |
|
switch (shape.type) { |
|
case 'structure': |
|
return this.validateStructure(shape, param, context); |
|
case 'list': |
|
return this.validateList(shape, param, context); |
|
case 'map': |
|
return this.validateMap(shape, param, context); |
|
default: |
|
return this.validateScalar(shape, param, context); |
|
} |
|
}, |
|
|
|
validateList: function validateList(shape, params, context) { |
|
if (this.validateType(params, context, [Array])) { |
|
this.validateRange(shape, params.length, context, 'list member count'); |
|
// validate array members |
|
for (var i = 0; i < params.length; i++) { |
|
this.validateMember(shape.member, params[i], context + '[' + i + ']'); |
|
} |
|
} |
|
}, |
|
|
|
validateMap: function validateMap(shape, params, context) { |
|
if (this.validateType(params, context, ['object'], 'map')) { |
|
// Build up a count of map members to validate range traits. |
|
var mapCount = 0; |
|
for (var param in params) { |
|
if (!Object.prototype.hasOwnProperty.call(params, param)) continue; |
|
// Validate any map key trait constraints |
|
this.validateMember(shape.key, param, |
|
context + '[key=\'' + param + '\']') |
|
this.validateMember(shape.value, params[param], |
|
context + '[\'' + param + '\']'); |
|
mapCount++; |
|
} |
|
this.validateRange(shape, mapCount, context, 'map member count'); |
|
} |
|
}, |
|
|
|
validateScalar: function validateScalar(shape, value, context) { |
|
switch (shape.type) { |
|
case null: |
|
case undefined: |
|
case 'string': |
|
return this.validateString(shape, value, context); |
|
case 'base64': |
|
case 'binary': |
|
return this.validatePayload(value, context); |
|
case 'integer': |
|
case 'float': |
|
return this.validateNumber(shape, value, context); |
|
case 'boolean': |
|
return this.validateType(value, context, ['boolean']); |
|
case 'timestamp': |
|
return this.validateType(value, context, [Date, |
|
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/, 'number'], |
|
'Date object, ISO-8601 string, or a UNIX timestamp'); |
|
default: |
|
return this.fail('UnkownType', 'Unhandled type ' + |
|
shape.type + ' for ' + context); |
|
} |
|
}, |
|
|
|
validateString: function validateString(shape, value, context) { |
|
if (this.validateType(value, context, ['string'])) { |
|
this.validateEnum(shape, value, context); |
|
this.validateRange(shape, value.length, context, 'string length'); |
|
this.validatePattern(shape, value, context); |
|
} |
|
}, |
|
|
|
validatePattern: function validatePattern(shape, value, context) { |
|
if (this.validation['pattern'] && shape['pattern'] !== undefined) { |
|
if (!(new RegExp(shape['pattern'])).test(value)) { |
|
this.fail('PatternMatchError', 'Provided value "' + value + '" ' |
|
+ 'does not match regex pattern /' + shape['pattern'] + '/ for ' |
|
+ context); |
|
} |
|
} |
|
}, |
|
|
|
validateRange: function validateRange(shape, value, context, descriptor) { |
|
if (this.validation['min']) { |
|
if (shape['min'] !== undefined && value < shape['min']) { |
|
this.fail('MinRangeError', 'Expected ' + descriptor + ' >= ' |
|
+ shape['min'] + ', but found ' + value + ' for ' + context); |
|
} |
|
} |
|
if (this.validation['max']) { |
|
if (shape['max'] !== undefined && value > shape['max']) { |
|
this.fail('MaxRangeError', 'Expected ' + descriptor + ' <= ' |
|
+ shape['max'] + ', but found ' + value + ' for ' + context); |
|
} |
|
} |
|
}, |
|
|
|
validateEnum: function validateRange(shape, value, context) { |
|
if (this.validation['enum'] && shape['enum'] !== undefined) { |
|
// Fail if the string value is not present in the enum list |
|
if (shape['enum'].indexOf(value) === -1) { |
|
this.fail('EnumError', 'Found string value of ' + value + ', but ' |
|
+ 'expected ' + shape['enum'].join('|') + ' for ' + context); |
|
} |
|
} |
|
}, |
|
|
|
validateType: function validateType(value, context, acceptedTypes, type) { |
|
// We will not log an error for null or undefined, but we will return |
|
// false so that callers know that the expected type was not strictly met. |
|
if (value === null || value === undefined) return false; |
|
|
|
var foundInvalidType = false; |
|
for (var i = 0; i < acceptedTypes.length; i++) { |
|
if (typeof acceptedTypes[i] === 'string') { |
|
if (typeof value === acceptedTypes[i]) return true; |
|
} else if (acceptedTypes[i] instanceof RegExp) { |
|
if ((value || '').toString().match(acceptedTypes[i])) return true; |
|
} else { |
|
if (value instanceof acceptedTypes[i]) return true; |
|
if (AWS.util.isType(value, acceptedTypes[i])) return true; |
|
if (!type && !foundInvalidType) acceptedTypes = acceptedTypes.slice(); |
|
acceptedTypes[i] = AWS.util.typeName(acceptedTypes[i]); |
|
} |
|
foundInvalidType = true; |
|
} |
|
|
|
var acceptedType = type; |
|
if (!acceptedType) { |
|
acceptedType = acceptedTypes.join(', ').replace(/,([^,]+)$/, ', or$1'); |
|
} |
|
|
|
var vowel = acceptedType.match(/^[aeiou]/i) ? 'n' : ''; |
|
this.fail('InvalidParameterType', 'Expected ' + context + ' to be a' + |
|
vowel + ' ' + acceptedType); |
|
return false; |
|
}, |
|
|
|
validateNumber: function validateNumber(shape, value, context) { |
|
if (value === null || value === undefined) return; |
|
if (typeof value === 'string') { |
|
var castedValue = parseFloat(value); |
|
if (castedValue.toString() === value) value = castedValue; |
|
} |
|
if (this.validateType(value, context, ['number'])) { |
|
this.validateRange(shape, value, context, 'numeric value'); |
|
} |
|
}, |
|
|
|
validatePayload: function validatePayload(value, context) { |
|
if (value === null || value === undefined) return; |
|
if (typeof value === 'string') return; |
|
if (value && typeof value.byteLength === 'number') return; // typed arrays |
|
if (AWS.util.isNode()) { // special check for buffer/stream in Node.js |
|
var Stream = AWS.util.stream.Stream; |
|
if (AWS.util.Buffer.isBuffer(value) || value instanceof Stream) return; |
|
} |
|
|
|
var types = ['Buffer', 'Stream', 'File', 'Blob', 'ArrayBuffer', 'DataView']; |
|
if (value) { |
|
for (var i = 0; i < types.length; i++) { |
|
if (AWS.util.isType(value, types[i])) return; |
|
if (AWS.util.typeName(value.constructor) === types[i]) return; |
|
} |
|
} |
|
|
|
this.fail('InvalidParameterType', 'Expected ' + context + ' to be a ' + |
|
'string, Buffer, Stream, Blob, or typed array object'); |
|
} |
|
}); |
|
|
|
},{"./core":14}],36:[function(require,module,exports){ |
|
var util = require('../util'); |
|
var JsonBuilder = require('../json/builder'); |
|
var JsonParser = require('../json/parser'); |
|
|
|
function buildRequest(req) { |
|
var httpRequest = req.httpRequest; |
|
var api = req.service.api; |
|
var target = api.targetPrefix + '.' + api.operations[req.operation].name; |
|
var version = api.jsonVersion || '1.0'; |
|
var input = api.operations[req.operation].input; |
|
var builder = new JsonBuilder(); |
|
|
|
if (version === 1) version = '1.0'; |
|
httpRequest.body = builder.build(req.params || {}, input); |
|
httpRequest.headers['Content-Type'] = 'application/x-amz-json-' + version; |
|
httpRequest.headers['X-Amz-Target'] = target; |
|
} |
|
|
|
function extractError(resp) { |
|
var error = {}; |
|
var httpResponse = resp.httpResponse; |
|
|
|
error.code = httpResponse.headers['x-amzn-errortype'] || 'UnknownError'; |
|
if (typeof error.code === 'string') { |
|
error.code = error.code.split(':')[0]; |
|
} |
|
|
|
if (httpResponse.body.length > 0) { |
|
var e = JSON.parse(httpResponse.body.toString()); |
|
if (e.__type || e.code) { |
|
error.code = (e.__type || e.code).split('#').pop(); |
|
} |
|
if (error.code === 'RequestEntityTooLarge') { |
|
error.message = 'Request body must be less than 1 MB'; |
|
} else { |
|
error.message = (e.message || e.Message || null); |
|
} |
|
} else { |
|
error.statusCode = httpResponse.statusCode; |
|
error.message = httpResponse.statusCode.toString(); |
|
} |
|
|
|
resp.error = util.error(new Error(), error); |
|
} |
|
|
|
function extractData(resp) { |
|
var body = resp.httpResponse.body.toString() || '{}'; |
|
if (resp.request.service.config.convertResponseTypes === false) { |
|
resp.data = JSON.parse(body); |
|
} else { |
|
var operation = resp.request.service.api.operations[resp.request.operation]; |
|
var shape = operation.output || {}; |
|
var parser = new JsonParser(); |
|
resp.data = parser.parse(body, shape); |
|
} |
|
} |
|
|
|
module.exports = { |
|
buildRequest: buildRequest, |
|
extractError: extractError, |
|
extractData: extractData |
|
}; |
|
|
|
},{"../json/builder":25,"../json/parser":26,"../util":61}],37:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var util = require('../util'); |
|
var QueryParamSerializer = require('../query/query_param_serializer'); |
|
var Shape = require('../model/shape'); |
|
|
|
function buildRequest(req) { |
|
var operation = req.service.api.operations[req.operation]; |
|
var httpRequest = req.httpRequest; |
|
httpRequest.headers['Content-Type'] = |
|
'application/x-www-form-urlencoded; charset=utf-8'; |
|
httpRequest.params = { |
|
Version: req.service.api.apiVersion, |
|
Action: operation.name |
|
}; |
|
|
|
// convert the request parameters into a list of query params, |
|
// e.g. Deeply.NestedParam.0.Name=value |
|
var builder = new QueryParamSerializer(); |
|
builder.serialize(req.params, operation.input, function(name, value) { |
|
httpRequest.params[name] = value; |
|
}); |
|
httpRequest.body = util.queryParamsToString(httpRequest.params); |
|
} |
|
|
|
function extractError(resp) { |
|
var data, body = resp.httpResponse.body.toString(); |
|
if (body.match('<UnknownOperationException')) { |
|
data = { |
|
Code: 'UnknownOperation', |
|
Message: 'Unknown operation ' + resp.request.operation |
|
}; |
|
} else { |
|
data = new AWS.XML.Parser().parse(body); |
|
} |
|
|
|
if (data.requestId && !resp.requestId) resp.requestId = data.requestId; |
|
if (data.Errors) data = data.Errors; |
|
if (data.Error) data = data.Error; |
|
if (data.Code) { |
|
resp.error = util.error(new Error(), { |
|
code: data.Code, |
|
message: data.Message |
|
}); |
|
} else { |
|
resp.error = util.error(new Error(), { |
|
code: resp.httpResponse.statusCode, |
|
message: null |
|
}); |
|
} |
|
} |
|
|
|
function extractData(resp) { |
|
var req = resp.request; |
|
var operation = req.service.api.operations[req.operation]; |
|
var shape = operation.output || {}; |
|
var origRules = shape; |
|
|
|
if (origRules.resultWrapper) { |
|
var tmp = Shape.create({type: 'structure'}); |
|
tmp.members[origRules.resultWrapper] = shape; |
|
tmp.memberNames = [origRules.resultWrapper]; |
|
util.property(shape, 'name', shape.resultWrapper); |
|
shape = tmp; |
|
} |
|
|
|
var parser = new AWS.XML.Parser(); |
|
|
|
// TODO: Refactor XML Parser to parse RequestId from response. |
|
if (shape && shape.members && !shape.members._XAMZRequestId) { |
|
var requestIdShape = Shape.create( |
|
{ type: 'string' }, |
|
{ api: { protocol: 'query' } }, |
|
'requestId' |
|
); |
|
shape.members._XAMZRequestId = requestIdShape; |
|
} |
|
|
|
var data = parser.parse(resp.httpResponse.body.toString(), shape); |
|
resp.requestId = data._XAMZRequestId || data.requestId; |
|
|
|
if (data._XAMZRequestId) delete data._XAMZRequestId; |
|
|
|
if (origRules.resultWrapper) { |
|
if (data[origRules.resultWrapper]) { |
|
util.update(data, data[origRules.resultWrapper]); |
|
delete data[origRules.resultWrapper]; |
|
} |
|
} |
|
|
|
resp.data = data; |
|
} |
|
|
|
module.exports = { |
|
buildRequest: buildRequest, |
|
extractError: extractError, |
|
extractData: extractData |
|
}; |
|
|
|
},{"../core":14,"../model/shape":32,"../query/query_param_serializer":41,"../util":61}],38:[function(require,module,exports){ |
|
var util = require('../util'); |
|
|
|
function populateMethod(req) { |
|
req.httpRequest.method = req.service.api.operations[req.operation].httpMethod; |
|
} |
|
|
|
function populateURI(req) { |
|
var operation = req.service.api.operations[req.operation]; |
|
var input = operation.input; |
|
var uri = [req.httpRequest.endpoint.path, operation.httpPath].join('/'); |
|
uri = uri.replace(/\/+/g, '/'); |
|
|
|
var queryString = {}, queryStringSet = false; |
|
util.each(input.members, function (name, member) { |
|
var paramValue = req.params[name]; |
|
if (paramValue === null || paramValue === undefined) return; |
|
if (member.location === 'uri') { |
|
var regex = new RegExp('\\{' + member.name + '(\\+)?\\}'); |
|
uri = uri.replace(regex, function(_, plus) { |
|
var fn = plus ? util.uriEscapePath : util.uriEscape; |
|
return fn(String(paramValue)); |
|
}); |
|
} else if (member.location === 'querystring') { |
|
queryStringSet = true; |
|
|
|
if (member.type === 'list') { |
|
queryString[member.name] = paramValue.map(function(val) { |
|
return util.uriEscape(String(val)); |
|
}); |
|
} else if (member.type === 'map') { |
|
util.each(paramValue, function(key, value) { |
|
if (Array.isArray(value)) { |
|
queryString[key] = value.map(function(val) { |
|
return util.uriEscape(String(val)); |
|
}); |
|
} else { |
|
queryString[key] = util.uriEscape(String(value)); |
|
} |
|
}); |
|
} else { |
|
queryString[member.name] = util.uriEscape(String(paramValue)); |
|
} |
|
} |
|
}); |
|
|
|
if (queryStringSet) { |
|
uri += (uri.indexOf('?') >= 0 ? '&' : '?'); |
|
var parts = []; |
|
util.arrayEach(Object.keys(queryString).sort(), function(key) { |
|
if (!Array.isArray(queryString[key])) { |
|
queryString[key] = [queryString[key]]; |
|
} |
|
for (var i = 0; i < queryString[key].length; i++) { |
|
parts.push(util.uriEscape(String(key)) + '=' + queryString[key][i]); |
|
} |
|
}); |
|
uri += parts.join('&'); |
|
} |
|
|
|
req.httpRequest.path = uri; |
|
} |
|
|
|
function populateHeaders(req) { |
|
var operation = req.service.api.operations[req.operation]; |
|
util.each(operation.input.members, function (name, member) { |
|
var value = req.params[name]; |
|
if (value === null || value === undefined) return; |
|
|
|
if (member.location === 'headers' && member.type === 'map') { |
|
util.each(value, function(key, memberValue) { |
|
req.httpRequest.headers[member.name + key] = memberValue; |
|
}); |
|
} else if (member.location === 'header') { |
|
value = member.toWireFormat(value).toString(); |
|
req.httpRequest.headers[member.name] = value; |
|
} |
|
}); |
|
} |
|
|
|
function buildRequest(req) { |
|
populateMethod(req); |
|
populateURI(req); |
|
populateHeaders(req); |
|
} |
|
|
|
function extractError() { |
|
} |
|
|
|
function extractData(resp) { |
|
var req = resp.request; |
|
var data = {}; |
|
var r = resp.httpResponse; |
|
var operation = req.service.api.operations[req.operation]; |
|
var output = operation.output; |
|
|
|
// normalize headers names to lower-cased keys for matching |
|
var headers = {}; |
|
util.each(r.headers, function (k, v) { |
|
headers[k.toLowerCase()] = v; |
|
}); |
|
|
|
util.each(output.members, function(name, member) { |
|
var header = (member.name || name).toLowerCase(); |
|
if (member.location === 'headers' && member.type === 'map') { |
|
data[name] = {}; |
|
var location = member.isLocationName ? member.name : ''; |
|
var pattern = new RegExp('^' + location + '(.+)', 'i'); |
|
util.each(r.headers, function (k, v) { |
|
var result = k.match(pattern); |
|
if (result !== null) { |
|
data[name][result[1]] = v; |
|
} |
|
}); |
|
} else if (member.location === 'header') { |
|
if (headers[header] !== undefined) { |
|
data[name] = headers[header]; |
|
} |
|
} else if (member.location === 'statusCode') { |
|
data[name] = parseInt(r.statusCode, 10); |
|
} |
|
}); |
|
|
|
resp.data = data; |
|
} |
|
|
|
module.exports = { |
|
buildRequest: buildRequest, |
|
extractError: extractError, |
|
extractData: extractData |
|
}; |
|
|
|
},{"../util":61}],39:[function(require,module,exports){ |
|
var util = require('../util'); |
|
var Rest = require('./rest'); |
|
var Json = require('./json'); |
|
var JsonBuilder = require('../json/builder'); |
|
var JsonParser = require('../json/parser'); |
|
|
|
function populateBody(req) { |
|
var builder = new JsonBuilder(); |
|
var input = req.service.api.operations[req.operation].input; |
|
|
|
if (input.payload) { |
|
var params = {}; |
|
var payloadShape = input.members[input.payload]; |
|
params = req.params[input.payload]; |
|
if (params === undefined) return; |
|
|
|
if (payloadShape.type === 'structure') { |
|
req.httpRequest.body = builder.build(params, payloadShape); |
|
} else { // non-JSON payload |
|
req.httpRequest.body = params; |
|
} |
|
} else { |
|
req.httpRequest.body = builder.build(req.params, input); |
|
} |
|
} |
|
|
|
function buildRequest(req) { |
|
Rest.buildRequest(req); |
|
|
|
// never send body payload on GET/HEAD/DELETE |
|
if (['GET', 'HEAD', 'DELETE'].indexOf(req.httpRequest.method) < 0) { |
|
populateBody(req); |
|
} |
|
} |
|
|
|
function extractError(resp) { |
|
Json.extractError(resp); |
|
} |
|
|
|
function extractData(resp) { |
|
Rest.extractData(resp); |
|
|
|
var req = resp.request; |
|
var rules = req.service.api.operations[req.operation].output || {}; |
|
if (rules.payload) { |
|
var payloadMember = rules.members[rules.payload]; |
|
var body = resp.httpResponse.body; |
|
if (payloadMember.isStreaming) { |
|
resp.data[rules.payload] = body; |
|
} else if (payloadMember.type === 'structure' || payloadMember.type === 'list') { |
|
var parser = new JsonParser(); |
|
resp.data[rules.payload] = parser.parse(body, payloadMember); |
|
} else { |
|
resp.data[rules.payload] = body.toString(); |
|
} |
|
} else { |
|
var data = resp.data; |
|
Json.extractData(resp); |
|
resp.data = util.merge(data, resp.data); |
|
} |
|
} |
|
|
|
module.exports = { |
|
buildRequest: buildRequest, |
|
extractError: extractError, |
|
extractData: extractData |
|
}; |
|
|
|
},{"../json/builder":25,"../json/parser":26,"../util":61,"./json":36,"./rest":38}],40:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var util = require('../util'); |
|
var Rest = require('./rest'); |
|
|
|
function populateBody(req) { |
|
var input = req.service.api.operations[req.operation].input; |
|
var builder = new AWS.XML.Builder(); |
|
var params = req.params; |
|
|
|
var payload = input.payload; |
|
if (payload) { |
|
var payloadMember = input.members[payload]; |
|
params = params[payload]; |
|
if (params === undefined) return; |
|
|
|
if (payloadMember.type === 'structure') { |
|
var rootElement = payloadMember.name; |
|
req.httpRequest.body = builder.toXML(params, payloadMember, rootElement, true); |
|
} else { // non-xml payload |
|
req.httpRequest.body = params; |
|
} |
|
} else { |
|
req.httpRequest.body = builder.toXML(params, input, input.name || |
|
input.shape || util.string.upperFirst(req.operation) + 'Request'); |
|
} |
|
} |
|
|
|
function buildRequest(req) { |
|
Rest.buildRequest(req); |
|
|
|
// never send body payload on GET/HEAD |
|
if (['GET', 'HEAD'].indexOf(req.httpRequest.method) < 0) { |
|
populateBody(req); |
|
} |
|
} |
|
|
|
function extractError(resp) { |
|
Rest.extractError(resp); |
|
|
|
var data = new AWS.XML.Parser().parse(resp.httpResponse.body.toString()); |
|
if (data.Errors) data = data.Errors; |
|
if (data.Error) data = data.Error; |
|
if (data.Code) { |
|
resp.error = util.error(new Error(), { |
|
code: data.Code, |
|
message: data.Message |
|
}); |
|
} else { |
|
resp.error = util.error(new Error(), { |
|
code: resp.httpResponse.statusCode, |
|
message: null |
|
}); |
|
} |
|
} |
|
|
|
function extractData(resp) { |
|
Rest.extractData(resp); |
|
|
|
var parser; |
|
var req = resp.request; |
|
var body = resp.httpResponse.body; |
|
var operation = req.service.api.operations[req.operation]; |
|
var output = operation.output; |
|
|
|
var payload = output.payload; |
|
if (payload) { |
|
var payloadMember = output.members[payload]; |
|
if (payloadMember.isStreaming) { |
|
resp.data[payload] = body; |
|
} else if (payloadMember.type === 'structure') { |
|
parser = new AWS.XML.Parser(); |
|
resp.data[payload] = parser.parse(body.toString(), payloadMember); |
|
} else { |
|
resp.data[payload] = body.toString(); |
|
} |
|
} else if (body.length > 0) { |
|
parser = new AWS.XML.Parser(); |
|
var data = parser.parse(body.toString(), output); |
|
util.update(resp.data, data); |
|
} |
|
} |
|
|
|
module.exports = { |
|
buildRequest: buildRequest, |
|
extractError: extractError, |
|
extractData: extractData |
|
}; |
|
|
|
},{"../core":14,"../util":61,"./rest":38}],41:[function(require,module,exports){ |
|
var util = require('../util'); |
|
|
|
function QueryParamSerializer() { |
|
} |
|
|
|
QueryParamSerializer.prototype.serialize = function(params, shape, fn) { |
|
serializeStructure('', params, shape, fn); |
|
}; |
|
|
|
function ucfirst(shape) { |
|
if (shape.isQueryName || shape.api.protocol !== 'ec2') { |
|
return shape.name; |
|
} else { |
|
return shape.name[0].toUpperCase() + shape.name.substr(1); |
|
} |
|
} |
|
|
|
function serializeStructure(prefix, struct, rules, fn) { |
|
util.each(rules.members, function(name, member) { |
|
var value = struct[name]; |
|
if (value === null || value === undefined) return; |
|
|
|
var memberName = ucfirst(member); |
|
memberName = prefix ? prefix + '.' + memberName : memberName; |
|
serializeMember(memberName, value, member, fn); |
|
}); |
|
} |
|
|
|
function serializeMap(name, map, rules, fn) { |
|
var i = 1; |
|
util.each(map, function (key, value) { |
|
var prefix = rules.flattened ? '.' : '.entry.'; |
|
var position = prefix + (i++) + '.'; |
|
var keyName = position + (rules.key.name || 'key'); |
|
var valueName = position + (rules.value.name || 'value'); |
|
serializeMember(name + keyName, key, rules.key, fn); |
|
serializeMember(name + valueName, value, rules.value, fn); |
|
}); |
|
} |
|
|
|
function serializeList(name, list, rules, fn) { |
|
var memberRules = rules.member || {}; |
|
|
|
if (list.length === 0) { |
|
fn.call(this, name, null); |
|
return; |
|
} |
|
|
|
util.arrayEach(list, function (v, n) { |
|
var suffix = '.' + (n + 1); |
|
if (rules.api.protocol === 'ec2') { |
|
// Do nothing for EC2 |
|
suffix = suffix + ''; // make linter happy |
|
} else if (rules.flattened) { |
|
if (memberRules.name) { |
|
var parts = name.split('.'); |
|
parts.pop(); |
|
parts.push(ucfirst(memberRules)); |
|
name = parts.join('.'); |
|
} |
|
} else { |
|
suffix = '.member' + suffix; |
|
} |
|
serializeMember(name + suffix, v, memberRules, fn); |
|
}); |
|
} |
|
|
|
function serializeMember(name, value, rules, fn) { |
|
if (value === null || value === undefined) return; |
|
if (rules.type === 'structure') { |
|
serializeStructure(name, value, rules, fn); |
|
} else if (rules.type === 'list') { |
|
serializeList(name, value, rules, fn); |
|
} else if (rules.type === 'map') { |
|
serializeMap(name, value, rules, fn); |
|
} else { |
|
fn(name, rules.toWireFormat(value).toString()); |
|
} |
|
} |
|
|
|
module.exports = QueryParamSerializer; |
|
|
|
},{"../util":61}],42:[function(require,module,exports){ |
|
module.exports={ |
|
"rules": { |
|
"*/*": { |
|
"endpoint": "{service}.{region}.amazonaws.com" |
|
}, |
|
"cn-*/*": { |
|
"endpoint": "{service}.{region}.amazonaws.com.cn" |
|
}, |
|
"*/budgets": "globalSSL", |
|
"*/cloudfront": "globalSSL", |
|
"*/iam": "globalSSL", |
|
"*/sts": "globalSSL", |
|
"*/importexport": { |
|
"endpoint": "{service}.amazonaws.com", |
|
"signatureVersion": "v2", |
|
"globalEndpoint": true |
|
}, |
|
"*/route53": { |
|
"endpoint": "https://{service}.amazonaws.com", |
|
"signatureVersion": "v3https", |
|
"globalEndpoint": true |
|
}, |
|
"*/waf": "globalSSL", |
|
"us-gov-*/iam": "globalGovCloud", |
|
"us-gov-*/sts": { |
|
"endpoint": "{service}.{region}.amazonaws.com" |
|
}, |
|
"us-gov-west-1/s3": "s3dash", |
|
"us-west-1/s3": "s3dash", |
|
"us-west-2/s3": "s3dash", |
|
"eu-west-1/s3": "s3dash", |
|
"ap-southeast-1/s3": "s3dash", |
|
"ap-southeast-2/s3": "s3dash", |
|
"ap-northeast-1/s3": "s3dash", |
|
"sa-east-1/s3": "s3dash", |
|
"us-east-1/s3": { |
|
"endpoint": "{service}.amazonaws.com", |
|
"signatureVersion": "s3" |
|
}, |
|
"us-east-1/sdb": { |
|
"endpoint": "{service}.amazonaws.com", |
|
"signatureVersion": "v2" |
|
}, |
|
"*/sdb": { |
|
"endpoint": "{service}.{region}.amazonaws.com", |
|
"signatureVersion": "v2" |
|
} |
|
}, |
|
|
|
"patterns": { |
|
"globalSSL": { |
|
"endpoint": "https://{service}.amazonaws.com", |
|
"globalEndpoint": true |
|
}, |
|
"globalGovCloud": { |
|
"endpoint": "{service}.us-gov.amazonaws.com" |
|
}, |
|
"s3dash": { |
|
"endpoint": "{service}-{region}.amazonaws.com", |
|
"signatureVersion": "s3" |
|
} |
|
} |
|
} |
|
|
|
},{}],43:[function(require,module,exports){ |
|
var util = require('./util'); |
|
var regionConfig = require('./region_config.json'); |
|
|
|
function generateRegionPrefix(region) { |
|
if (!region) return null; |
|
|
|
var parts = region.split('-'); |
|
if (parts.length < 3) return null; |
|
return parts.slice(0, parts.length - 2).join('-') + '-*'; |
|
} |
|
|
|
function derivedKeys(service) { |
|
var region = service.config.region; |
|
var regionPrefix = generateRegionPrefix(region); |
|
var endpointPrefix = service.api.endpointPrefix; |
|
|
|
return [ |
|
[region, endpointPrefix], |
|
[regionPrefix, endpointPrefix], |
|
[region, '*'], |
|
[regionPrefix, '*'], |
|
['*', endpointPrefix], |
|
['*', '*'] |
|
].map(function(item) { |
|
return item[0] && item[1] ? item.join('/') : null; |
|
}); |
|
} |
|
|
|
function applyConfig(service, config) { |
|
util.each(config, function(key, value) { |
|
if (key === 'globalEndpoint') return; |
|
if (service.config[key] === undefined || service.config[key] === null) { |
|
service.config[key] = value; |
|
} |
|
}); |
|
} |
|
|
|
function configureEndpoint(service) { |
|
var keys = derivedKeys(service); |
|
for (var i = 0; i < keys.length; i++) { |
|
var key = keys[i]; |
|
if (!key) continue; |
|
|
|
if (Object.prototype.hasOwnProperty.call(regionConfig.rules, key)) { |
|
var config = regionConfig.rules[key]; |
|
if (typeof config === 'string') { |
|
config = regionConfig.patterns[config]; |
|
} |
|
|
|
// set dualstack endpoint |
|
if (service.config.useDualstack && util.isDualstackAvailable(service)) { |
|
config = util.copy(config); |
|
config.endpoint = '{service}.dualstack.{region}.amazonaws.com'; |
|
} |
|
|
|
// set global endpoint |
|
service.isGlobalEndpoint = !!config.globalEndpoint; |
|
|
|
// signature version |
|
if (!config.signatureVersion) config.signatureVersion = 'v4'; |
|
|
|
// merge config |
|
applyConfig(service, config); |
|
return; |
|
} |
|
} |
|
} |
|
|
|
module.exports = configureEndpoint; |
|
|
|
},{"./region_config.json":42,"./util":61}],44:[function(require,module,exports){ |
|
(function (process){ |
|
var AWS = require('./core'); |
|
var AcceptorStateMachine = require('./state_machine'); |
|
var inherit = AWS.util.inherit; |
|
var domain = AWS.util.domain; |
|
var jmespath = require('jmespath'); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var hardErrorStates = {success: 1, error: 1, complete: 1}; |
|
|
|
function isTerminalState(machine) { |
|
return Object.prototype.hasOwnProperty.call(hardErrorStates, machine._asm.currentState); |
|
} |
|
|
|
var fsm = new AcceptorStateMachine(); |
|
fsm.setupStates = function() { |
|
var transition = function(_, done) { |
|
var self = this; |
|
self._haltHandlersOnError = false; |
|
|
|
self.emit(self._asm.currentState, function(err) { |
|
if (err) { |
|
if (isTerminalState(self)) { |
|
if (domain && self.domain instanceof domain.Domain) { |
|
err.domainEmitter = self; |
|
err.domain = self.domain; |
|
err.domainThrown = false; |
|
self.domain.emit('error', err); |
|
} else { |
|
throw err; |
|
} |
|
} else { |
|
self.response.error = err; |
|
done(err); |
|
} |
|
} else { |
|
done(self.response.error); |
|
} |
|
}); |
|
|
|
}; |
|
|
|
this.addState('validate', 'build', 'error', transition); |
|
this.addState('build', 'afterBuild', 'restart', transition); |
|
this.addState('afterBuild', 'sign', 'restart', transition); |
|
this.addState('sign', 'send', 'retry', transition); |
|
this.addState('retry', 'afterRetry', 'afterRetry', transition); |
|
this.addState('afterRetry', 'sign', 'error', transition); |
|
this.addState('send', 'validateResponse', 'retry', transition); |
|
this.addState('validateResponse', 'extractData', 'extractError', transition); |
|
this.addState('extractError', 'extractData', 'retry', transition); |
|
this.addState('extractData', 'success', 'retry', transition); |
|
this.addState('restart', 'build', 'error', transition); |
|
this.addState('success', 'complete', 'complete', transition); |
|
this.addState('error', 'complete', 'complete', transition); |
|
this.addState('complete', null, null, transition); |
|
}; |
|
fsm.setupStates(); |
|
|
|
/** |
|
* ## Asynchronous Requests |
|
* |
|
* All requests made through the SDK are asynchronous and use a |
|
* callback interface. Each service method that kicks off a request |
|
* returns an `AWS.Request` object that you can use to register |
|
* callbacks. |
|
* |
|
* For example, the following service method returns the request |
|
* object as "request", which can be used to register callbacks: |
|
* |
|
* ```javascript |
|
* // request is an AWS.Request object |
|
* var request = ec2.describeInstances(); |
|
* |
|
* // register callbacks on request to retrieve response data |
|
* request.on('success', function(response) { |
|
* console.log(response.data); |
|
* }); |
|
* ``` |
|
* |
|
* When a request is ready to be sent, the {send} method should |
|
* be called: |
|
* |
|
* ```javascript |
|
* request.send(); |
|
* ``` |
|
* |
|
* ## Removing Default Listeners for Events |
|
* |
|
* Request objects are built with default listeners for the various events, |
|
* depending on the service type. In some cases, you may want to remove |
|
* some built-in listeners to customize behaviour. Doing this requires |
|
* access to the built-in listener functions, which are exposed through |
|
* the {AWS.EventListeners.Core} namespace. For instance, you may |
|
* want to customize the HTTP handler used when sending a request. In this |
|
* case, you can remove the built-in listener associated with the 'send' |
|
* event, the {AWS.EventListeners.Core.SEND} listener and add your own. |
|
* |
|
* ## Multiple Callbacks and Chaining |
|
* |
|
* You can register multiple callbacks on any request object. The |
|
* callbacks can be registered for different events, or all for the |
|
* same event. In addition, you can chain callback registration, for |
|
* example: |
|
* |
|
* ```javascript |
|
* request. |
|
* on('success', function(response) { |
|
* console.log("Success!"); |
|
* }). |
|
* on('error', function(response) { |
|
* console.log("Error!"); |
|
* }). |
|
* on('complete', function(response) { |
|
* console.log("Always!"); |
|
* }). |
|
* send(); |
|
* ``` |
|
* |
|
* The above example will print either "Success! Always!", or "Error! Always!", |
|
* depending on whether the request succeeded or not. |
|
* |
|
* @!attribute httpRequest |
|
* @readonly |
|
* @!group HTTP Properties |
|
* @return [AWS.HttpRequest] the raw HTTP request object |
|
* containing request headers and body information |
|
* sent by the service. |
|
* |
|
* @!attribute startTime |
|
* @readonly |
|
* @!group Operation Properties |
|
* @return [Date] the time that the request started |
|
* |
|
* @!group Request Building Events |
|
* |
|
* @!event validate(request) |
|
* Triggered when a request is being validated. Listeners |
|
* should throw an error if the request should not be sent. |
|
* @param request [Request] the request object being sent |
|
* @see AWS.EventListeners.Core.VALIDATE_CREDENTIALS |
|
* @see AWS.EventListeners.Core.VALIDATE_REGION |
|
* @example Ensuring that a certain parameter is set before sending a request |
|
* var req = s3.putObject(params); |
|
* req.on('validate', function() { |
|
* if (!req.params.Body.match(/^Hello\s/)) { |
|
* throw new Error('Body must start with "Hello "'); |
|
* } |
|
* }); |
|
* req.send(function(err, data) { ... }); |
|
* |
|
* @!event build(request) |
|
* Triggered when the request payload is being built. Listeners |
|
* should fill the necessary information to send the request |
|
* over HTTP. |
|
* @param (see AWS.Request~validate) |
|
* @example Add a custom HTTP header to a request |
|
* var req = s3.putObject(params); |
|
* req.on('build', function() { |
|
* req.httpRequest.headers['Custom-Header'] = 'value'; |
|
* }); |
|
* req.send(function(err, data) { ... }); |
|
* |
|
* @!event sign(request) |
|
* Triggered when the request is being signed. Listeners should |
|
* add the correct authentication headers and/or adjust the body, |
|
* depending on the authentication mechanism being used. |
|
* @param (see AWS.Request~validate) |
|
* |
|
* @!group Request Sending Events |
|
* |
|
* @!event send(response) |
|
* Triggered when the request is ready to be sent. Listeners |
|
* should call the underlying transport layer to initiate |
|
* the sending of the request. |
|
* @param response [Response] the response object |
|
* @context [Request] the request object that was sent |
|
* @see AWS.EventListeners.Core.SEND |
|
* |
|
* @!event retry(response) |
|
* Triggered when a request failed and might need to be retried or redirected. |
|
* If the response is retryable, the listener should set the |
|
* `response.error.retryable` property to `true`, and optionally set |
|
* `response.error.retryCount` to the millisecond delay for the next attempt. |
|
* In the case of a redirect, `response.error.redirect` should be set to |
|
* `true` with `retryCount` set to an optional delay on the next request. |
|
* |
|
* If a listener decides that a request should not be retried, |
|
* it should set both `retryable` and `redirect` to false. |
|
* |
|
* Note that a retryable error will be retried at most |
|
* {AWS.Config.maxRetries} times (based on the service object's config). |
|
* Similarly, a request that is redirected will only redirect at most |
|
* {AWS.Config.maxRedirects} times. |
|
* |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* @example Adding a custom retry for a 404 response |
|
* request.on('retry', function(response) { |
|
* // this resource is not yet available, wait 10 seconds to get it again |
|
* if (response.httpResponse.statusCode === 404 && response.error) { |
|
* response.error.retryable = true; // retry this error |
|
* response.error.retryCount = 10000; // wait 10 seconds |
|
* } |
|
* }); |
|
* |
|
* @!group Data Parsing Events |
|
* |
|
* @!event extractError(response) |
|
* Triggered on all non-2xx requests so that listeners can extract |
|
* error details from the response body. Listeners to this event |
|
* should set the `response.error` property. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!event extractData(response) |
|
* Triggered in successful requests to allow listeners to |
|
* de-serialize the response body into `response.data`. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!group Completion Events |
|
* |
|
* @!event success(response) |
|
* Triggered when the request completed successfully. |
|
* `response.data` will contain the response data and |
|
* `response.error` will be null. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!event error(error, response) |
|
* Triggered when an error occurs at any point during the |
|
* request. `response.error` will contain details about the error |
|
* that occurred. `response.data` will be null. |
|
* @param error [Error] the error object containing details about |
|
* the error that occurred. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!event complete(response) |
|
* Triggered whenever a request cycle completes. `response.error` |
|
* should be checked, since the request may have failed. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!group HTTP Events |
|
* |
|
* @!event httpHeaders(statusCode, headers, response) |
|
* Triggered when headers are sent by the remote server |
|
* @param statusCode [Integer] the HTTP response code |
|
* @param headers [map<String,String>] the response headers |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!event httpData(chunk, response) |
|
* Triggered when data is sent by the remote server |
|
* @param chunk [Buffer] the buffer data containing the next data chunk |
|
* from the server |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* @see AWS.EventListeners.Core.HTTP_DATA |
|
* |
|
* @!event httpUploadProgress(progress, response) |
|
* Triggered when the HTTP request has uploaded more data |
|
* @param progress [map] An object containing the `loaded` and `total` bytes |
|
* of the request. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* @note This event will not be emitted in Node.js 0.8.x. |
|
* |
|
* @!event httpDownloadProgress(progress, response) |
|
* Triggered when the HTTP request has downloaded more data |
|
* @param progress [map] An object containing the `loaded` and `total` bytes |
|
* of the request. |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* @note This event will not be emitted in Node.js 0.8.x. |
|
* |
|
* @!event httpError(error, response) |
|
* Triggered when the HTTP request failed |
|
* @param error [Error] the error object that was thrown |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @!event httpDone(response) |
|
* Triggered when the server is finished sending data |
|
* @param (see AWS.Request~send) |
|
* @context (see AWS.Request~send) |
|
* |
|
* @see AWS.Response |
|
*/ |
|
AWS.Request = inherit({ |
|
|
|
/** |
|
* Creates a request for an operation on a given service with |
|
* a set of input parameters. |
|
* |
|
* @param service [AWS.Service] the service to perform the operation on |
|
* @param operation [String] the operation to perform on the service |
|
* @param params [Object] parameters to send to the operation. |
|
* See the operation's documentation for the format of the |
|
* parameters. |
|
*/ |
|
constructor: function Request(service, operation, params) { |
|
var endpoint = service.endpoint; |
|
var region = service.config.region; |
|
var customUserAgent = service.config.customUserAgent; |
|
|
|
// global endpoints sign as us-east-1 |
|
if (service.isGlobalEndpoint) region = 'us-east-1'; |
|
|
|
this.domain = domain && domain.active; |
|
this.service = service; |
|
this.operation = operation; |
|
this.params = params || {}; |
|
this.httpRequest = new AWS.HttpRequest(endpoint, region, customUserAgent); |
|
this.startTime = AWS.util.date.getDate(); |
|
|
|
this.response = new AWS.Response(this); |
|
this._asm = new AcceptorStateMachine(fsm.states, 'validate'); |
|
this._haltHandlersOnError = false; |
|
|
|
AWS.SequentialExecutor.call(this); |
|
this.emit = this.emitEvent; |
|
}, |
|
|
|
/** |
|
* @!group Sending a Request |
|
*/ |
|
|
|
/** |
|
* @overload send(callback = null) |
|
* Sends the request object. |
|
* |
|
* @callback callback function(err, data) |
|
* If a callback is supplied, it is called when a response is returned |
|
* from the service. |
|
* @context [AWS.Request] the request object being sent. |
|
* @param err [Error] the error object returned from the request. |
|
* Set to `null` if the request is successful. |
|
* @param data [Object] the de-serialized data returned from |
|
* the request. Set to `null` if a request error occurs. |
|
* @example Sending a request with a callback |
|
* request = s3.putObject({Bucket: 'bucket', Key: 'key'}); |
|
* request.send(function(err, data) { console.log(err, data); }); |
|
* @example Sending a request with no callback (using event handlers) |
|
* request = s3.putObject({Bucket: 'bucket', Key: 'key'}); |
|
* request.on('complete', function(response) { ... }); // register a callback |
|
* request.send(); |
|
*/ |
|
send: function send(callback) { |
|
if (callback) { |
|
this.on('complete', function (resp) { |
|
callback.call(resp, resp.error, resp.data); |
|
}); |
|
} |
|
this.runTo(); |
|
|
|
return this.response; |
|
}, |
|
|
|
/** |
|
* @!method promise() |
|
* Returns a 'thenable' promise. |
|
* |
|
* Two callbacks can be provided to the `then` method on the returned promise. |
|
* The first callback will be called if the promise is fulfilled, and the second |
|
* callback will be called if the promise is rejected. |
|
* @callback fulfilledCallback function(data) |
|
* Called if the promise is fulfilled. |
|
* @param data [Object] the de-serialized data returned from the request. |
|
* @callback rejectedCallback function(error) |
|
* Called if the promise is rejected. |
|
* @param error [Error] the error object returned from the request. |
|
* @return [Promise] A promise that represents the state of the request. |
|
* @example Sending a request using promises. |
|
* var request = s3.putObject({Bucket: 'bucket', Key: 'key'}); |
|
* var result = request.promise(); |
|
* result.then(function(data) { ... }, function(error) { ... }); |
|
*/ |
|
|
|
/** |
|
* @api private |
|
*/ |
|
build: function build(callback) { |
|
return this.runTo('send', callback); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
runTo: function runTo(state, done) { |
|
this._asm.runTo(state, done, this); |
|
return this; |
|
}, |
|
|
|
/** |
|
* Aborts a request, emitting the error and complete events. |
|
* |
|
* @!macro nobrowser |
|
* @example Aborting a request after sending |
|
* var params = { |
|
* Bucket: 'bucket', Key: 'key', |
|
* Body: new Buffer(1024 * 1024 * 5) // 5MB payload |
|
* }; |
|
* var request = s3.putObject(params); |
|
* request.send(function (err, data) { |
|
* if (err) console.log("Error:", err.code, err.message); |
|
* else console.log(data); |
|
* }); |
|
* |
|
* // abort request in 1 second |
|
* setTimeout(request.abort.bind(request), 1000); |
|
* |
|
* // prints "Error: RequestAbortedError Request aborted by user" |
|
* @return [AWS.Request] the same request object, for chaining. |
|
* @since v1.4.0 |
|
*/ |
|
abort: function abort() { |
|
this.removeAllListeners('validateResponse'); |
|
this.removeAllListeners('extractError'); |
|
this.on('validateResponse', function addAbortedError(resp) { |
|
resp.error = AWS.util.error(new Error('Request aborted by user'), { |
|
code: 'RequestAbortedError', retryable: false |
|
}); |
|
}); |
|
|
|
if (this.httpRequest.stream) { // abort HTTP stream |
|
this.httpRequest.stream.abort(); |
|
if (this.httpRequest._abortCallback) { |
|
this.httpRequest._abortCallback(); |
|
} else { |
|
this.removeAllListeners('send'); // haven't sent yet, so let's not |
|
} |
|
} |
|
|
|
return this; |
|
}, |
|
|
|
/** |
|
* Iterates over each page of results given a pageable request, calling |
|
* the provided callback with each page of data. After all pages have been |
|
* retrieved, the callback is called with `null` data. |
|
* |
|
* @note This operation can generate multiple requests to a service. |
|
* @example Iterating over multiple pages of objects in an S3 bucket |
|
* var pages = 1; |
|
* s3.listObjects().eachPage(function(err, data) { |
|
* if (err) return; |
|
* console.log("Page", pages++); |
|
* console.log(data); |
|
* }); |
|
* @example Iterating over multiple pages with an asynchronous callback |
|
* s3.listObjects(params).eachPage(function(err, data, done) { |
|
* doSomethingAsyncAndOrExpensive(function() { |
|
* // The next page of results isn't fetched until done is called |
|
* done(); |
|
* }); |
|
* }); |
|
* @callback callback function(err, data, [doneCallback]) |
|
* Called with each page of resulting data from the request. If the |
|
* optional `doneCallback` is provided in the function, it must be called |
|
* when the callback is complete. |
|
* |
|
* @param err [Error] an error object, if an error occurred. |
|
* @param data [Object] a single page of response data. If there is no |
|
* more data, this object will be `null`. |
|
* @param doneCallback [Function] an optional done callback. If this |
|
* argument is defined in the function declaration, it should be called |
|
* when the next page is ready to be retrieved. This is useful for |
|
* controlling serial pagination across asynchronous operations. |
|
* @return [Boolean] if the callback returns `false`, pagination will |
|
* stop. |
|
* |
|
* @see AWS.Request.eachItem |
|
* @see AWS.Response.nextPage |
|
* @since v1.4.0 |
|
*/ |
|
eachPage: function eachPage(callback) { |
|
// Make all callbacks async-ish |
|
callback = AWS.util.fn.makeAsync(callback, 3); |
|
|
|
function wrappedCallback(response) { |
|
callback.call(response, response.error, response.data, function (result) { |
|
if (result === false) return; |
|
|
|
if (response.hasNextPage()) { |
|
response.nextPage().on('complete', wrappedCallback).send(); |
|
} else { |
|
callback.call(response, null, null, AWS.util.fn.noop); |
|
} |
|
}); |
|
} |
|
|
|
this.on('complete', wrappedCallback).send(); |
|
}, |
|
|
|
/** |
|
* Enumerates over individual items of a request, paging the responses if |
|
* necessary. |
|
* |
|
* @api experimental |
|
* @since v1.4.0 |
|
*/ |
|
eachItem: function eachItem(callback) { |
|
var self = this; |
|
function wrappedCallback(err, data) { |
|
if (err) return callback(err, null); |
|
if (data === null) return callback(null, null); |
|
|
|
var config = self.service.paginationConfig(self.operation); |
|
var resultKey = config.resultKey; |
|
if (Array.isArray(resultKey)) resultKey = resultKey[0]; |
|
var items = jmespath.search(data, resultKey); |
|
var continueIteration = true; |
|
AWS.util.arrayEach(items, function(item) { |
|
continueIteration = callback(null, item); |
|
if (continueIteration === false) { |
|
return AWS.util.abort; |
|
} |
|
}); |
|
return continueIteration; |
|
} |
|
|
|
this.eachPage(wrappedCallback); |
|
}, |
|
|
|
/** |
|
* @return [Boolean] whether the operation can return multiple pages of |
|
* response data. |
|
* @see AWS.Response.eachPage |
|
* @since v1.4.0 |
|
*/ |
|
isPageable: function isPageable() { |
|
return this.service.paginationConfig(this.operation) ? true : false; |
|
}, |
|
|
|
/** |
|
* Converts the request object into a readable stream that |
|
* can be read from or piped into a writable stream. |
|
* |
|
* @note The data read from a readable stream contains only |
|
* the raw HTTP body contents. |
|
* @example Manually reading from a stream |
|
* request.createReadStream().on('data', function(data) { |
|
* console.log("Got data:", data.toString()); |
|
* }); |
|
* @example Piping a request body into a file |
|
* var out = fs.createWriteStream('/path/to/outfile.jpg'); |
|
* s3.service.getObject(params).createReadStream().pipe(out); |
|
* @return [Stream] the readable stream object that can be piped |
|
* or read from (by registering 'data' event listeners). |
|
* @!macro nobrowser |
|
*/ |
|
createReadStream: function createReadStream() { |
|
var streams = AWS.util.stream; |
|
var req = this; |
|
var stream = null; |
|
|
|
if (AWS.HttpClient.streamsApiVersion === 2) { |
|
stream = new streams.PassThrough(); |
|
req.send(); |
|
} else { |
|
stream = new streams.Stream(); |
|
stream.readable = true; |
|
|
|
stream.sent = false; |
|
stream.on('newListener', function(event) { |
|
if (!stream.sent && event === 'data') { |
|
stream.sent = true; |
|
process.nextTick(function() { req.send(); }); |
|
} |
|
}); |
|
} |
|
|
|
this.on('httpHeaders', function streamHeaders(statusCode, headers, resp) { |
|
if (statusCode < 300) { |
|
req.removeListener('httpData', AWS.EventListeners.Core.HTTP_DATA); |
|
req.removeListener('httpError', AWS.EventListeners.Core.HTTP_ERROR); |
|
req.on('httpError', function streamHttpError(error) { |
|
resp.error = error; |
|
resp.error.retryable = false; |
|
}); |
|
|
|
var shouldCheckContentLength = false; |
|
var expectedLen; |
|
if (req.httpRequest.method !== 'HEAD') { |
|
expectedLen = parseInt(headers['content-length'], 10); |
|
} |
|
if (expectedLen !== undefined && !isNaN(expectedLen) && expectedLen >= 0) { |
|
shouldCheckContentLength = true; |
|
var receivedLen = 0; |
|
} |
|
|
|
var checkContentLengthAndEmit = function checkContentLengthAndEmit() { |
|
if (shouldCheckContentLength && receivedLen !== expectedLen) { |
|
stream.emit('error', AWS.util.error( |
|
new Error('Stream content length mismatch. Received ' + |
|
receivedLen + ' of ' + expectedLen + ' bytes.'), |
|
{ code: 'StreamContentLengthMismatch' } |
|
)); |
|
} else if (AWS.HttpClient.streamsApiVersion === 2) { |
|
stream.end(); |
|
} else { |
|
stream.emit('end') |
|
} |
|
} |
|
|
|
var httpStream = resp.httpResponse.createUnbufferedStream(); |
|
|
|
if (AWS.HttpClient.streamsApiVersion === 2) { |
|
if (shouldCheckContentLength) { |
|
var lengthAccumulator = new streams.PassThrough(); |
|
lengthAccumulator._write = function(chunk) { |
|
if (chunk && chunk.length) { |
|
receivedLen += chunk.length; |
|
} |
|
return streams.PassThrough.prototype._write.apply(this, arguments); |
|
}; |
|
|
|
lengthAccumulator.on('end', checkContentLengthAndEmit); |
|
httpStream.pipe(lengthAccumulator).pipe(stream, { end: false }); |
|
} else { |
|
httpStream.pipe(stream); |
|
} |
|
} else { |
|
|
|
if (shouldCheckContentLength) { |
|
httpStream.on('data', function(arg) { |
|
if (arg && arg.length) { |
|
receivedLen += arg.length; |
|
} |
|
}); |
|
} |
|
|
|
httpStream.on('data', function(arg) { |
|
stream.emit('data', arg); |
|
}); |
|
httpStream.on('end', checkContentLengthAndEmit); |
|
} |
|
|
|
httpStream.on('error', function(err) { |
|
shouldCheckContentLength = false; |
|
stream.emit('error', err); |
|
}); |
|
} |
|
}); |
|
|
|
this.on('error', function(err) { |
|
stream.emit('error', err); |
|
}); |
|
|
|
return stream; |
|
}, |
|
|
|
/** |
|
* @param [Array,Response] args This should be the response object, |
|
* or an array of args to send to the event. |
|
* @api private |
|
*/ |
|
emitEvent: function emit(eventName, args, done) { |
|
if (typeof args === 'function') { done = args; args = null; } |
|
if (!done) done = function() { }; |
|
if (!args) args = this.eventParameters(eventName, this.response); |
|
|
|
var origEmit = AWS.SequentialExecutor.prototype.emit; |
|
origEmit.call(this, eventName, args, function (err) { |
|
if (err) this.response.error = err; |
|
done.call(this, err); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
eventParameters: function eventParameters(eventName) { |
|
switch (eventName) { |
|
case 'restart': |
|
case 'validate': |
|
case 'sign': |
|
case 'build': |
|
case 'afterValidate': |
|
case 'afterBuild': |
|
return [this]; |
|
case 'error': |
|
return [this.response.error, this.response]; |
|
default: |
|
return [this.response]; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
presign: function presign(expires, callback) { |
|
if (!callback && typeof expires === 'function') { |
|
callback = expires; |
|
expires = null; |
|
} |
|
return new AWS.Signers.Presign().sign(this.toGet(), expires, callback); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
isPresigned: function isPresigned() { |
|
return Object.prototype.hasOwnProperty.call(this.httpRequest.headers, 'presigned-expires'); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
toUnauthenticated: function toUnauthenticated() { |
|
this.removeListener('validate', AWS.EventListeners.Core.VALIDATE_CREDENTIALS); |
|
this.removeListener('sign', AWS.EventListeners.Core.SIGN); |
|
return this; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
toGet: function toGet() { |
|
if (this.service.api.protocol === 'query' || |
|
this.service.api.protocol === 'ec2') { |
|
this.removeListener('build', this.buildAsGet); |
|
this.addListener('build', this.buildAsGet); |
|
} |
|
return this; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
buildAsGet: function buildAsGet(request) { |
|
request.httpRequest.method = 'GET'; |
|
request.httpRequest.path = request.service.endpoint.path + |
|
'?' + request.httpRequest.body; |
|
request.httpRequest.body = ''; |
|
|
|
// don't need these headers on a GET request |
|
delete request.httpRequest.headers['Content-Length']; |
|
delete request.httpRequest.headers['Content-Type']; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
haltHandlersOnError: function haltHandlersOnError() { |
|
this._haltHandlersOnError = true; |
|
} |
|
}); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Request.addPromisesToClass = function addPromisesToClass(PromiseDependency) { |
|
this.prototype.promise = function promise() { |
|
var self = this; |
|
return new PromiseDependency(function(resolve, reject) { |
|
self.on('complete', function(resp) { |
|
if (resp.error) { |
|
reject(resp.error); |
|
} else { |
|
resolve(resp.data); |
|
} |
|
}); |
|
self.runTo(); |
|
}); |
|
}; |
|
}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Request.deletePromisesFromClass = function deletePromisesFromClass() { |
|
delete this.prototype.promise; |
|
}; |
|
|
|
AWS.util.addPromises(AWS.Request); |
|
|
|
AWS.util.mixin(AWS.Request, AWS.SequentialExecutor); |
|
|
|
}).call(this,require('_process')) |
|
},{"./core":14,"./state_machine":60,"_process":151,"jmespath":75}],45:[function(require,module,exports){ |
|
/** |
|
* Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"). You |
|
* may not use this file except in compliance with the License. A copy of |
|
* the License is located at |
|
* |
|
* http://aws.amazon.com/apache2.0/ |
|
* |
|
* or in the "license" file accompanying this file. This file is |
|
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF |
|
* ANY KIND, either express or implied. See the License for the specific |
|
* language governing permissions and limitations under the License. |
|
*/ |
|
|
|
var AWS = require('./core'); |
|
var inherit = AWS.util.inherit; |
|
var jmespath = require('jmespath'); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
function CHECK_ACCEPTORS(resp) { |
|
var waiter = resp.request._waiter; |
|
var acceptors = waiter.config.acceptors; |
|
var acceptorMatched = false; |
|
var state = 'retry'; |
|
|
|
acceptors.forEach(function(acceptor) { |
|
if (!acceptorMatched) { |
|
var matcher = waiter.matchers[acceptor.matcher]; |
|
if (matcher && matcher(resp, acceptor.expected, acceptor.argument)) { |
|
acceptorMatched = true; |
|
state = acceptor.state; |
|
} |
|
} |
|
}); |
|
|
|
if (!acceptorMatched && resp.error) state = 'failure'; |
|
|
|
if (state === 'success') { |
|
waiter.setSuccess(resp); |
|
} else { |
|
waiter.setError(resp, state === 'retry'); |
|
} |
|
} |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.ResourceWaiter = inherit({ |
|
/** |
|
* Waits for a given state on a service object |
|
* @param service [Service] the service object to wait on |
|
* @param state [String] the state (defined in waiter configuration) to wait |
|
* for. |
|
* @example Create a waiter for running EC2 instances |
|
* var ec2 = new AWS.EC2; |
|
* var waiter = new AWS.ResourceWaiter(ec2, 'instanceRunning'); |
|
*/ |
|
constructor: function constructor(service, state) { |
|
this.service = service; |
|
this.state = state; |
|
this.loadWaiterConfig(this.state); |
|
}, |
|
|
|
service: null, |
|
|
|
state: null, |
|
|
|
config: null, |
|
|
|
matchers: { |
|
path: function(resp, expected, argument) { |
|
var result = jmespath.search(resp.data, argument); |
|
return jmespath.strictDeepEqual(result,expected); |
|
}, |
|
|
|
pathAll: function(resp, expected, argument) { |
|
var results = jmespath.search(resp.data, argument); |
|
if (!Array.isArray(results)) results = [results]; |
|
var numResults = results.length; |
|
if (!numResults) return false; |
|
for (var ind = 0 ; ind < numResults; ind++) { |
|
if (!jmespath.strictDeepEqual(results[ind], expected)) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
}, |
|
|
|
pathAny: function(resp, expected, argument) { |
|
var results = jmespath.search(resp.data, argument); |
|
if (!Array.isArray(results)) results = [results]; |
|
var numResults = results.length; |
|
for (var ind = 0 ; ind < numResults; ind++) { |
|
if (jmespath.strictDeepEqual(results[ind], expected)) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
}, |
|
|
|
status: function(resp, expected) { |
|
var statusCode = resp.httpResponse.statusCode; |
|
return (typeof statusCode === 'number') && (statusCode === expected); |
|
}, |
|
|
|
error: function(resp, expected) { |
|
if (typeof expected === 'string' && resp.error) { |
|
return expected === resp.error.code; |
|
} |
|
// if expected is not string, can be boolean indicating presence of error |
|
return expected === !!resp.error; |
|
} |
|
}, |
|
|
|
listeners: new AWS.SequentialExecutor().addNamedListeners(function(add) { |
|
add('RETRY_CHECK', 'retry', function(resp) { |
|
var waiter = resp.request._waiter; |
|
if (resp.error && resp.error.code === 'ResourceNotReady') { |
|
resp.error.retryDelay = (waiter.config.delay || 0) * 1000; |
|
} |
|
}); |
|
|
|
add('CHECK_OUTPUT', 'extractData', CHECK_ACCEPTORS); |
|
|
|
add('CHECK_ERROR', 'extractError', CHECK_ACCEPTORS); |
|
}), |
|
|
|
/** |
|
* @return [AWS.Request] |
|
*/ |
|
wait: function wait(params, callback) { |
|
if (typeof params === 'function') { |
|
callback = params; params = undefined; |
|
} |
|
|
|
var request = this.service.makeRequest(this.config.operation, params); |
|
request._waiter = this; |
|
request.response.maxRetries = this.config.maxAttempts; |
|
request.addListeners(this.listeners); |
|
|
|
if (callback) request.send(callback); |
|
return request; |
|
}, |
|
|
|
setSuccess: function setSuccess(resp) { |
|
resp.error = null; |
|
resp.data = resp.data || {}; |
|
resp.request.removeAllListeners('extractData'); |
|
}, |
|
|
|
setError: function setError(resp, retryable) { |
|
resp.data = null; |
|
resp.error = AWS.util.error(resp.error || new Error(), { |
|
code: 'ResourceNotReady', |
|
message: 'Resource is not in the state ' + this.state, |
|
retryable: retryable |
|
}); |
|
}, |
|
|
|
/** |
|
* Loads waiter configuration from API configuration |
|
* |
|
* @api private |
|
*/ |
|
loadWaiterConfig: function loadWaiterConfig(state) { |
|
if (!this.service.api.waiters[state]) { |
|
throw new AWS.util.error(new Error(), { |
|
code: 'StateNotFoundError', |
|
message: 'State ' + state + ' not found.' |
|
}); |
|
} |
|
|
|
this.config = this.service.api.waiters[state]; |
|
} |
|
}); |
|
|
|
},{"./core":14,"jmespath":75}],46:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
var inherit = AWS.util.inherit; |
|
var jmespath = require('jmespath'); |
|
|
|
/** |
|
* This class encapsulates the response information |
|
* from a service request operation sent through {AWS.Request}. |
|
* The response object has two main properties for getting information |
|
* back from a request: |
|
* |
|
* ## The `data` property |
|
* |
|
* The `response.data` property contains the serialized object data |
|
* retrieved from the service request. For instance, for an |
|
* Amazon DynamoDB `listTables` method call, the response data might |
|
* look like: |
|
* |
|
* ``` |
|
* > resp.data |
|
* { TableNames: |
|
* [ 'table1', 'table2', ... ] } |
|
* ``` |
|
* |
|
* The `data` property can be null if an error occurs (see below). |
|
* |
|
* ## The `error` property |
|
* |
|
* In the event of a service error (or transfer error), the |
|
* `response.error` property will be filled with the given |
|
* error data in the form: |
|
* |
|
* ``` |
|
* { code: 'SHORT_UNIQUE_ERROR_CODE', |
|
* message: 'Some human readable error message' } |
|
* ``` |
|
* |
|
* In the case of an error, the `data` property will be `null`. |
|
* Note that if you handle events that can be in a failure state, |
|
* you should always check whether `response.error` is set |
|
* before attempting to access the `response.data` property. |
|
* |
|
* @!attribute data |
|
* @readonly |
|
* @!group Data Properties |
|
* @note Inside of a {AWS.Request~httpData} event, this |
|
* property contains a single raw packet instead of the |
|
* full de-serialized service response. |
|
* @return [Object] the de-serialized response data |
|
* from the service. |
|
* |
|
* @!attribute error |
|
* An structure containing information about a service |
|
* or networking error. |
|
* @readonly |
|
* @!group Data Properties |
|
* @note This attribute is only filled if a service or |
|
* networking error occurs. |
|
* @return [Error] |
|
* * code [String] a unique short code representing the |
|
* error that was emitted. |
|
* * message [String] a longer human readable error message |
|
* * retryable [Boolean] whether the error message is |
|
* retryable. |
|
* * statusCode [Numeric] in the case of a request that reached the service, |
|
* this value contains the response status code. |
|
* * time [Date] the date time object when the error occurred. |
|
* * hostname [String] set when a networking error occurs to easily |
|
* identify the endpoint of the request. |
|
* * region [String] set when a networking error occurs to easily |
|
* identify the region of the request. |
|
* |
|
* @!attribute requestId |
|
* @readonly |
|
* @!group Data Properties |
|
* @return [String] the unique request ID associated with the response. |
|
* Log this value when debugging requests for AWS support. |
|
* |
|
* @!attribute retryCount |
|
* @readonly |
|
* @!group Operation Properties |
|
* @return [Integer] the number of retries that were |
|
* attempted before the request was completed. |
|
* |
|
* @!attribute redirectCount |
|
* @readonly |
|
* @!group Operation Properties |
|
* @return [Integer] the number of redirects that were |
|
* followed before the request was completed. |
|
* |
|
* @!attribute httpResponse |
|
* @readonly |
|
* @!group HTTP Properties |
|
* @return [AWS.HttpResponse] the raw HTTP response object |
|
* containing the response headers and body information |
|
* from the server. |
|
* |
|
* @see AWS.Request |
|
*/ |
|
AWS.Response = inherit({ |
|
|
|
/** |
|
* @api private |
|
*/ |
|
constructor: function Response(request) { |
|
this.request = request; |
|
this.data = null; |
|
this.error = null; |
|
this.retryCount = 0; |
|
this.redirectCount = 0; |
|
this.httpResponse = new AWS.HttpResponse(); |
|
if (request) { |
|
this.maxRetries = request.service.numRetries(); |
|
this.maxRedirects = request.service.config.maxRedirects; |
|
} |
|
}, |
|
|
|
/** |
|
* Creates a new request for the next page of response data, calling the |
|
* callback with the page data if a callback is provided. |
|
* |
|
* @callback callback function(err, data) |
|
* Called when a page of data is returned from the next request. |
|
* |
|
* @param err [Error] an error object, if an error occurred in the request |
|
* @param data [Object] the next page of data, or null, if there are no |
|
* more pages left. |
|
* @return [AWS.Request] the request object for the next page of data |
|
* @return [null] if no callback is provided and there are no pages left |
|
* to retrieve. |
|
* @since v1.4.0 |
|
*/ |
|
nextPage: function nextPage(callback) { |
|
var config; |
|
var service = this.request.service; |
|
var operation = this.request.operation; |
|
try { |
|
config = service.paginationConfig(operation, true); |
|
} catch (e) { this.error = e; } |
|
|
|
if (!this.hasNextPage()) { |
|
if (callback) callback(this.error, null); |
|
else if (this.error) throw this.error; |
|
return null; |
|
} |
|
|
|
var params = AWS.util.copy(this.request.params); |
|
if (!this.nextPageTokens) { |
|
return callback ? callback(null, null) : null; |
|
} else { |
|
var inputTokens = config.inputToken; |
|
if (typeof inputTokens === 'string') inputTokens = [inputTokens]; |
|
for (var i = 0; i < inputTokens.length; i++) { |
|
params[inputTokens[i]] = this.nextPageTokens[i]; |
|
} |
|
return service.makeRequest(this.request.operation, params, callback); |
|
} |
|
}, |
|
|
|
/** |
|
* @return [Boolean] whether more pages of data can be returned by further |
|
* requests |
|
* @since v1.4.0 |
|
*/ |
|
hasNextPage: function hasNextPage() { |
|
this.cacheNextPageTokens(); |
|
if (this.nextPageTokens) return true; |
|
if (this.nextPageTokens === undefined) return undefined; |
|
else return false; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
cacheNextPageTokens: function cacheNextPageTokens() { |
|
if (Object.prototype.hasOwnProperty.call(this, 'nextPageTokens')) return this.nextPageTokens; |
|
this.nextPageTokens = undefined; |
|
|
|
var config = this.request.service.paginationConfig(this.request.operation); |
|
if (!config) return this.nextPageTokens; |
|
|
|
this.nextPageTokens = null; |
|
if (config.moreResults) { |
|
if (!jmespath.search(this.data, config.moreResults)) { |
|
return this.nextPageTokens; |
|
} |
|
} |
|
|
|
var exprs = config.outputToken; |
|
if (typeof exprs === 'string') exprs = [exprs]; |
|
AWS.util.arrayEach.call(this, exprs, function (expr) { |
|
var output = jmespath.search(this.data, expr); |
|
if (output) { |
|
this.nextPageTokens = this.nextPageTokens || []; |
|
this.nextPageTokens.push(output); |
|
} |
|
}); |
|
|
|
return this.nextPageTokens; |
|
} |
|
|
|
}); |
|
|
|
},{"./core":14,"jmespath":75}],47:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var byteLength = AWS.util.string.byteLength; |
|
var Buffer = AWS.util.Buffer; |
|
|
|
/** |
|
* The managed uploader allows for easy and efficient uploading of buffers, |
|
* blobs, or streams, using a configurable amount of concurrency to perform |
|
* multipart uploads where possible. This abstraction also enables uploading |
|
* streams of unknown size due to the use of multipart uploads. |
|
* |
|
* To construct a managed upload object, see the {constructor} function. |
|
* |
|
* ## Tracking upload progress |
|
* |
|
* The managed upload object can also track progress by attaching an |
|
* 'httpUploadProgress' listener to the upload manager. This event is similar |
|
* to {AWS.Request~httpUploadProgress} but groups all concurrent upload progress |
|
* into a single event. See {AWS.S3.ManagedUpload~httpUploadProgress} for more |
|
* information. |
|
* |
|
* ## Handling Multipart Cleanup |
|
* |
|
* By default, this class will automatically clean up any multipart uploads |
|
* when an individual part upload fails. This behavior can be disabled in order |
|
* to manually handle failures by setting the `leavePartsOnError` configuration |
|
* option to `true` when initializing the upload object. |
|
* |
|
* @!event httpUploadProgress(progress) |
|
* Triggered when the uploader has uploaded more data. |
|
* @note The `total` property may not be set if the stream being uploaded has |
|
* not yet finished chunking. In this case the `total` will be undefined |
|
* until the total stream size is known. |
|
* @note This event will not be emitted in Node.js 0.8.x. |
|
* @param progress [map] An object containing the `loaded` and `total` bytes |
|
* of the request and the `key` of the S3 object. Note that `total` may be undefined until the payload |
|
* size is known. |
|
* @context (see AWS.Request~send) |
|
*/ |
|
AWS.S3.ManagedUpload = AWS.util.inherit({ |
|
/** |
|
* Creates a managed upload object with a set of configuration options. |
|
* |
|
* @note A "Body" parameter is required to be set prior to calling {send}. |
|
* @option options params [map] a map of parameters to pass to the upload |
|
* requests. The "Body" parameter is required to be specified either on |
|
* the service or in the params option. |
|
* @note ContentMD5 should not be provided when using the managed upload object. |
|
* Instead, setting "computeChecksums" to true will enable automatic ContentMD5 generation |
|
* by the managed upload object. |
|
* @option options queueSize [Number] (4) the size of the concurrent queue |
|
* manager to upload parts in parallel. Set to 1 for synchronous uploading |
|
* of parts. Note that the uploader will buffer at most queueSize * partSize |
|
* bytes into memory at any given time. |
|
* @option options partSize [Number] (5mb) the size in bytes for each |
|
* individual part to be uploaded. Adjust the part size to ensure the number |
|
* of parts does not exceed {maxTotalParts}. See {minPartSize} for the |
|
* minimum allowed part size. |
|
* @option options leavePartsOnError [Boolean] (false) whether to abort the |
|
* multipart upload if an error occurs. Set to true if you want to handle |
|
* failures manually. |
|
* @option options service [AWS.S3] an optional S3 service object to use for |
|
* requests. This object might have bound parameters used by the uploader. |
|
* @example Creating a default uploader for a stream object |
|
* var upload = new AWS.S3.ManagedUpload({ |
|
* params: {Bucket: 'bucket', Key: 'key', Body: stream} |
|
* }); |
|
* @example Creating an uploader with concurrency of 1 and partSize of 10mb |
|
* var upload = new AWS.S3.ManagedUpload({ |
|
* partSize: 10 * 1024 * 1024, queueSize: 1, |
|
* params: {Bucket: 'bucket', Key: 'key', Body: stream} |
|
* }); |
|
* @see send |
|
*/ |
|
constructor: function ManagedUpload(options) { |
|
var self = this; |
|
AWS.SequentialExecutor.call(self); |
|
self.body = null; |
|
self.sliceFn = null; |
|
self.callback = null; |
|
self.parts = {}; |
|
self.completeInfo = []; |
|
self.fillQueue = function() { |
|
self.callback(new Error('Unsupported body payload ' + typeof self.body)); |
|
}; |
|
|
|
self.configure(options); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
configure: function configure(options) { |
|
options = options || {}; |
|
this.partSize = this.minPartSize; |
|
|
|
if (options.queueSize) this.queueSize = options.queueSize; |
|
if (options.partSize) this.partSize = options.partSize; |
|
if (options.leavePartsOnError) this.leavePartsOnError = true; |
|
|
|
if (this.partSize < this.minPartSize) { |
|
throw new Error('partSize must be greater than ' + |
|
this.minPartSize); |
|
} |
|
|
|
this.service = options.service; |
|
this.bindServiceObject(options.params); |
|
this.validateBody(); |
|
this.adjustTotalBytes(); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
leavePartsOnError: false, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
queueSize: 4, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
partSize: null, |
|
|
|
/** |
|
* @readonly |
|
* @return [Number] the minimum number of bytes for an individual part |
|
* upload. |
|
*/ |
|
minPartSize: 1024 * 1024 * 5, |
|
|
|
/** |
|
* @readonly |
|
* @return [Number] the maximum allowed number of parts in a multipart upload. |
|
*/ |
|
maxTotalParts: 10000, |
|
|
|
/** |
|
* Initiates the managed upload for the payload. |
|
* |
|
* @callback callback function(err, data) |
|
* @param err [Error] an error or null if no error occurred. |
|
* @param data [map] The response data from the successful upload: |
|
* * `Location` (String) the URL of the uploaded object |
|
* * `ETag` (String) the ETag of the uploaded object |
|
* * `Bucket` (String) the bucket to which the object was uploaded |
|
* * `Key` (String) the key to which the object was uploaded |
|
* @example Sending a managed upload object |
|
* var params = {Bucket: 'bucket', Key: 'key', Body: stream}; |
|
* var upload = new AWS.S3.ManagedUpload({params: params}); |
|
* upload.send(function(err, data) { |
|
* console.log(err, data); |
|
* }); |
|
*/ |
|
send: function(callback) { |
|
var self = this; |
|
self.failed = false; |
|
self.callback = callback || function(err) { if (err) throw err; }; |
|
|
|
var runFill = true; |
|
if (self.sliceFn) { |
|
self.fillQueue = self.fillBuffer; |
|
} else if (AWS.util.isNode()) { |
|
var Stream = AWS.util.stream.Stream; |
|
if (self.body instanceof Stream) { |
|
runFill = false; |
|
self.fillQueue = self.fillStream; |
|
self.partBuffers = []; |
|
self.body. |
|
on('error', function(err) { self.cleanup(err); }). |
|
on('readable', function() { self.fillQueue(); }). |
|
on('end', function() { |
|
self.isDoneChunking = true; |
|
self.numParts = self.totalPartNumbers; |
|
self.fillQueue.call(self); |
|
}); |
|
} |
|
} |
|
|
|
if (runFill) self.fillQueue.call(self); |
|
}, |
|
|
|
/** |
|
* @!method promise() |
|
* Returns a 'thenable' promise. |
|
* |
|
* Two callbacks can be provided to the `then` method on the returned promise. |
|
* The first callback will be called if the promise is fulfilled, and the second |
|
* callback will be called if the promise is rejected. |
|
* @callback fulfilledCallback function(data) |
|
* Called if the promise is fulfilled. |
|
* @param data [map] The response data from the successful upload: |
|
* `Location` (String) the URL of the uploaded object |
|
* `ETag` (String) the ETag of the uploaded object |
|
* `Bucket` (String) the bucket to which the object was uploaded |
|
* `Key` (String) the key to which the object was uploaded |
|
* @callback rejectedCallback function(err) |
|
* Called if the promise is rejected. |
|
* @param err [Error] an error or null if no error occurred. |
|
* @return [Promise] A promise that represents the state of the upload request. |
|
* @example Sending an upload request using promises. |
|
* var upload = s3.upload({Bucket: 'bucket', Key: 'key', Body: stream}); |
|
* var promise = upload.promise(); |
|
* promise.then(function(data) { ... }, function(err) { ... }); |
|
*/ |
|
|
|
/** |
|
* Aborts a managed upload, including all concurrent upload requests. |
|
* @note By default, calling this function will cleanup a multipart upload |
|
* if one was created. To leave the multipart upload around after aborting |
|
* a request, configure `leavePartsOnError` to `true` in the {constructor}. |
|
* @note Calling {abort} in the browser environment will not abort any requests |
|
* that are already in flight. If a multipart upload was created, any parts |
|
* not yet uploaded will not be sent, and the multipart upload will be cleaned up. |
|
* @example Aborting an upload |
|
* var params = { |
|
* Bucket: 'bucket', Key: 'key', |
|
* Body: new Buffer(1024 * 1024 * 25) // 25MB payload |
|
* }; |
|
* var upload = s3.upload(params); |
|
* upload.send(function (err, data) { |
|
* if (err) console.log("Error:", err.code, err.message); |
|
* else console.log(data); |
|
* }); |
|
* |
|
* // abort request in 1 second |
|
* setTimeout(upload.abort.bind(upload), 1000); |
|
*/ |
|
abort: function() { |
|
this.cleanup(AWS.util.error(new Error('Request aborted by user'), { |
|
code: 'RequestAbortedError', retryable: false |
|
})); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
validateBody: function validateBody() { |
|
var self = this; |
|
self.body = self.service.config.params.Body; |
|
if (!self.body) throw new Error('params.Body is required'); |
|
if (typeof self.body === 'string') { |
|
self.body = new AWS.util.Buffer(self.body); |
|
} |
|
self.sliceFn = AWS.util.arraySliceFn(self.body); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
bindServiceObject: function bindServiceObject(params) { |
|
params = params || {}; |
|
var self = this; |
|
|
|
// bind parameters to new service object |
|
if (!self.service) { |
|
self.service = new AWS.S3({params: params}); |
|
} else { |
|
var config = AWS.util.copy(self.service.config); |
|
self.service = new self.service.constructor.__super__(config); |
|
self.service.config.params = |
|
AWS.util.merge(self.service.config.params || {}, params); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
adjustTotalBytes: function adjustTotalBytes() { |
|
var self = this; |
|
try { // try to get totalBytes |
|
self.totalBytes = byteLength(self.body); |
|
} catch (e) { } |
|
|
|
// try to adjust partSize if we know payload length |
|
if (self.totalBytes) { |
|
var newPartSize = Math.ceil(self.totalBytes / self.maxTotalParts); |
|
if (newPartSize > self.partSize) self.partSize = newPartSize; |
|
} else { |
|
self.totalBytes = undefined; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
isDoneChunking: false, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
partPos: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
totalChunkedBytes: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
totalUploadedBytes: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
totalBytes: undefined, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
numParts: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
totalPartNumbers: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
activeParts: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
doneParts: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
parts: null, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
completeInfo: null, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
failed: false, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
multipartReq: null, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
partBuffers: null, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
partBufferLength: 0, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
fillBuffer: function fillBuffer() { |
|
var self = this; |
|
var bodyLen = byteLength(self.body); |
|
|
|
if (bodyLen === 0) { |
|
self.isDoneChunking = true; |
|
self.numParts = 1; |
|
self.nextChunk(self.body); |
|
return; |
|
} |
|
|
|
while (self.activeParts < self.queueSize && self.partPos < bodyLen) { |
|
var endPos = Math.min(self.partPos + self.partSize, bodyLen); |
|
var buf = self.sliceFn.call(self.body, self.partPos, endPos); |
|
self.partPos += self.partSize; |
|
|
|
if (byteLength(buf) < self.partSize || self.partPos === bodyLen) { |
|
self.isDoneChunking = true; |
|
self.numParts = self.totalPartNumbers + 1; |
|
} |
|
self.nextChunk(buf); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
fillStream: function fillStream() { |
|
var self = this; |
|
if (self.activeParts >= self.queueSize) return; |
|
|
|
var buf = self.body.read(self.partSize - self.partBufferLength) || |
|
self.body.read(); |
|
if (buf) { |
|
self.partBuffers.push(buf); |
|
self.partBufferLength += buf.length; |
|
self.totalChunkedBytes += buf.length; |
|
} |
|
|
|
if (self.partBufferLength >= self.partSize) { |
|
// if we have single buffer we avoid copyfull concat |
|
var pbuf = self.partBuffers.length === 1 ? |
|
self.partBuffers[0] : Buffer.concat(self.partBuffers); |
|
self.partBuffers = []; |
|
self.partBufferLength = 0; |
|
|
|
// if we have more than partSize, push the rest back on the queue |
|
if (pbuf.length > self.partSize) { |
|
var rest = pbuf.slice(self.partSize); |
|
self.partBuffers.push(rest); |
|
self.partBufferLength += rest.length; |
|
pbuf = pbuf.slice(0, self.partSize); |
|
} |
|
|
|
self.nextChunk(pbuf); |
|
} |
|
|
|
if (self.isDoneChunking && !self.isDoneSending) { |
|
// if we have single buffer we avoid copyfull concat |
|
pbuf = self.partBuffers.length === 1 ? |
|
self.partBuffers[0] : Buffer.concat(self.partBuffers); |
|
self.partBuffers = []; |
|
self.partBufferLength = 0; |
|
self.totalBytes = self.totalChunkedBytes; |
|
self.isDoneSending = true; |
|
|
|
if (self.numParts === 0 || pbuf.length > 0) { |
|
self.numParts++; |
|
self.nextChunk(pbuf); |
|
} |
|
} |
|
|
|
self.body.read(0); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
nextChunk: function nextChunk(chunk) { |
|
var self = this; |
|
if (self.failed) return null; |
|
|
|
var partNumber = ++self.totalPartNumbers; |
|
if (self.isDoneChunking && partNumber === 1) { |
|
var req = self.service.putObject({Body: chunk}); |
|
req._managedUpload = self; |
|
req.on('httpUploadProgress', self.progress).send(self.finishSinglePart); |
|
return null; |
|
} else if (self.service.config.params.ContentMD5) { |
|
var err = AWS.util.error(new Error('The Content-MD5 you specified is invalid for multi-part uploads.'), { |
|
code: 'InvalidDigest', retryable: false |
|
}); |
|
|
|
self.cleanup(err); |
|
return null; |
|
} |
|
|
|
if (self.completeInfo[partNumber] && self.completeInfo[partNumber].ETag !== null) { |
|
return null; // Already uploaded this part. |
|
} |
|
|
|
self.activeParts++; |
|
if (!self.service.config.params.UploadId) { |
|
|
|
if (!self.multipartReq) { // create multipart |
|
self.multipartReq = self.service.createMultipartUpload(); |
|
self.multipartReq.on('success', function(resp) { |
|
self.service.config.params.UploadId = resp.data.UploadId; |
|
self.multipartReq = null; |
|
}); |
|
self.queueChunks(chunk, partNumber); |
|
self.multipartReq.on('error', function(err) { |
|
self.cleanup(err); |
|
}); |
|
self.multipartReq.send(); |
|
} else { |
|
self.queueChunks(chunk, partNumber); |
|
} |
|
} else { // multipart is created, just send |
|
self.uploadPart(chunk, partNumber); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
uploadPart: function uploadPart(chunk, partNumber) { |
|
var self = this; |
|
|
|
var partParams = { |
|
Body: chunk, |
|
ContentLength: AWS.util.string.byteLength(chunk), |
|
PartNumber: partNumber |
|
}; |
|
|
|
var partInfo = {ETag: null, PartNumber: partNumber}; |
|
self.completeInfo[partNumber] = partInfo; |
|
|
|
var req = self.service.uploadPart(partParams); |
|
self.parts[partNumber] = req; |
|
req._lastUploadedBytes = 0; |
|
req._managedUpload = self; |
|
req.on('httpUploadProgress', self.progress); |
|
req.send(function(err, data) { |
|
delete self.parts[partParams.PartNumber]; |
|
self.activeParts--; |
|
|
|
if (!err && (!data || !data.ETag)) { |
|
var message = 'No access to ETag property on response.'; |
|
if (AWS.util.isBrowser()) { |
|
message += ' Check CORS configuration to expose ETag header.'; |
|
} |
|
|
|
err = AWS.util.error(new Error(message), { |
|
code: 'ETagMissing', retryable: false |
|
}); |
|
} |
|
if (err) return self.cleanup(err); |
|
|
|
partInfo.ETag = data.ETag; |
|
self.doneParts++; |
|
if (self.isDoneChunking && self.doneParts === self.numParts) { |
|
self.finishMultiPart(); |
|
} else { |
|
self.fillQueue.call(self); |
|
} |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
queueChunks: function queueChunks(chunk, partNumber) { |
|
var self = this; |
|
self.multipartReq.on('success', function() { |
|
self.uploadPart(chunk, partNumber); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
cleanup: function cleanup(err) { |
|
var self = this; |
|
if (self.failed) return; |
|
|
|
// clean up stream |
|
if (typeof self.body.removeAllListeners === 'function' && |
|
typeof self.body.resume === 'function') { |
|
self.body.removeAllListeners('readable'); |
|
self.body.removeAllListeners('end'); |
|
self.body.resume(); |
|
} |
|
|
|
if (self.service.config.params.UploadId && !self.leavePartsOnError) { |
|
self.service.abortMultipartUpload().send(); |
|
} |
|
|
|
AWS.util.each(self.parts, function(partNumber, part) { |
|
part.removeAllListeners('complete'); |
|
part.abort(); |
|
}); |
|
|
|
self.activeParts = 0; |
|
self.partPos = 0; |
|
self.numParts = 0; |
|
self.totalPartNumbers = 0; |
|
self.parts = {}; |
|
self.failed = true; |
|
self.callback(err); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
finishMultiPart: function finishMultiPart() { |
|
var self = this; |
|
var completeParams = { MultipartUpload: { Parts: self.completeInfo.slice(1) } }; |
|
self.service.completeMultipartUpload(completeParams, function(err, data) { |
|
if (err) return self.cleanup(err); |
|
else self.callback(err, data); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
finishSinglePart: function finishSinglePart(err, data) { |
|
var upload = this.request._managedUpload; |
|
var httpReq = this.request.httpRequest; |
|
var endpoint = httpReq.endpoint; |
|
if (err) return upload.callback(err); |
|
data.Location = |
|
[endpoint.protocol, '//', endpoint.host, httpReq.path].join(''); |
|
data.key = this.request.params.Key; // will stay undocumented |
|
data.Key = this.request.params.Key; |
|
data.Bucket = this.request.params.Bucket; |
|
upload.callback(err, data); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
progress: function progress(info) { |
|
var upload = this._managedUpload; |
|
if (this.operation === 'putObject') { |
|
info.part = 1; |
|
info.key = this.params.Key; |
|
} else { |
|
upload.totalUploadedBytes += info.loaded - this._lastUploadedBytes; |
|
this._lastUploadedBytes = info.loaded; |
|
info = { |
|
loaded: upload.totalUploadedBytes, |
|
total: upload.totalBytes, |
|
part: this.params.PartNumber, |
|
key: this.params.Key |
|
}; |
|
} |
|
upload.emit('httpUploadProgress', [info]); |
|
} |
|
}); |
|
|
|
AWS.util.mixin(AWS.S3.ManagedUpload, AWS.SequentialExecutor); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.S3.ManagedUpload.addPromisesToClass = function addPromisesToClass(PromiseDependency) { |
|
this.prototype.promise = AWS.util.promisifyMethod('send', PromiseDependency); |
|
}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.S3.ManagedUpload.deletePromisesFromClass = function deletePromisesFromClass() { |
|
delete this.prototype.promise; |
|
}; |
|
|
|
AWS.util.addPromises(AWS.S3.ManagedUpload); |
|
|
|
module.exports = AWS.S3.ManagedUpload; |
|
|
|
},{"../core":14}],48:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
|
|
/** |
|
* @api private |
|
* @!method on(eventName, callback) |
|
* Registers an event listener callback for the event given by `eventName`. |
|
* Parameters passed to the callback function depend on the individual event |
|
* being triggered. See the event documentation for those parameters. |
|
* |
|
* @param eventName [String] the event name to register the listener for |
|
* @param callback [Function] the listener callback function |
|
* @return [AWS.SequentialExecutor] the same object for chaining |
|
*/ |
|
AWS.SequentialExecutor = AWS.util.inherit({ |
|
|
|
constructor: function SequentialExecutor() { |
|
this._events = {}; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
listeners: function listeners(eventName) { |
|
return this._events[eventName] ? this._events[eventName].slice(0) : []; |
|
}, |
|
|
|
on: function on(eventName, listener) { |
|
if (this._events[eventName]) { |
|
this._events[eventName].push(listener); |
|
} else { |
|
this._events[eventName] = [listener]; |
|
} |
|
return this; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
onAsync: function onAsync(eventName, listener) { |
|
listener._isAsync = true; |
|
return this.on(eventName, listener); |
|
}, |
|
|
|
removeListener: function removeListener(eventName, listener) { |
|
var listeners = this._events[eventName]; |
|
if (listeners) { |
|
var length = listeners.length; |
|
var position = -1; |
|
for (var i = 0; i < length; ++i) { |
|
if (listeners[i] === listener) { |
|
position = i; |
|
} |
|
} |
|
if (position > -1) { |
|
listeners.splice(position, 1); |
|
} |
|
} |
|
return this; |
|
}, |
|
|
|
removeAllListeners: function removeAllListeners(eventName) { |
|
if (eventName) { |
|
delete this._events[eventName]; |
|
} else { |
|
this._events = {}; |
|
} |
|
return this; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
emit: function emit(eventName, eventArgs, doneCallback) { |
|
if (!doneCallback) doneCallback = function() { }; |
|
var listeners = this.listeners(eventName); |
|
var count = listeners.length; |
|
this.callListeners(listeners, eventArgs, doneCallback); |
|
return count > 0; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
callListeners: function callListeners(listeners, args, doneCallback, prevError) { |
|
var self = this; |
|
var error = prevError || null; |
|
|
|
function callNextListener(err) { |
|
if (err) { |
|
error = AWS.util.error(error || new Error(), err); |
|
if (self._haltHandlersOnError) { |
|
return doneCallback.call(self, error); |
|
} |
|
} |
|
self.callListeners(listeners, args, doneCallback, error); |
|
} |
|
|
|
while (listeners.length > 0) { |
|
var listener = listeners.shift(); |
|
if (listener._isAsync) { // asynchronous listener |
|
listener.apply(self, args.concat([callNextListener])); |
|
return; // stop here, callNextListener will continue |
|
} else { // synchronous listener |
|
try { |
|
listener.apply(self, args); |
|
} catch (err) { |
|
error = AWS.util.error(error || new Error(), err); |
|
} |
|
if (error && self._haltHandlersOnError) { |
|
doneCallback.call(self, error); |
|
return; |
|
} |
|
} |
|
} |
|
doneCallback.call(self, error); |
|
}, |
|
|
|
/** |
|
* Adds or copies a set of listeners from another list of |
|
* listeners or SequentialExecutor object. |
|
* |
|
* @param listeners [map<String,Array<Function>>, AWS.SequentialExecutor] |
|
* a list of events and callbacks, or an event emitter object |
|
* containing listeners to add to this emitter object. |
|
* @return [AWS.SequentialExecutor] the emitter object, for chaining. |
|
* @example Adding listeners from a map of listeners |
|
* emitter.addListeners({ |
|
* event1: [function() { ... }, function() { ... }], |
|
* event2: [function() { ... }] |
|
* }); |
|
* emitter.emit('event1'); // emitter has event1 |
|
* emitter.emit('event2'); // emitter has event2 |
|
* @example Adding listeners from another emitter object |
|
* var emitter1 = new AWS.SequentialExecutor(); |
|
* emitter1.on('event1', function() { ... }); |
|
* emitter1.on('event2', function() { ... }); |
|
* var emitter2 = new AWS.SequentialExecutor(); |
|
* emitter2.addListeners(emitter1); |
|
* emitter2.emit('event1'); // emitter2 has event1 |
|
* emitter2.emit('event2'); // emitter2 has event2 |
|
*/ |
|
addListeners: function addListeners(listeners) { |
|
var self = this; |
|
|
|
// extract listeners if parameter is an SequentialExecutor object |
|
if (listeners._events) listeners = listeners._events; |
|
|
|
AWS.util.each(listeners, function(event, callbacks) { |
|
if (typeof callbacks === 'function') callbacks = [callbacks]; |
|
AWS.util.arrayEach(callbacks, function(callback) { |
|
self.on(event, callback); |
|
}); |
|
}); |
|
|
|
return self; |
|
}, |
|
|
|
/** |
|
* Registers an event with {on} and saves the callback handle function |
|
* as a property on the emitter object using a given `name`. |
|
* |
|
* @param name [String] the property name to set on this object containing |
|
* the callback function handle so that the listener can be removed in |
|
* the future. |
|
* @param (see on) |
|
* @return (see on) |
|
* @example Adding a named listener DATA_CALLBACK |
|
* var listener = function() { doSomething(); }; |
|
* emitter.addNamedListener('DATA_CALLBACK', 'data', listener); |
|
* |
|
* // the following prints: true |
|
* console.log(emitter.DATA_CALLBACK == listener); |
|
*/ |
|
addNamedListener: function addNamedListener(name, eventName, callback) { |
|
this[name] = callback; |
|
this.addListener(eventName, callback); |
|
return this; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
addNamedAsyncListener: function addNamedAsyncListener(name, eventName, callback) { |
|
callback._isAsync = true; |
|
return this.addNamedListener(name, eventName, callback); |
|
}, |
|
|
|
/** |
|
* Helper method to add a set of named listeners using |
|
* {addNamedListener}. The callback contains a parameter |
|
* with a handle to the `addNamedListener` method. |
|
* |
|
* @callback callback function(add) |
|
* The callback function is called immediately in order to provide |
|
* the `add` function to the block. This simplifies the addition of |
|
* a large group of named listeners. |
|
* @param add [Function] the {addNamedListener} function to call |
|
* when registering listeners. |
|
* @example Adding a set of named listeners |
|
* emitter.addNamedListeners(function(add) { |
|
* add('DATA_CALLBACK', 'data', function() { ... }); |
|
* add('OTHER', 'otherEvent', function() { ... }); |
|
* add('LAST', 'lastEvent', function() { ... }); |
|
* }); |
|
* |
|
* // these properties are now set: |
|
* emitter.DATA_CALLBACK; |
|
* emitter.OTHER; |
|
* emitter.LAST; |
|
*/ |
|
addNamedListeners: function addNamedListeners(callback) { |
|
var self = this; |
|
callback( |
|
function() { |
|
self.addNamedListener.apply(self, arguments); |
|
}, |
|
function() { |
|
self.addNamedAsyncListener.apply(self, arguments); |
|
} |
|
); |
|
return this; |
|
} |
|
}); |
|
|
|
/** |
|
* {on} is the prefered method. |
|
* @api private |
|
*/ |
|
AWS.SequentialExecutor.prototype.addListener = AWS.SequentialExecutor.prototype.on; |
|
|
|
module.exports = AWS.SequentialExecutor; |
|
|
|
},{"./core":14}],49:[function(require,module,exports){ |
|
var AWS = require('./core'); |
|
var Api = require('./model/api'); |
|
var regionConfig = require('./region_config'); |
|
var inherit = AWS.util.inherit; |
|
var clientCount = 0; |
|
|
|
/** |
|
* The service class representing an AWS service. |
|
* |
|
* @abstract |
|
* |
|
* @!attribute apiVersions |
|
* @return [Array<String>] the list of API versions supported by this service. |
|
* @readonly |
|
*/ |
|
AWS.Service = inherit({ |
|
/** |
|
* Create a new service object with a configuration object |
|
* |
|
* @param config [map] a map of configuration options |
|
*/ |
|
constructor: function Service(config) { |
|
if (!this.loadServiceClass) { |
|
throw AWS.util.error(new Error(), |
|
'Service must be constructed with `new\' operator'); |
|
} |
|
var ServiceClass = this.loadServiceClass(config || {}); |
|
if (ServiceClass) { |
|
var originalConfig = AWS.util.copy(config); |
|
var svc = new ServiceClass(config); |
|
Object.defineProperty(svc, '_originalConfig', { |
|
get: function() { return originalConfig; }, |
|
enumerable: false, |
|
configurable: true |
|
}); |
|
svc._clientId = ++clientCount; |
|
return svc; |
|
} |
|
this.initialize(config); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
initialize: function initialize(config) { |
|
var svcConfig = AWS.config[this.serviceIdentifier]; |
|
|
|
this.config = new AWS.Config(AWS.config); |
|
if (svcConfig) this.config.update(svcConfig, true); |
|
if (config) this.config.update(config, true); |
|
|
|
this.validateService(); |
|
if (!this.config.endpoint) regionConfig(this); |
|
|
|
this.config.endpoint = this.endpointFromTemplate(this.config.endpoint); |
|
this.setEndpoint(this.config.endpoint); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
validateService: function validateService() { |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
loadServiceClass: function loadServiceClass(serviceConfig) { |
|
var config = serviceConfig; |
|
if (!AWS.util.isEmpty(this.api)) { |
|
return null; |
|
} else if (config.apiConfig) { |
|
return AWS.Service.defineServiceApi(this.constructor, config.apiConfig); |
|
} else if (!this.constructor.services) { |
|
return null; |
|
} else { |
|
config = new AWS.Config(AWS.config); |
|
config.update(serviceConfig, true); |
|
var version = config.apiVersions[this.constructor.serviceIdentifier]; |
|
version = version || config.apiVersion; |
|
return this.getLatestServiceClass(version); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
getLatestServiceClass: function getLatestServiceClass(version) { |
|
version = this.getLatestServiceVersion(version); |
|
if (this.constructor.services[version] === null) { |
|
AWS.Service.defineServiceApi(this.constructor, version); |
|
} |
|
|
|
return this.constructor.services[version]; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
getLatestServiceVersion: function getLatestServiceVersion(version) { |
|
if (!this.constructor.services || this.constructor.services.length === 0) { |
|
throw new Error('No services defined on ' + |
|
this.constructor.serviceIdentifier); |
|
} |
|
|
|
if (!version) { |
|
version = 'latest'; |
|
} else if (AWS.util.isType(version, Date)) { |
|
version = AWS.util.date.iso8601(version).split('T')[0]; |
|
} |
|
|
|
if (Object.hasOwnProperty(this.constructor.services, version)) { |
|
return version; |
|
} |
|
|
|
var keys = Object.keys(this.constructor.services).sort(); |
|
var selectedVersion = null; |
|
for (var i = keys.length - 1; i >= 0; i--) { |
|
// versions that end in "*" are not available on disk and can be |
|
// skipped, so do not choose these as selectedVersions |
|
if (keys[i][keys[i].length - 1] !== '*') { |
|
selectedVersion = keys[i]; |
|
} |
|
if (keys[i].substr(0, 10) <= version) { |
|
return selectedVersion; |
|
} |
|
} |
|
|
|
throw new Error('Could not find ' + this.constructor.serviceIdentifier + |
|
' API to satisfy version constraint `' + version + '\''); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
api: {}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
defaultRetryCount: 3, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
customizeRequests: function customizeRequests(callback) { |
|
if (!callback) { |
|
this.customRequestHandler = null; |
|
} else if (typeof callback === 'function') { |
|
this.customRequestHandler = callback; |
|
} else { |
|
throw new Error('Invalid callback type \'' + typeof callback + '\' provided in customizeRequests'); |
|
} |
|
}, |
|
|
|
/** |
|
* Calls an operation on a service with the given input parameters. |
|
* |
|
* @param operation [String] the name of the operation to call on the service. |
|
* @param params [map] a map of input options for the operation |
|
* @callback callback function(err, data) |
|
* If a callback is supplied, it is called when a response is returned |
|
* from the service. |
|
* @param err [Error] the error object returned from the request. |
|
* Set to `null` if the request is successful. |
|
* @param data [Object] the de-serialized data returned from |
|
* the request. Set to `null` if a request error occurs. |
|
*/ |
|
makeRequest: function makeRequest(operation, params, callback) { |
|
if (typeof params === 'function') { |
|
callback = params; |
|
params = null; |
|
} |
|
|
|
params = params || {}; |
|
if (this.config.params) { // copy only toplevel bound params |
|
var rules = this.api.operations[operation]; |
|
if (rules) { |
|
params = AWS.util.copy(params); |
|
AWS.util.each(this.config.params, function(key, value) { |
|
if (rules.input.members[key]) { |
|
if (params[key] === undefined || params[key] === null) { |
|
params[key] = value; |
|
} |
|
} |
|
}); |
|
} |
|
} |
|
|
|
var request = new AWS.Request(this, operation, params); |
|
this.addAllRequestListeners(request); |
|
|
|
if (callback) request.send(callback); |
|
return request; |
|
}, |
|
|
|
/** |
|
* Calls an operation on a service with the given input parameters, without |
|
* any authentication data. This method is useful for "public" API operations. |
|
* |
|
* @param operation [String] the name of the operation to call on the service. |
|
* @param params [map] a map of input options for the operation |
|
* @callback callback function(err, data) |
|
* If a callback is supplied, it is called when a response is returned |
|
* from the service. |
|
* @param err [Error] the error object returned from the request. |
|
* Set to `null` if the request is successful. |
|
* @param data [Object] the de-serialized data returned from |
|
* the request. Set to `null` if a request error occurs. |
|
*/ |
|
makeUnauthenticatedRequest: function makeUnauthenticatedRequest(operation, params, callback) { |
|
if (typeof params === 'function') { |
|
callback = params; |
|
params = {}; |
|
} |
|
|
|
var request = this.makeRequest(operation, params).toUnauthenticated(); |
|
return callback ? request.send(callback) : request; |
|
}, |
|
|
|
/** |
|
* Waits for a given state |
|
* |
|
* @param state [String] the state on the service to wait for |
|
* @param params [map] a map of parameters to pass with each request |
|
* @callback callback function(err, data) |
|
* If a callback is supplied, it is called when a response is returned |
|
* from the service. |
|
* @param err [Error] the error object returned from the request. |
|
* Set to `null` if the request is successful. |
|
* @param data [Object] the de-serialized data returned from |
|
* the request. Set to `null` if a request error occurs. |
|
*/ |
|
waitFor: function waitFor(state, params, callback) { |
|
var waiter = new AWS.ResourceWaiter(this, state); |
|
return waiter.wait(params, callback); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
addAllRequestListeners: function addAllRequestListeners(request) { |
|
var list = [AWS.events, AWS.EventListeners.Core, this.serviceInterface(), |
|
AWS.EventListeners.CorePost]; |
|
for (var i = 0; i < list.length; i++) { |
|
if (list[i]) request.addListeners(list[i]); |
|
} |
|
|
|
// disable parameter validation |
|
if (!this.config.paramValidation) { |
|
request.removeListener('validate', |
|
AWS.EventListeners.Core.VALIDATE_PARAMETERS); |
|
} |
|
|
|
if (this.config.logger) { // add logging events |
|
request.addListeners(AWS.EventListeners.Logger); |
|
} |
|
|
|
this.setupRequestListeners(request); |
|
// call prototype's customRequestHandler |
|
if (typeof this.constructor.prototype.customRequestHandler === 'function') { |
|
this.constructor.prototype.customRequestHandler(request); |
|
} |
|
// call instance's customRequestHandler |
|
if (Object.prototype.hasOwnProperty.call(this, 'customRequestHandler') && typeof this.customRequestHandler === 'function') { |
|
this.customRequestHandler(request); |
|
} |
|
}, |
|
|
|
/** |
|
* Override this method to setup any custom request listeners for each |
|
* new request to the service. |
|
* |
|
* @abstract |
|
*/ |
|
setupRequestListeners: function setupRequestListeners() { |
|
}, |
|
|
|
/** |
|
* Gets the signer class for a given request |
|
* @api private |
|
*/ |
|
getSignerClass: function getSignerClass() { |
|
var version; |
|
if (this.config.signatureVersion) { |
|
version = this.config.signatureVersion; |
|
} else { |
|
version = this.api.signatureVersion; |
|
} |
|
return AWS.Signers.RequestSigner.getVersion(version); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
serviceInterface: function serviceInterface() { |
|
switch (this.api.protocol) { |
|
case 'ec2': return AWS.EventListeners.Query; |
|
case 'query': return AWS.EventListeners.Query; |
|
case 'json': return AWS.EventListeners.Json; |
|
case 'rest-json': return AWS.EventListeners.RestJson; |
|
case 'rest-xml': return AWS.EventListeners.RestXml; |
|
} |
|
if (this.api.protocol) { |
|
throw new Error('Invalid service `protocol\' ' + |
|
this.api.protocol + ' in API config'); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
successfulResponse: function successfulResponse(resp) { |
|
return resp.httpResponse.statusCode < 300; |
|
}, |
|
|
|
/** |
|
* How many times a failed request should be retried before giving up. |
|
* the defaultRetryCount can be overriden by service classes. |
|
* |
|
* @api private |
|
*/ |
|
numRetries: function numRetries() { |
|
if (this.config.maxRetries !== undefined) { |
|
return this.config.maxRetries; |
|
} else { |
|
return this.defaultRetryCount; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
retryDelays: function retryDelays(retryCount) { |
|
return AWS.util.calculateRetryDelay(retryCount, this.config.retryDelayOptions); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
retryableError: function retryableError(error) { |
|
if (this.networkingError(error)) return true; |
|
if (this.expiredCredentialsError(error)) return true; |
|
if (this.throttledError(error)) return true; |
|
if (error.statusCode >= 500) return true; |
|
return false; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
networkingError: function networkingError(error) { |
|
return error.code === 'NetworkingError'; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
expiredCredentialsError: function expiredCredentialsError(error) { |
|
// TODO : this only handles *one* of the expired credential codes |
|
return (error.code === 'ExpiredTokenException'); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
clockSkewError: function clockSkewError(error) { |
|
switch (error.code) { |
|
case 'RequestTimeTooSkewed': |
|
case 'RequestExpired': |
|
case 'InvalidSignatureException': |
|
case 'SignatureDoesNotMatch': |
|
case 'AuthFailure': |
|
case 'RequestInTheFuture': |
|
return true; |
|
default: return false; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
throttledError: function throttledError(error) { |
|
// this logic varies between services |
|
switch (error.code) { |
|
case 'ProvisionedThroughputExceededException': |
|
case 'Throttling': |
|
case 'ThrottlingException': |
|
case 'RequestLimitExceeded': |
|
case 'RequestThrottled': |
|
return true; |
|
default: |
|
return false; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
endpointFromTemplate: function endpointFromTemplate(endpoint) { |
|
if (typeof endpoint !== 'string') return endpoint; |
|
|
|
var e = endpoint; |
|
e = e.replace(/\{service\}/g, this.api.endpointPrefix); |
|
e = e.replace(/\{region\}/g, this.config.region); |
|
e = e.replace(/\{scheme\}/g, this.config.sslEnabled ? 'https' : 'http'); |
|
return e; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
setEndpoint: function setEndpoint(endpoint) { |
|
this.endpoint = new AWS.Endpoint(endpoint, this.config); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
paginationConfig: function paginationConfig(operation, throwException) { |
|
var paginator = this.api.operations[operation].paginator; |
|
if (!paginator) { |
|
if (throwException) { |
|
var e = new Error(); |
|
throw AWS.util.error(e, 'No pagination configuration for ' + operation); |
|
} |
|
return null; |
|
} |
|
|
|
return paginator; |
|
} |
|
}); |
|
|
|
AWS.util.update(AWS.Service, { |
|
|
|
/** |
|
* Adds one method for each operation described in the api configuration |
|
* |
|
* @api private |
|
*/ |
|
defineMethods: function defineMethods(svc) { |
|
AWS.util.each(svc.prototype.api.operations, function iterator(method) { |
|
if (svc.prototype[method]) return; |
|
var operation = svc.prototype.api.operations[method]; |
|
if (operation.authtype === 'none') { |
|
svc.prototype[method] = function (params, callback) { |
|
return this.makeUnauthenticatedRequest(method, params, callback); |
|
}; |
|
} else { |
|
svc.prototype[method] = function (params, callback) { |
|
return this.makeRequest(method, params, callback); |
|
}; |
|
} |
|
}); |
|
}, |
|
|
|
/** |
|
* Defines a new Service class using a service identifier and list of versions |
|
* including an optional set of features (functions) to apply to the class |
|
* prototype. |
|
* |
|
* @param serviceIdentifier [String] the identifier for the service |
|
* @param versions [Array<String>] a list of versions that work with this |
|
* service |
|
* @param features [Object] an object to attach to the prototype |
|
* @return [Class<Service>] the service class defined by this function. |
|
*/ |
|
defineService: function defineService(serviceIdentifier, versions, features) { |
|
AWS.Service._serviceMap[serviceIdentifier] = true; |
|
if (!Array.isArray(versions)) { |
|
features = versions; |
|
versions = []; |
|
} |
|
|
|
var svc = inherit(AWS.Service, features || {}); |
|
|
|
if (typeof serviceIdentifier === 'string') { |
|
AWS.Service.addVersions(svc, versions); |
|
|
|
var identifier = svc.serviceIdentifier || serviceIdentifier; |
|
svc.serviceIdentifier = identifier; |
|
} else { // defineService called with an API |
|
svc.prototype.api = serviceIdentifier; |
|
AWS.Service.defineMethods(svc); |
|
} |
|
|
|
return svc; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
addVersions: function addVersions(svc, versions) { |
|
if (!Array.isArray(versions)) versions = [versions]; |
|
|
|
svc.services = svc.services || {}; |
|
for (var i = 0; i < versions.length; i++) { |
|
if (svc.services[versions[i]] === undefined) { |
|
svc.services[versions[i]] = null; |
|
} |
|
} |
|
|
|
svc.apiVersions = Object.keys(svc.services).sort(); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
defineServiceApi: function defineServiceApi(superclass, version, apiConfig) { |
|
var svc = inherit(superclass, { |
|
serviceIdentifier: superclass.serviceIdentifier |
|
}); |
|
|
|
function setApi(api) { |
|
if (api.isApi) { |
|
svc.prototype.api = api; |
|
} else { |
|
svc.prototype.api = new Api(api); |
|
} |
|
} |
|
|
|
if (typeof version === 'string') { |
|
if (apiConfig) { |
|
setApi(apiConfig); |
|
} else { |
|
try { |
|
setApi(AWS.apiLoader(superclass.serviceIdentifier, version)); |
|
} catch (err) { |
|
throw AWS.util.error(err, { |
|
message: 'Could not find API configuration ' + |
|
superclass.serviceIdentifier + '-' + version |
|
}); |
|
} |
|
} |
|
if (!Object.prototype.hasOwnProperty.call(superclass.services, version)) { |
|
superclass.apiVersions = superclass.apiVersions.concat(version).sort(); |
|
} |
|
superclass.services[version] = svc; |
|
} else { |
|
setApi(version); |
|
} |
|
|
|
AWS.Service.defineMethods(svc); |
|
return svc; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
hasService: function(identifier) { |
|
return Object.prototype.hasOwnProperty.call(AWS.Service._serviceMap, identifier); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
_serviceMap: {} |
|
}); |
|
|
|
module.exports = AWS.Service; |
|
},{"./core":14,"./model/api":27,"./region_config":43}],50:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
|
|
AWS.util.update(AWS.CognitoIdentity.prototype, { |
|
getOpenIdToken: function getOpenIdToken(params, callback) { |
|
return this.makeUnauthenticatedRequest('getOpenIdToken', params, callback); |
|
}, |
|
|
|
getId: function getId(params, callback) { |
|
return this.makeUnauthenticatedRequest('getId', params, callback); |
|
}, |
|
|
|
getCredentialsForIdentity: function getCredentialsForIdentity(params, callback) { |
|
return this.makeUnauthenticatedRequest('getCredentialsForIdentity', params, callback); |
|
} |
|
}); |
|
|
|
},{"../core":14}],51:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
|
|
// Pull in managed upload extension |
|
require('../s3/managed_upload'); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var operationsWith200StatusCodeError = { |
|
'completeMultipartUpload': true, |
|
'copyObject': true, |
|
'uploadPartCopy': true |
|
}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var regionRedirectErrorCodes = [ |
|
'AuthorizationHeaderMalformed', // non-head operations on virtual-hosted global bucket endpoints |
|
'BadRequest', // head operations on virtual-hosted global bucket endpoints |
|
'PermanentRedirect', // non-head operations on path-style or regional endpoints |
|
301 // head operations on path-style or regional endpoints |
|
]; |
|
|
|
AWS.util.update(AWS.S3.prototype, { |
|
/** |
|
* @api private |
|
*/ |
|
getSignerClass: function getSignerClass(request) { |
|
var defaultApiVersion = this.api.signatureVersion; |
|
var userDefinedVersion = this._originalConfig ? this._originalConfig.signatureVersion : null; |
|
var regionDefinedVersion = this.config.signatureVersion; |
|
var isPresigned = request ? request.isPresigned() : false; |
|
/* |
|
1) User defined version specified: |
|
a) always return user defined version |
|
2) No user defined version specified: |
|
a) default to lowest version the region supports |
|
*/ |
|
if (userDefinedVersion) { |
|
userDefinedVersion = userDefinedVersion === 'v2' ? 's3' : userDefinedVersion; |
|
return AWS.Signers.RequestSigner.getVersion(userDefinedVersion); |
|
} |
|
if (regionDefinedVersion) { |
|
defaultApiVersion = regionDefinedVersion; |
|
} |
|
|
|
return AWS.Signers.RequestSigner.getVersion(defaultApiVersion); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
validateService: function validateService() { |
|
var msg; |
|
var messages = []; |
|
|
|
// default to us-east-1 when no region is provided |
|
if (!this.config.region) this.config.region = 'us-east-1'; |
|
|
|
if (!this.config.endpoint && this.config.s3BucketEndpoint) { |
|
messages.push('An endpoint must be provided when configuring ' + |
|
'`s3BucketEndpoint` to true.'); |
|
} |
|
if (messages.length === 1) { |
|
msg = messages[0]; |
|
} else if (messages.length > 1) { |
|
msg = 'Multiple configuration errors:\n' + messages.join('\n'); |
|
} |
|
if (msg) { |
|
throw AWS.util.error(new Error(), |
|
{name: 'InvalidEndpoint', message: msg}); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
shouldDisableBodySigning: function shouldDisableBodySigning(request) { |
|
var signerClass = this.getSignerClass(); |
|
if (this.config.s3DisableBodySigning === true && signerClass === AWS.Signers.V4 |
|
&& request.httpRequest.endpoint.protocol === 'https:') { |
|
return true; |
|
} |
|
return false; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
setupRequestListeners: function setupRequestListeners(request) { |
|
request.addListener('validate', this.validateScheme); |
|
request.addListener('validate', this.validateBucketEndpoint); |
|
request.addListener('validate', this.correctBucketRegionFromCache); |
|
request.addListener('build', this.addContentType); |
|
request.addListener('build', this.populateURI); |
|
request.addListener('build', this.computeContentMd5); |
|
request.addListener('build', this.computeSseCustomerKeyMd5); |
|
request.addListener('afterBuild', this.addExpect100Continue); |
|
request.removeListener('validate', |
|
AWS.EventListeners.Core.VALIDATE_REGION); |
|
request.addListener('extractError', this.extractError); |
|
request.onAsync('extractError', this.requestBucketRegion); |
|
request.addListener('extractData', this.extractData); |
|
request.addListener('extractData', AWS.util.hoistPayloadMember); |
|
request.addListener('beforePresign', this.prepareSignedUrl); |
|
if (AWS.util.isBrowser()) { |
|
request.onAsync('retry', this.reqRegionForNetworkingError); |
|
} |
|
if (this.shouldDisableBodySigning(request)) { |
|
request.removeListener('afterBuild', AWS.EventListeners.Core.COMPUTE_SHA256); |
|
request.addListener('afterBuild', this.disableBodySigning); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
validateScheme: function(req) { |
|
var params = req.params, |
|
scheme = req.httpRequest.endpoint.protocol, |
|
sensitive = params.SSECustomerKey || params.CopySourceSSECustomerKey; |
|
if (sensitive && scheme !== 'https:') { |
|
var msg = 'Cannot send SSE keys over HTTP. Set \'sslEnabled\'' + |
|
'to \'true\' in your configuration'; |
|
throw AWS.util.error(new Error(), |
|
{ code: 'ConfigError', message: msg }); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
validateBucketEndpoint: function(req) { |
|
if (!req.params.Bucket && req.service.config.s3BucketEndpoint) { |
|
var msg = 'Cannot send requests to root API with `s3BucketEndpoint` set.'; |
|
throw AWS.util.error(new Error(), |
|
{ code: 'ConfigError', message: msg }); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
isValidAccelerateOperation: function isValidAccelerateOperation(operation) { |
|
var invalidOperations = [ |
|
'createBucket', |
|
'deleteBucket', |
|
'listBuckets' |
|
]; |
|
return invalidOperations.indexOf(operation) === -1; |
|
}, |
|
|
|
|
|
/** |
|
* S3 prefers dns-compatible bucket names to be moved from the uri path |
|
* to the hostname as a sub-domain. This is not possible, even for dns-compat |
|
* buckets when using SSL and the bucket name contains a dot ('.'). The |
|
* ssl wildcard certificate is only 1-level deep. |
|
* |
|
* @api private |
|
*/ |
|
populateURI: function populateURI(req) { |
|
var httpRequest = req.httpRequest; |
|
var b = req.params.Bucket; |
|
var service = req.service; |
|
var endpoint = httpRequest.endpoint; |
|
|
|
if (b) { |
|
if (!service.pathStyleBucketName(b)) { |
|
if (service.config.useAccelerateEndpoint && service.isValidAccelerateOperation(req.operation)) { |
|
if (service.config.useDualstack) { |
|
endpoint.hostname = b + '.s3-accelerate.dualstack.amazonaws.com'; |
|
} else { |
|
endpoint.hostname = b + '.s3-accelerate.amazonaws.com'; |
|
} |
|
} else if (!service.config.s3BucketEndpoint) { |
|
endpoint.hostname = |
|
b + '.' + endpoint.hostname; |
|
} |
|
|
|
var port = endpoint.port; |
|
if (port !== 80 && port !== 443) { |
|
endpoint.host = endpoint.hostname + ':' + |
|
endpoint.port; |
|
} else { |
|
endpoint.host = endpoint.hostname; |
|
} |
|
|
|
httpRequest.virtualHostedBucket = b; // needed for signing the request |
|
service.removeVirtualHostedBucketFromPath(req); |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* Takes the bucket name out of the path if bucket is virtual-hosted |
|
* |
|
* @api private |
|
*/ |
|
removeVirtualHostedBucketFromPath: function removeVirtualHostedBucketFromPath(req) { |
|
var httpRequest = req.httpRequest; |
|
var bucket = httpRequest.virtualHostedBucket; |
|
if (bucket && httpRequest.path) { |
|
httpRequest.path = httpRequest.path.replace(new RegExp('/' + bucket), ''); |
|
if (httpRequest.path[0] !== '/') { |
|
httpRequest.path = '/' + httpRequest.path; |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* Adds Expect: 100-continue header if payload is greater-or-equal 1MB |
|
* @api private |
|
*/ |
|
addExpect100Continue: function addExpect100Continue(req) { |
|
var len = req.httpRequest.headers['Content-Length']; |
|
if (AWS.util.isNode() && len >= 1024 * 1024) { |
|
req.httpRequest.headers['Expect'] = '100-continue'; |
|
} |
|
}, |
|
|
|
/** |
|
* Adds a default content type if none is supplied. |
|
* |
|
* @api private |
|
*/ |
|
addContentType: function addContentType(req) { |
|
var httpRequest = req.httpRequest; |
|
if (httpRequest.method === 'GET' || httpRequest.method === 'HEAD') { |
|
// Content-Type is not set in GET/HEAD requests |
|
delete httpRequest.headers['Content-Type']; |
|
return; |
|
} |
|
|
|
if (!httpRequest.headers['Content-Type']) { // always have a Content-Type |
|
httpRequest.headers['Content-Type'] = 'application/octet-stream'; |
|
} |
|
|
|
var contentType = httpRequest.headers['Content-Type']; |
|
if (AWS.util.isBrowser()) { |
|
if (typeof httpRequest.body === 'string' && !contentType.match(/;\s*charset=/)) { |
|
var charset = '; charset=UTF-8'; |
|
httpRequest.headers['Content-Type'] += charset; |
|
} else { |
|
var replaceFn = function(_, prefix, charsetName) { |
|
return prefix + charsetName.toUpperCase(); |
|
}; |
|
|
|
httpRequest.headers['Content-Type'] = |
|
contentType.replace(/(;\s*charset=)(.+)$/, replaceFn); |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
computableChecksumOperations: { |
|
putBucketCors: true, |
|
putBucketLifecycle: true, |
|
putBucketLifecycleConfiguration: true, |
|
putBucketTagging: true, |
|
deleteObjects: true, |
|
putBucketReplication: true |
|
}, |
|
|
|
/** |
|
* Checks whether checksums should be computed for the request. |
|
* If the request requires checksums to be computed, this will always |
|
* return true, otherwise it depends on whether {AWS.Config.computeChecksums} |
|
* is set. |
|
* |
|
* @param req [AWS.Request] the request to check against |
|
* @return [Boolean] whether to compute checksums for a request. |
|
* @api private |
|
*/ |
|
willComputeChecksums: function willComputeChecksums(req) { |
|
if (this.computableChecksumOperations[req.operation]) return true; |
|
if (!this.config.computeChecksums) return false; |
|
|
|
// TODO: compute checksums for Stream objects |
|
if (!AWS.util.Buffer.isBuffer(req.httpRequest.body) && |
|
typeof req.httpRequest.body !== 'string') { |
|
return false; |
|
} |
|
|
|
var rules = req.service.api.operations[req.operation].input.members; |
|
|
|
// Sha256 signing disabled, and not a presigned url |
|
if (req.service.shouldDisableBodySigning(req) && !Object.prototype.hasOwnProperty.call(req.httpRequest.headers, 'presigned-expires')) { |
|
if (rules.ContentMD5 && !req.params.ContentMD5) { |
|
return true; |
|
} |
|
} |
|
|
|
// V4 signer uses SHA256 signatures so only compute MD5 if it is required |
|
if (req.service.getSignerClass(req) === AWS.Signers.V4) { |
|
if (rules.ContentMD5 && !rules.ContentMD5.required) return false; |
|
} |
|
|
|
if (rules.ContentMD5 && !req.params.ContentMD5) return true; |
|
}, |
|
|
|
/** |
|
* A listener that computes the Content-MD5 and sets it in the header. |
|
* @see AWS.S3.willComputeChecksums |
|
* @api private |
|
*/ |
|
computeContentMd5: function computeContentMd5(req) { |
|
if (req.service.willComputeChecksums(req)) { |
|
var md5 = AWS.util.crypto.md5(req.httpRequest.body, 'base64'); |
|
req.httpRequest.headers['Content-MD5'] = md5; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
computeSseCustomerKeyMd5: function computeSseCustomerKeyMd5(req) { |
|
var keys = { |
|
SSECustomerKey: 'x-amz-server-side-encryption-customer-key-MD5', |
|
CopySourceSSECustomerKey: 'x-amz-copy-source-server-side-encryption-customer-key-MD5' |
|
}; |
|
AWS.util.each(keys, function(key, header) { |
|
if (req.params[key]) { |
|
var value = AWS.util.crypto.md5(req.params[key], 'base64'); |
|
req.httpRequest.headers[header] = value; |
|
} |
|
}); |
|
}, |
|
|
|
/** |
|
* Returns true if the bucket name should be left in the URI path for |
|
* a request to S3. This function takes into account the current |
|
* endpoint protocol (e.g. http or https). |
|
* |
|
* @api private |
|
*/ |
|
pathStyleBucketName: function pathStyleBucketName(bucketName) { |
|
// user can force path style requests via the configuration |
|
if (this.config.s3ForcePathStyle) return true; |
|
if (this.config.s3BucketEndpoint) return false; |
|
|
|
if (this.dnsCompatibleBucketName(bucketName)) { |
|
return (this.config.sslEnabled && bucketName.match(/\./)) ? true : false; |
|
} else { |
|
return true; // not dns compatible names must always use path style |
|
} |
|
}, |
|
|
|
/** |
|
* Returns true if the bucket name is DNS compatible. Buckets created |
|
* outside of the classic region MUST be DNS compatible. |
|
* |
|
* @api private |
|
*/ |
|
dnsCompatibleBucketName: function dnsCompatibleBucketName(bucketName) { |
|
var b = bucketName; |
|
var domain = new RegExp(/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/); |
|
var ipAddress = new RegExp(/(\d+\.){3}\d+/); |
|
var dots = new RegExp(/\.\./); |
|
return (b.match(domain) && !b.match(ipAddress) && !b.match(dots)) ? true : false; |
|
}, |
|
|
|
/** |
|
* @return [Boolean] whether response contains an error |
|
* @api private |
|
*/ |
|
successfulResponse: function successfulResponse(resp) { |
|
var req = resp.request; |
|
var httpResponse = resp.httpResponse; |
|
if (operationsWith200StatusCodeError[req.operation] && |
|
httpResponse.body.toString().match('<Error>')) { |
|
return false; |
|
} else { |
|
return httpResponse.statusCode < 300; |
|
} |
|
}, |
|
|
|
/** |
|
* @return [Boolean] whether the error can be retried |
|
* @api private |
|
*/ |
|
retryableError: function retryableError(error, request) { |
|
if (operationsWith200StatusCodeError[request.operation] && |
|
error.statusCode === 200) { |
|
return true; |
|
} else if (request._requestRegionForBucket && |
|
request.service.bucketRegionCache[request._requestRegionForBucket]) { |
|
return false; |
|
} else if (error && error.code === 'RequestTimeout') { |
|
return true; |
|
} else if (error && |
|
regionRedirectErrorCodes.indexOf(error.code) != -1 && |
|
error.region && error.region != request.httpRequest.region) { |
|
request.httpRequest.region = error.region; |
|
if (error.statusCode === 301) { |
|
request.service.updateReqBucketRegion(request); |
|
} |
|
return true; |
|
} else { |
|
var _super = AWS.Service.prototype.retryableError; |
|
return _super.call(this, error, request); |
|
} |
|
}, |
|
|
|
/** |
|
* Updates httpRequest with region. If region is not provided, then |
|
* the httpRequest will be updated based on httpRequest.region |
|
* |
|
* @api private |
|
*/ |
|
updateReqBucketRegion: function updateReqBucketRegion(request, region) { |
|
var httpRequest = request.httpRequest; |
|
if (typeof region === 'string' && region.length) { |
|
httpRequest.region = region; |
|
} |
|
if (!httpRequest.endpoint.host.match(/s3(?!-accelerate).*\.amazonaws\.com$/)) { |
|
return; |
|
} |
|
var service = request.service; |
|
var s3Config = service.config; |
|
var s3BucketEndpoint = s3Config.s3BucketEndpoint; |
|
if (s3BucketEndpoint) { |
|
delete s3Config.s3BucketEndpoint; |
|
} |
|
var newConfig = AWS.util.copy(s3Config); |
|
delete newConfig.endpoint; |
|
newConfig.region = httpRequest.region; |
|
|
|
httpRequest.endpoint = (new AWS.S3(newConfig)).endpoint; |
|
service.populateURI(request); |
|
s3Config.s3BucketEndpoint = s3BucketEndpoint; |
|
httpRequest.headers.Host = httpRequest.endpoint.host; |
|
|
|
if (request._asm.currentState === 'validate') { |
|
request.removeListener('build', service.populateURI); |
|
request.addListener('build', service.removeVirtualHostedBucketFromPath); |
|
} |
|
}, |
|
|
|
/** |
|
* Provides a specialized parser for getBucketLocation -- all other |
|
* operations are parsed by the super class. |
|
* |
|
* @api private |
|
*/ |
|
extractData: function extractData(resp) { |
|
var req = resp.request; |
|
if (req.operation === 'getBucketLocation') { |
|
var match = resp.httpResponse.body.toString().match(/>(.+)<\/Location/); |
|
delete resp.data['_']; |
|
if (match) { |
|
resp.data.LocationConstraint = match[1]; |
|
} else { |
|
resp.data.LocationConstraint = ''; |
|
} |
|
} |
|
var bucket = req.params.Bucket || null; |
|
if (req.operation === 'deleteBucket' && typeof bucket === 'string' && !resp.error) { |
|
req.service.clearBucketRegionCache(bucket); |
|
} else { |
|
var headers = resp.httpResponse.headers || {}; |
|
var region = headers['x-amz-bucket-region'] || null; |
|
if (!region && req.operation === 'createBucket' && !resp.error) { |
|
var createBucketConfiguration = req.params.CreateBucketConfiguration; |
|
if (!createBucketConfiguration) { |
|
region = 'us-east-1'; |
|
} else if (createBucketConfiguration.LocationConstraint === 'EU') { |
|
region = 'eu-west-1'; |
|
} else { |
|
region = createBucketConfiguration.LocationConstraint; |
|
} |
|
} |
|
if (region) { |
|
if (bucket && region !== req.service.bucketRegionCache[bucket]) { |
|
req.service.bucketRegionCache[bucket] = region; |
|
} |
|
} |
|
} |
|
req.service.extractRequestIds(resp); |
|
}, |
|
|
|
/** |
|
* Extracts an error object from the http response. |
|
* |
|
* @api private |
|
*/ |
|
extractError: function extractError(resp) { |
|
var codes = { |
|
304: 'NotModified', |
|
403: 'Forbidden', |
|
400: 'BadRequest', |
|
404: 'NotFound' |
|
}; |
|
|
|
var req = resp.request; |
|
var code = resp.httpResponse.statusCode; |
|
var body = resp.httpResponse.body || ''; |
|
|
|
var headers = resp.httpResponse.headers || {}; |
|
var region = headers['x-amz-bucket-region'] || null; |
|
var bucket = req.params.Bucket || null; |
|
var bucketRegionCache = req.service.bucketRegionCache; |
|
if (region && bucket && region !== bucketRegionCache[bucket]) { |
|
bucketRegionCache[bucket] = region; |
|
} |
|
|
|
var cachedRegion; |
|
if (codes[code] && body.length === 0) { |
|
if (bucket && !region) { |
|
cachedRegion = bucketRegionCache[bucket] || null; |
|
if (cachedRegion !== req.httpRequest.region) { |
|
region = cachedRegion; |
|
} |
|
} |
|
resp.error = AWS.util.error(new Error(), { |
|
code: codes[code], |
|
message: null, |
|
region: region |
|
}); |
|
} else { |
|
var data = new AWS.XML.Parser().parse(body.toString()); |
|
|
|
if (data.Region && !region) { |
|
region = data.Region; |
|
if (bucket && region !== bucketRegionCache[bucket]) { |
|
bucketRegionCache[bucket] = region; |
|
} |
|
} else if (bucket && !region && !data.Region) { |
|
cachedRegion = bucketRegionCache[bucket] || null; |
|
if (cachedRegion !== req.httpRequest.region) { |
|
region = cachedRegion; |
|
} |
|
} |
|
|
|
resp.error = AWS.util.error(new Error(), { |
|
code: data.Code || code, |
|
message: data.Message || null, |
|
region: region |
|
}); |
|
} |
|
req.service.extractRequestIds(resp); |
|
}, |
|
|
|
/** |
|
* If region was not obtained synchronously, then send async request |
|
* to get bucket region for errors resulting from wrong region. |
|
* |
|
* @api private |
|
*/ |
|
requestBucketRegion: function requestBucketRegion(resp, done) { |
|
var error = resp.error; |
|
var req = resp.request; |
|
var bucket = req.params.Bucket || null; |
|
|
|
if (!error || !bucket || error.region || req.operation === 'listObjects' || |
|
(AWS.util.isNode() && req.operation === 'headBucket') || |
|
(error.statusCode === 400 && req.operation !== 'headObject') || |
|
regionRedirectErrorCodes.indexOf(error.code) === -1) { |
|
return done(); |
|
} |
|
var reqOperation = AWS.util.isNode() ? 'headBucket' : 'listObjects'; |
|
var reqParams = {Bucket: bucket}; |
|
if (reqOperation === 'listObjects') reqParams.MaxKeys = 0; |
|
var regionReq = req.service[reqOperation](reqParams); |
|
regionReq._requestRegionForBucket = bucket; |
|
regionReq.send(function() { |
|
var region = req.service.bucketRegionCache[bucket] || null; |
|
error.region = region; |
|
done(); |
|
}); |
|
}, |
|
|
|
/** |
|
* For browser only. If NetworkingError received, will attempt to obtain |
|
* the bucket region. |
|
* |
|
* @api private |
|
*/ |
|
reqRegionForNetworkingError: function reqRegionForNetworkingError(resp, done) { |
|
if (!AWS.util.isBrowser()) { |
|
return done(); |
|
} |
|
var error = resp.error; |
|
var request = resp.request; |
|
var bucket = request.params.Bucket; |
|
if (!error || error.code !== 'NetworkingError' || !bucket || |
|
request.httpRequest.region === 'us-east-1') { |
|
return done(); |
|
} |
|
var service = request.service; |
|
var bucketRegionCache = service.bucketRegionCache; |
|
var cachedRegion = bucketRegionCache[bucket] || null; |
|
|
|
if (cachedRegion && cachedRegion !== request.httpRequest.region) { |
|
service.updateReqBucketRegion(request, cachedRegion); |
|
done(); |
|
} else if (!service.dnsCompatibleBucketName(bucket)) { |
|
service.updateReqBucketRegion(request, 'us-east-1'); |
|
if (bucketRegionCache[bucket] !== 'us-east-1') { |
|
bucketRegionCache[bucket] = 'us-east-1'; |
|
} |
|
done(); |
|
} else if (request.httpRequest.virtualHostedBucket) { |
|
var getRegionReq = service.listObjects({Bucket: bucket, MaxKeys: 0}); |
|
service.updateReqBucketRegion(getRegionReq, 'us-east-1'); |
|
getRegionReq._requestRegionForBucket = bucket; |
|
|
|
getRegionReq.send(function() { |
|
var region = service.bucketRegionCache[bucket] || null; |
|
if (region && region !== request.httpRequest.region) { |
|
service.updateReqBucketRegion(request, region); |
|
} |
|
done(); |
|
}); |
|
} else { |
|
// DNS-compatible path-style |
|
// (s3ForcePathStyle or bucket name with dot over https) |
|
// Cannot obtain region information for this case |
|
done(); |
|
} |
|
}, |
|
|
|
/** |
|
* Cache for bucket region. |
|
* |
|
* @api private |
|
*/ |
|
bucketRegionCache: {}, |
|
|
|
/** |
|
* Clears bucket region cache. |
|
* |
|
* @api private |
|
*/ |
|
clearBucketRegionCache: function(buckets) { |
|
var bucketRegionCache = this.bucketRegionCache; |
|
if (!buckets) { |
|
buckets = Object.keys(bucketRegionCache); |
|
} else if (typeof buckets === 'string') { |
|
buckets = [buckets]; |
|
} |
|
for (var i = 0; i < buckets.length; i++) { |
|
delete bucketRegionCache[buckets[i]]; |
|
} |
|
return bucketRegionCache; |
|
}, |
|
|
|
/** |
|
* Corrects request region if bucket's cached region is different |
|
* |
|
* @api private |
|
*/ |
|
correctBucketRegionFromCache: function correctBucketRegionFromCache(req) { |
|
var bucket = req.params.Bucket || null; |
|
if (bucket) { |
|
var service = req.service; |
|
var requestRegion = req.httpRequest.region; |
|
var cachedRegion = service.bucketRegionCache[bucket]; |
|
if (cachedRegion && cachedRegion !== requestRegion) { |
|
service.updateReqBucketRegion(req, cachedRegion); |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* Extracts S3 specific request ids from the http response. |
|
* |
|
* @api private |
|
*/ |
|
extractRequestIds: function extractRequestIds(resp) { |
|
var extendedRequestId = resp.httpResponse.headers ? resp.httpResponse.headers['x-amz-id-2'] : null; |
|
var cfId = resp.httpResponse.headers ? resp.httpResponse.headers['x-amz-cf-id'] : null; |
|
resp.extendedRequestId = extendedRequestId; |
|
resp.cfId = cfId; |
|
|
|
if (resp.error) { |
|
resp.error.requestId = resp.requestId || null; |
|
resp.error.extendedRequestId = extendedRequestId; |
|
resp.error.cfId = cfId; |
|
} |
|
}, |
|
|
|
/** |
|
* Get a pre-signed URL for a given operation name. |
|
* |
|
* @note You must ensure that you have static or previously resolved |
|
* credentials if you call this method synchronously (with no callback), |
|
* otherwise it may not properly sign the request. If you cannot guarantee |
|
* this (you are using an asynchronous credential provider, i.e., EC2 |
|
* IAM roles), you should always call this method with an asynchronous |
|
* callback. |
|
* @param operation [String] the name of the operation to call |
|
* @param params [map] parameters to pass to the operation. See the given |
|
* operation for the expected operation parameters. In addition, you can |
|
* also pass the "Expires" parameter to inform S3 how long the URL should |
|
* work for. |
|
* @option params Expires [Integer] (900) the number of seconds to expire |
|
* the pre-signed URL operation in. Defaults to 15 minutes. |
|
* @param callback [Function] if a callback is provided, this function will |
|
* pass the URL as the second parameter (after the error parameter) to |
|
* the callback function. |
|
* @return [String] if called synchronously (with no callback), returns the |
|
* signed URL. |
|
* @return [null] nothing is returned if a callback is provided. |
|
* @example Pre-signing a getObject operation (synchronously) |
|
* var params = {Bucket: 'bucket', Key: 'key'}; |
|
* var url = s3.getSignedUrl('getObject', params); |
|
* console.log('The URL is', url); |
|
* @example Pre-signing a putObject (asynchronously) |
|
* var params = {Bucket: 'bucket', Key: 'key'}; |
|
* s3.getSignedUrl('putObject', params, function (err, url) { |
|
* console.log('The URL is', url); |
|
* }); |
|
* @example Pre-signing a putObject operation with a specific payload |
|
* var params = {Bucket: 'bucket', Key: 'key', Body: 'body'}; |
|
* var url = s3.getSignedUrl('putObject', params); |
|
* console.log('The URL is', url); |
|
* @example Passing in a 1-minute expiry time for a pre-signed URL |
|
* var params = {Bucket: 'bucket', Key: 'key', Expires: 60}; |
|
* var url = s3.getSignedUrl('getObject', params); |
|
* console.log('The URL is', url); // expires in 60 seconds |
|
*/ |
|
getSignedUrl: function getSignedUrl(operation, params, callback) { |
|
params = AWS.util.copy(params || {}); |
|
var expires = params.Expires || 900; |
|
delete params.Expires; // we can't validate this |
|
var request = this.makeRequest(operation, params); |
|
return request.presign(expires, callback); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
prepareSignedUrl: function prepareSignedUrl(request) { |
|
request.addListener('validate', request.service.noPresignedContentLength); |
|
request.removeListener('build', request.service.addContentType); |
|
if (!request.params.Body) { |
|
// no Content-MD5/SHA-256 if body is not provided |
|
request.removeListener('build', request.service.computeContentMd5); |
|
} else { |
|
request.addListener('afterBuild', AWS.EventListeners.Core.COMPUTE_SHA256); |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
* @param request |
|
*/ |
|
disableBodySigning: function disableBodySigning(request) { |
|
var headers = request.httpRequest.headers; |
|
// Add the header to anything that isn't a presigned url, unless that presigned url had a body defined |
|
if (!Object.prototype.hasOwnProperty.call(headers, 'presigned-expires')) { |
|
headers['X-Amz-Content-Sha256'] = 'UNSIGNED-PAYLOAD'; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
noPresignedContentLength: function noPresignedContentLength(request) { |
|
if (request.params.ContentLength !== undefined) { |
|
throw AWS.util.error(new Error(), {code: 'UnexpectedParameter', |
|
message: 'ContentLength is not supported in pre-signed URLs.'}); |
|
} |
|
}, |
|
|
|
createBucket: function createBucket(params, callback) { |
|
// When creating a bucket *outside* the classic region, the location |
|
// constraint must be set for the bucket and it must match the endpoint. |
|
// This chunk of code will set the location constraint param based |
|
// on the region (when possible), but it will not override a passed-in |
|
// location constraint. |
|
if (typeof params === 'function' || !params) { |
|
callback = callback || params; |
|
params = {}; |
|
} |
|
var hostname = this.endpoint.hostname; |
|
if (hostname !== this.api.globalEndpoint && !params.CreateBucketConfiguration) { |
|
params.CreateBucketConfiguration = { LocationConstraint: this.config.region }; |
|
} |
|
return this.makeRequest('createBucket', params, callback); |
|
}, |
|
|
|
/** |
|
* @overload upload(params = {}, [options], [callback]) |
|
* Uploads an arbitrarily sized buffer, blob, or stream, using intelligent |
|
* concurrent handling of parts if the payload is large enough. You can |
|
* configure the concurrent queue size by setting `options`. Note that this |
|
* is the only operation for which the SDK can retry requests with stream |
|
* bodies. |
|
* |
|
* @param (see AWS.S3.putObject) |
|
* @option (see AWS.S3.ManagedUpload.constructor) |
|
* @return [AWS.S3.ManagedUpload] the managed upload object that can call |
|
* `send()` or track progress. |
|
* @example Uploading a stream object |
|
* var params = {Bucket: 'bucket', Key: 'key', Body: stream}; |
|
* s3.upload(params, function(err, data) { |
|
* console.log(err, data); |
|
* }); |
|
* @example Uploading a stream with concurrency of 1 and partSize of 10mb |
|
* var params = {Bucket: 'bucket', Key: 'key', Body: stream}; |
|
* var options = {partSize: 10 * 1024 * 1024, queueSize: 1}; |
|
* s3.upload(params, options, function(err, data) { |
|
* console.log(err, data); |
|
* }); |
|
* @callback callback function(err, data) |
|
* @param err [Error] an error or null if no error occurred. |
|
* @param data [map] The response data from the successful upload: |
|
* * `Location` (String) the URL of the uploaded object |
|
* * `ETag` (String) the ETag of the uploaded object |
|
* * `Bucket` (String) the bucket to which the object was uploaded |
|
* * `Key` (String) the key to which the object was uploaded |
|
* @see AWS.S3.ManagedUpload |
|
*/ |
|
upload: function upload(params, options, callback) { |
|
if (typeof options === 'function' && callback === undefined) { |
|
callback = options; |
|
options = null; |
|
} |
|
|
|
options = options || {}; |
|
options = AWS.util.merge(options || {}, {service: this, params: params}); |
|
|
|
var uploader = new AWS.S3.ManagedUpload(options); |
|
if (typeof callback === 'function') uploader.send(callback); |
|
return uploader; |
|
} |
|
}); |
|
|
|
},{"../core":14,"../s3/managed_upload":47}],52:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
|
|
AWS.util.update(AWS.STS.prototype, { |
|
/** |
|
* @overload credentialsFrom(data, credentials = null) |
|
* Creates a credentials object from STS response data containing |
|
* credentials information. Useful for quickly setting AWS credentials. |
|
* |
|
* @note This is a low-level utility function. If you want to load temporary |
|
* credentials into your process for subsequent requests to AWS resources, |
|
* you should use {AWS.TemporaryCredentials} instead. |
|
* @param data [map] data retrieved from a call to {getFederatedToken}, |
|
* {getSessionToken}, {assumeRole}, or {assumeRoleWithWebIdentity}. |
|
* @param credentials [AWS.Credentials] an optional credentials object to |
|
* fill instead of creating a new object. Useful when modifying an |
|
* existing credentials object from a refresh call. |
|
* @return [AWS.TemporaryCredentials] the set of temporary credentials |
|
* loaded from a raw STS operation response. |
|
* @example Using credentialsFrom to load global AWS credentials |
|
* var sts = new AWS.STS(); |
|
* sts.getSessionToken(function (err, data) { |
|
* if (err) console.log("Error getting credentials"); |
|
* else { |
|
* AWS.config.credentials = sts.credentialsFrom(data); |
|
* } |
|
* }); |
|
* @see AWS.TemporaryCredentials |
|
*/ |
|
credentialsFrom: function credentialsFrom(data, credentials) { |
|
if (!data) return null; |
|
if (!credentials) credentials = new AWS.TemporaryCredentials(); |
|
credentials.expired = false; |
|
credentials.accessKeyId = data.Credentials.AccessKeyId; |
|
credentials.secretAccessKey = data.Credentials.SecretAccessKey; |
|
credentials.sessionToken = data.Credentials.SessionToken; |
|
credentials.expireTime = data.Credentials.Expiration; |
|
return credentials; |
|
}, |
|
|
|
assumeRoleWithWebIdentity: function assumeRoleWithWebIdentity(params, callback) { |
|
return this.makeUnauthenticatedRequest('assumeRoleWithWebIdentity', params, callback); |
|
}, |
|
|
|
assumeRoleWithSAML: function assumeRoleWithSAML(params, callback) { |
|
return this.makeUnauthenticatedRequest('assumeRoleWithSAML', params, callback); |
|
} |
|
}); |
|
|
|
},{"../core":14}],53:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var expiresHeader = 'presigned-expires'; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
function signedUrlBuilder(request) { |
|
var expires = request.httpRequest.headers[expiresHeader]; |
|
var signerClass = request.service.getSignerClass(request); |
|
|
|
delete request.httpRequest.headers['User-Agent']; |
|
delete request.httpRequest.headers['X-Amz-User-Agent']; |
|
|
|
if (signerClass === AWS.Signers.V4) { |
|
if (expires > 604800) { // one week expiry is invalid |
|
var message = 'Presigning does not support expiry time greater ' + |
|
'than a week with SigV4 signing.'; |
|
throw AWS.util.error(new Error(), { |
|
code: 'InvalidExpiryTime', message: message, retryable: false |
|
}); |
|
} |
|
request.httpRequest.headers[expiresHeader] = expires; |
|
} else if (signerClass === AWS.Signers.S3) { |
|
request.httpRequest.headers[expiresHeader] = parseInt( |
|
AWS.util.date.unixTimestamp() + expires, 10).toString(); |
|
} else { |
|
throw AWS.util.error(new Error(), { |
|
message: 'Presigning only supports S3 or SigV4 signing.', |
|
code: 'UnsupportedSigner', retryable: false |
|
}); |
|
} |
|
} |
|
|
|
/** |
|
* @api private |
|
*/ |
|
function signedUrlSigner(request) { |
|
var endpoint = request.httpRequest.endpoint; |
|
var parsedUrl = AWS.util.urlParse(request.httpRequest.path); |
|
var queryParams = {}; |
|
|
|
if (parsedUrl.search) { |
|
queryParams = AWS.util.queryStringParse(parsedUrl.search.substr(1)); |
|
} |
|
|
|
AWS.util.each(request.httpRequest.headers, function (key, value) { |
|
if (key === expiresHeader) key = 'Expires'; |
|
if (key.indexOf('x-amz-meta-') === 0) { |
|
// Delete existing, potentially not normalized key |
|
delete queryParams[key]; |
|
key = key.toLowerCase(); |
|
} |
|
queryParams[key] = value; |
|
}); |
|
delete request.httpRequest.headers[expiresHeader]; |
|
|
|
var auth = queryParams['Authorization'].split(' '); |
|
if (auth[0] === 'AWS') { |
|
auth = auth[1].split(':'); |
|
queryParams['AWSAccessKeyId'] = auth[0]; |
|
queryParams['Signature'] = auth[1]; |
|
} else if (auth[0] === 'AWS4-HMAC-SHA256') { // SigV4 signing |
|
auth.shift(); |
|
var rest = auth.join(' '); |
|
var signature = rest.match(/Signature=(.*?)(?:,|\s|\r?\n|$)/)[1]; |
|
queryParams['X-Amz-Signature'] = signature; |
|
delete queryParams['Expires']; |
|
} |
|
delete queryParams['Authorization']; |
|
delete queryParams['Host']; |
|
|
|
// build URL |
|
endpoint.pathname = parsedUrl.pathname; |
|
endpoint.search = AWS.util.queryParamsToString(queryParams); |
|
} |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.Presign = inherit({ |
|
/** |
|
* @api private |
|
*/ |
|
sign: function sign(request, expireTime, callback) { |
|
request.httpRequest.headers[expiresHeader] = expireTime || 3600; |
|
request.on('build', signedUrlBuilder); |
|
request.on('sign', signedUrlSigner); |
|
request.removeListener('afterBuild', |
|
AWS.EventListeners.Core.SET_CONTENT_LENGTH); |
|
request.removeListener('afterBuild', |
|
AWS.EventListeners.Core.COMPUTE_SHA256); |
|
|
|
request.emit('beforePresign', [request]); |
|
|
|
if (callback) { |
|
request.build(function() { |
|
if (this.response.error) callback(this.response.error); |
|
else { |
|
callback(null, AWS.util.urlFormat(request.httpRequest.endpoint)); |
|
} |
|
}); |
|
} else { |
|
request.build(); |
|
if (request.response.error) throw request.response.error; |
|
return AWS.util.urlFormat(request.httpRequest.endpoint); |
|
} |
|
} |
|
}); |
|
|
|
module.exports = AWS.Signers.Presign; |
|
|
|
},{"../core":14}],54:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.RequestSigner = inherit({ |
|
constructor: function RequestSigner(request) { |
|
this.request = request; |
|
}, |
|
|
|
setServiceClientId: function setServiceClientId(id) { |
|
this.serviceClientId = id; |
|
}, |
|
|
|
getServiceClientId: function getServiceClientId() { |
|
return this.serviceClientId; |
|
} |
|
}); |
|
|
|
AWS.Signers.RequestSigner.getVersion = function getVersion(version) { |
|
switch (version) { |
|
case 'v2': return AWS.Signers.V2; |
|
case 'v3': return AWS.Signers.V3; |
|
case 'v4': return AWS.Signers.V4; |
|
case 's3': return AWS.Signers.S3; |
|
case 'v3https': return AWS.Signers.V3Https; |
|
} |
|
throw new Error('Unknown signing version ' + version); |
|
}; |
|
|
|
require('./v2'); |
|
require('./v3'); |
|
require('./v3https'); |
|
require('./v4'); |
|
require('./s3'); |
|
require('./presign'); |
|
|
|
},{"../core":14,"./presign":53,"./s3":55,"./v2":56,"./v3":57,"./v3https":58,"./v4":59}],55:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.S3 = inherit(AWS.Signers.RequestSigner, { |
|
/** |
|
* When building the stringToSign, these sub resource params should be |
|
* part of the canonical resource string with their NON-decoded values |
|
*/ |
|
subResources: { |
|
'acl': 1, |
|
'accelerate': 1, |
|
'cors': 1, |
|
'lifecycle': 1, |
|
'delete': 1, |
|
'location': 1, |
|
'logging': 1, |
|
'notification': 1, |
|
'partNumber': 1, |
|
'policy': 1, |
|
'requestPayment': 1, |
|
'replication': 1, |
|
'restore': 1, |
|
'tagging': 1, |
|
'torrent': 1, |
|
'uploadId': 1, |
|
'uploads': 1, |
|
'versionId': 1, |
|
'versioning': 1, |
|
'versions': 1, |
|
'website': 1 |
|
}, |
|
|
|
// when building the stringToSign, these querystring params should be |
|
// part of the canonical resource string with their NON-encoded values |
|
responseHeaders: { |
|
'response-content-type': 1, |
|
'response-content-language': 1, |
|
'response-expires': 1, |
|
'response-cache-control': 1, |
|
'response-content-disposition': 1, |
|
'response-content-encoding': 1 |
|
}, |
|
|
|
addAuthorization: function addAuthorization(credentials, date) { |
|
if (!this.request.headers['presigned-expires']) { |
|
this.request.headers['X-Amz-Date'] = AWS.util.date.rfc822(date); |
|
} |
|
|
|
if (credentials.sessionToken) { |
|
// presigned URLs require this header to be lowercased |
|
this.request.headers['x-amz-security-token'] = credentials.sessionToken; |
|
} |
|
|
|
var signature = this.sign(credentials.secretAccessKey, this.stringToSign()); |
|
var auth = 'AWS ' + credentials.accessKeyId + ':' + signature; |
|
|
|
this.request.headers['Authorization'] = auth; |
|
}, |
|
|
|
stringToSign: function stringToSign() { |
|
var r = this.request; |
|
|
|
var parts = []; |
|
parts.push(r.method); |
|
parts.push(r.headers['Content-MD5'] || ''); |
|
parts.push(r.headers['Content-Type'] || ''); |
|
|
|
// This is the "Date" header, but we use X-Amz-Date. |
|
// The S3 signing mechanism requires us to pass an empty |
|
// string for this Date header regardless. |
|
parts.push(r.headers['presigned-expires'] || ''); |
|
|
|
var headers = this.canonicalizedAmzHeaders(); |
|
if (headers) parts.push(headers); |
|
parts.push(this.canonicalizedResource()); |
|
|
|
return parts.join('\n'); |
|
|
|
}, |
|
|
|
canonicalizedAmzHeaders: function canonicalizedAmzHeaders() { |
|
|
|
var amzHeaders = []; |
|
|
|
AWS.util.each(this.request.headers, function (name) { |
|
if (name.match(/^x-amz-/i)) |
|
amzHeaders.push(name); |
|
}); |
|
|
|
amzHeaders.sort(function (a, b) { |
|
return a.toLowerCase() < b.toLowerCase() ? -1 : 1; |
|
}); |
|
|
|
var parts = []; |
|
AWS.util.arrayEach.call(this, amzHeaders, function (name) { |
|
parts.push(name.toLowerCase() + ':' + String(this.request.headers[name])); |
|
}); |
|
|
|
return parts.join('\n'); |
|
|
|
}, |
|
|
|
canonicalizedResource: function canonicalizedResource() { |
|
|
|
var r = this.request; |
|
|
|
var parts = r.path.split('?'); |
|
var path = parts[0]; |
|
var querystring = parts[1]; |
|
|
|
var resource = ''; |
|
|
|
if (r.virtualHostedBucket) |
|
resource += '/' + r.virtualHostedBucket; |
|
|
|
resource += path; |
|
|
|
if (querystring) { |
|
|
|
// collect a list of sub resources and query params that need to be signed |
|
var resources = []; |
|
|
|
AWS.util.arrayEach.call(this, querystring.split('&'), function (param) { |
|
var name = param.split('=')[0]; |
|
var value = param.split('=')[1]; |
|
if (this.subResources[name] || this.responseHeaders[name]) { |
|
var subresource = { name: name }; |
|
if (value !== undefined) { |
|
if (this.subResources[name]) { |
|
subresource.value = value; |
|
} else { |
|
subresource.value = decodeURIComponent(value); |
|
} |
|
} |
|
resources.push(subresource); |
|
} |
|
}); |
|
|
|
resources.sort(function (a, b) { return a.name < b.name ? -1 : 1; }); |
|
|
|
if (resources.length) { |
|
|
|
querystring = []; |
|
AWS.util.arrayEach(resources, function (res) { |
|
if (res.value === undefined) { |
|
querystring.push(res.name); |
|
} else { |
|
querystring.push(res.name + '=' + res.value); |
|
} |
|
}); |
|
|
|
resource += '?' + querystring.join('&'); |
|
} |
|
|
|
} |
|
|
|
return resource; |
|
|
|
}, |
|
|
|
sign: function sign(secret, string) { |
|
return AWS.util.crypto.hmac(secret, string, 'base64', 'sha1'); |
|
} |
|
}); |
|
|
|
module.exports = AWS.Signers.S3; |
|
|
|
},{"../core":14}],56:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.V2 = inherit(AWS.Signers.RequestSigner, { |
|
addAuthorization: function addAuthorization(credentials, date) { |
|
|
|
if (!date) date = AWS.util.date.getDate(); |
|
|
|
var r = this.request; |
|
|
|
r.params.Timestamp = AWS.util.date.iso8601(date); |
|
r.params.SignatureVersion = '2'; |
|
r.params.SignatureMethod = 'HmacSHA256'; |
|
r.params.AWSAccessKeyId = credentials.accessKeyId; |
|
|
|
if (credentials.sessionToken) { |
|
r.params.SecurityToken = credentials.sessionToken; |
|
} |
|
|
|
delete r.params.Signature; // delete old Signature for re-signing |
|
r.params.Signature = this.signature(credentials); |
|
|
|
r.body = AWS.util.queryParamsToString(r.params); |
|
r.headers['Content-Length'] = r.body.length; |
|
}, |
|
|
|
signature: function signature(credentials) { |
|
return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64'); |
|
}, |
|
|
|
stringToSign: function stringToSign() { |
|
var parts = []; |
|
parts.push(this.request.method); |
|
parts.push(this.request.endpoint.host.toLowerCase()); |
|
parts.push(this.request.pathname()); |
|
parts.push(AWS.util.queryParamsToString(this.request.params)); |
|
return parts.join('\n'); |
|
} |
|
|
|
}); |
|
|
|
module.exports = AWS.Signers.V2; |
|
|
|
},{"../core":14}],57:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.V3 = inherit(AWS.Signers.RequestSigner, { |
|
addAuthorization: function addAuthorization(credentials, date) { |
|
|
|
var datetime = AWS.util.date.rfc822(date); |
|
|
|
this.request.headers['X-Amz-Date'] = datetime; |
|
|
|
if (credentials.sessionToken) { |
|
this.request.headers['x-amz-security-token'] = credentials.sessionToken; |
|
} |
|
|
|
this.request.headers['X-Amzn-Authorization'] = |
|
this.authorization(credentials, datetime); |
|
|
|
}, |
|
|
|
authorization: function authorization(credentials) { |
|
return 'AWS3 ' + |
|
'AWSAccessKeyId=' + credentials.accessKeyId + ',' + |
|
'Algorithm=HmacSHA256,' + |
|
'SignedHeaders=' + this.signedHeaders() + ',' + |
|
'Signature=' + this.signature(credentials); |
|
}, |
|
|
|
signedHeaders: function signedHeaders() { |
|
var headers = []; |
|
AWS.util.arrayEach(this.headersToSign(), function iterator(h) { |
|
headers.push(h.toLowerCase()); |
|
}); |
|
return headers.sort().join(';'); |
|
}, |
|
|
|
canonicalHeaders: function canonicalHeaders() { |
|
var headers = this.request.headers; |
|
var parts = []; |
|
AWS.util.arrayEach(this.headersToSign(), function iterator(h) { |
|
parts.push(h.toLowerCase().trim() + ':' + String(headers[h]).trim()); |
|
}); |
|
return parts.sort().join('\n') + '\n'; |
|
}, |
|
|
|
headersToSign: function headersToSign() { |
|
var headers = []; |
|
AWS.util.each(this.request.headers, function iterator(k) { |
|
if (k === 'Host' || k === 'Content-Encoding' || k.match(/^X-Amz/i)) { |
|
headers.push(k); |
|
} |
|
}); |
|
return headers; |
|
}, |
|
|
|
signature: function signature(credentials) { |
|
return AWS.util.crypto.hmac(credentials.secretAccessKey, this.stringToSign(), 'base64'); |
|
}, |
|
|
|
stringToSign: function stringToSign() { |
|
var parts = []; |
|
parts.push(this.request.method); |
|
parts.push('/'); |
|
parts.push(''); |
|
parts.push(this.canonicalHeaders()); |
|
parts.push(this.request.body); |
|
return AWS.util.crypto.sha256(parts.join('\n')); |
|
} |
|
|
|
}); |
|
|
|
module.exports = AWS.Signers.V3; |
|
|
|
},{"../core":14}],58:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
require('./v3'); |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.V3Https = inherit(AWS.Signers.V3, { |
|
authorization: function authorization(credentials) { |
|
return 'AWS3-HTTPS ' + |
|
'AWSAccessKeyId=' + credentials.accessKeyId + ',' + |
|
'Algorithm=HmacSHA256,' + |
|
'Signature=' + this.signature(credentials); |
|
}, |
|
|
|
stringToSign: function stringToSign() { |
|
return this.request.headers['X-Amz-Date']; |
|
} |
|
}); |
|
|
|
module.exports = AWS.Signers.V3Https; |
|
|
|
},{"../core":14,"./v3":57}],59:[function(require,module,exports){ |
|
var AWS = require('../core'); |
|
var inherit = AWS.util.inherit; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var cachedSecret = {}; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var cacheQueue = []; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var maxCacheEntries = 50; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
var expiresHeader = 'presigned-expires'; |
|
|
|
/** |
|
* @api private |
|
*/ |
|
AWS.Signers.V4 = inherit(AWS.Signers.RequestSigner, { |
|
constructor: function V4(request, serviceName, signatureCache) { |
|
AWS.Signers.RequestSigner.call(this, request); |
|
this.serviceName = serviceName; |
|
this.signatureCache = signatureCache; |
|
}, |
|
|
|
algorithm: 'AWS4-HMAC-SHA256', |
|
|
|
addAuthorization: function addAuthorization(credentials, date) { |
|
var datetime = AWS.util.date.iso8601(date).replace(/[:\-]|\.\d{3}/g, ''); |
|
|
|
if (this.isPresigned()) { |
|
this.updateForPresigned(credentials, datetime); |
|
} else { |
|
this.addHeaders(credentials, datetime); |
|
} |
|
|
|
this.request.headers['Authorization'] = |
|
this.authorization(credentials, datetime); |
|
}, |
|
|
|
addHeaders: function addHeaders(credentials, datetime) { |
|
this.request.headers['X-Amz-Date'] = datetime; |
|
if (credentials.sessionToken) { |
|
this.request.headers['x-amz-security-token'] = credentials.sessionToken; |
|
} |
|
}, |
|
|
|
updateForPresigned: function updateForPresigned(credentials, datetime) { |
|
var credString = this.credentialString(datetime); |
|
var qs = { |
|
'X-Amz-Date': datetime, |
|
'X-Amz-Algorithm': this.algorithm, |
|
'X-Amz-Credential': credentials.accessKeyId + '/' + credString, |
|
'X-Amz-Expires': this.request.headers[expiresHeader], |
|
'X-Amz-SignedHeaders': this.signedHeaders() |
|
}; |
|
|
|
if (credentials.sessionToken) { |
|
qs['X-Amz-Security-Token'] = credentials.sessionToken; |
|
} |
|
|
|
if (this.request.headers['Content-Type']) { |
|
qs['Content-Type'] = this.request.headers['Content-Type']; |
|
} |
|
if (this.request.headers['Content-MD5']) { |
|
qs['Content-MD5'] = this.request.headers['Content-MD5']; |
|
} |
|
if (this.request.headers['Cache-Control']) { |
|
qs['Cache-Control'] = this.request.headers['Cache-Control']; |
|
} |
|
|
|
// need to pull in any other X-Amz-* headers |
|
AWS.util.each.call(this, this.request.headers, function(key, value) { |
|
if (key === expiresHeader) return; |
|
if (this.isSignableHeader(key)) { |
|
var lowerKey = key.toLowerCase(); |
|
// Metadata should be normalized |
|
if (lowerKey.indexOf('x-amz-meta-') === 0) { |
|
qs[lowerKey] = value; |
|
} else if (lowerKey.indexOf('x-amz-') === 0) { |
|
qs[key] = value; |
|
} |
|
} |
|
}); |
|
|
|
var sep = this.request.path.indexOf('?') >= 0 ? '&' : '?'; |
|
this.request.path += sep + AWS.util.queryParamsToString(qs); |
|
}, |
|
|
|
authorization: function authorization(credentials, datetime) { |
|
var parts = []; |
|
var credString = this.credentialString(datetime); |
|
parts.push(this.algorithm + ' Credential=' + |
|
credentials.accessKeyId + '/' + credString); |
|
parts.push('SignedHeaders=' + this.signedHeaders()); |
|
parts.push('Signature=' + this.signature(credentials, datetime)); |
|
return parts.join(', '); |
|
}, |
|
|
|
signature: function signature(credentials, datetime) { |
|
var cache = null; |
|
var cacheIdentifier = this.serviceName + (this.getServiceClientId() ? '_' + this.getServiceClientId() : ''); |
|
if (this.signatureCache) { |
|
var cache = cachedSecret[cacheIdentifier]; |
|
// If there isn't already a cache entry, we'll be adding one |
|
if (!cache) { |
|
cacheQueue.push(cacheIdentifier); |
|
if (cacheQueue.length > maxCacheEntries) { |
|
// remove the oldest entry (may not be last one used) |
|
delete cachedSecret[cacheQueue.shift()]; |
|
} |
|
} |
|
|
|
} |
|
var date = datetime.substr(0, 8); |
|
|
|
if (!cache || |
|
cache.akid !== credentials.accessKeyId || |
|
cache.region !== this.request.region || |
|
cache.date !== date) { |
|
|
|
var kSecret = credentials.secretAccessKey; |
|
var kDate = AWS.util.crypto.hmac('AWS4' + kSecret, date, 'buffer'); |
|
var kRegion = AWS.util.crypto.hmac(kDate, this.request.region, 'buffer'); |
|
var kService = AWS.util.crypto.hmac(kRegion, this.serviceName, 'buffer'); |
|
var kCredentials = AWS.util.crypto.hmac(kService, 'aws4_request', 'buffer'); |
|
|
|
if (!this.signatureCache) { |
|
return AWS.util.crypto.hmac(kCredentials, this.stringToSign(datetime), 'hex'); |
|
} |
|
|
|
cachedSecret[cacheIdentifier] = { |
|
region: this.request.region, date: date, |
|
key: kCredentials, akid: credentials.accessKeyId |
|
}; |
|
} |
|
|
|
var key = cachedSecret[cacheIdentifier].key; |
|
return AWS.util.crypto.hmac(key, this.stringToSign(datetime), 'hex'); |
|
}, |
|
|
|
stringToSign: function stringToSign(datetime) { |
|
var parts = []; |
|
parts.push('AWS4-HMAC-SHA256'); |
|
parts.push(datetime); |
|
parts.push(this.credentialString(datetime)); |
|
parts.push(this.hexEncodedHash(this.canonicalString())); |
|
return parts.join('\n'); |
|
}, |
|
|
|
canonicalString: function canonicalString() { |
|
var parts = [], pathname = this.request.pathname(); |
|
if (this.serviceName !== 's3') pathname = AWS.util.uriEscapePath(pathname); |
|
|
|
parts.push(this.request.method); |
|
parts.push(pathname); |
|
parts.push(this.request.search()); |
|
parts.push(this.canonicalHeaders() + '\n'); |
|
parts.push(this.signedHeaders()); |
|
parts.push(this.hexEncodedBodyHash()); |
|
return parts.join('\n'); |
|
}, |
|
|
|
canonicalHeaders: function canonicalHeaders() { |
|
var headers = []; |
|
AWS.util.each.call(this, this.request.headers, function (key, item) { |
|
headers.push([key, item]); |
|
}); |
|
headers.sort(function (a, b) { |
|
return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : 1; |
|
}); |
|
var parts = []; |
|
AWS.util.arrayEach.call(this, headers, function (item) { |
|
var key = item[0].toLowerCase(); |
|
if (this.isSignableHeader(key)) { |
|
parts.push(key + ':' + |
|
this.canonicalHeaderValues(item[1].toString())); |
|
} |
|
}); |
|
return parts.join('\n'); |
|
}, |
|
|
|
canonicalHeaderValues: function canonicalHeaderValues(values) { |
|
return values.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, ''); |
|
}, |
|
|
|
signedHeaders: function signedHeaders() { |
|
var keys = []; |
|
AWS.util.each.call(this, this.request.headers, function (key) { |
|
key = key.toLowerCase(); |
|
if (this.isSignableHeader(key)) keys.push(key); |
|
}); |
|
return keys.sort().join(';'); |
|
}, |
|
|
|
credentialString: function credentialString(datetime) { |
|
var parts = []; |
|
parts.push(datetime.substr(0, 8)); |
|
parts.push(this.request.region); |
|
parts.push(this.serviceName); |
|
parts.push('aws4_request'); |
|
return parts.join('/'); |
|
}, |
|
|
|
hexEncodedHash: function hash(string) { |
|
return AWS.util.crypto.sha256(string, 'hex'); |
|
}, |
|
|
|
hexEncodedBodyHash: function hexEncodedBodyHash() { |
|
if (this.isPresigned() && this.serviceName === 's3' && !this.request.body) { |
|
return 'UNSIGNED-PAYLOAD'; |
|
} else if (this.request.headers['X-Amz-Content-Sha256']) { |
|
return this.request.headers['X-Amz-Content-Sha256']; |
|
} else { |
|
return this.hexEncodedHash(this.request.body || ''); |
|
} |
|
}, |
|
|
|
unsignableHeaders: ['authorization', 'content-type', 'content-length', |
|
'user-agent', expiresHeader, 'expect'], |
|
|
|
isSignableHeader: function isSignableHeader(key) { |
|
if (key.toLowerCase().indexOf('x-amz-') === 0) return true; |
|
return this.unsignableHeaders.indexOf(key) < 0; |
|
}, |
|
|
|
isPresigned: function isPresigned() { |
|
return this.request.headers[expiresHeader] ? true : false; |
|
} |
|
|
|
}); |
|
|
|
module.exports = AWS.Signers.V4; |
|
|
|
},{"../core":14}],60:[function(require,module,exports){ |
|
function AcceptorStateMachine(states, state) { |
|
this.currentState = state || null; |
|
this.states = states || {}; |
|
} |
|
|
|
AcceptorStateMachine.prototype.runTo = function runTo(finalState, done, bindObject, inputError) { |
|
if (typeof finalState === 'function') { |
|
inputError = bindObject; bindObject = done; |
|
done = finalState; finalState = null; |
|
} |
|
|
|
var self = this; |
|
var state = self.states[self.currentState]; |
|
state.fn.call(bindObject || self, inputError, function(err) { |
|
if (err) { |
|
if (state.fail) self.currentState = state.fail; |
|
else return done ? done.call(bindObject, err) : null; |
|
} else { |
|
if (state.accept) self.currentState = state.accept; |
|
else return done ? done.call(bindObject) : null; |
|
} |
|
if (self.currentState === finalState) { |
|
return done ? done.call(bindObject, err) : null; |
|
} |
|
|
|
self.runTo(finalState, done, bindObject, err); |
|
}); |
|
}; |
|
|
|
AcceptorStateMachine.prototype.addState = function addState(name, acceptState, failState, fn) { |
|
if (typeof acceptState === 'function') { |
|
fn = acceptState; acceptState = null; failState = null; |
|
} else if (typeof failState === 'function') { |
|
fn = failState; failState = null; |
|
} |
|
|
|
if (!this.currentState) this.currentState = name; |
|
this.states[name] = { accept: acceptState, fail: failState, fn: fn }; |
|
return this; |
|
}; |
|
|
|
module.exports = AcceptorStateMachine; |
|
|
|
},{}],61:[function(require,module,exports){ |
|
(function (process){ |
|
/* eslint guard-for-in:0 */ |
|
var AWS; |
|
|
|
/** |
|
* A set of utility methods for use with the AWS SDK. |
|
* |
|
* @!attribute abort |
|
* Return this value from an iterator function {each} or {arrayEach} |
|
* to break out of the iteration. |
|
* @example Breaking out of an iterator function |
|
* AWS.util.each({a: 1, b: 2, c: 3}, function(key, value) { |
|
* if (key == 'b') return AWS.util.abort; |
|
* }); |
|
* @see each |
|
* @see arrayEach |
|
* @api private |
|
*/ |
|
var util = { |
|
engine: function engine() { |
|
if (util.isBrowser() && typeof navigator !== 'undefined') { |
|
return navigator.userAgent; |
|
} else { |
|
return process.platform + '/' + process.version; |
|
} |
|
}, |
|
|
|
userAgent: function userAgent() { |
|
var name = util.isBrowser() ? 'js' : 'nodejs'; |
|
var agent = 'aws-sdk-' + name + '/' + require('./core').VERSION; |
|
if (name === 'nodejs') agent += ' ' + util.engine(); |
|
return agent; |
|
}, |
|
|
|
isBrowser: function isBrowser() { return process && process.browser; }, |
|
isNode: function isNode() { return !util.isBrowser(); }, |
|
uriEscape: function uriEscape(string) { |
|
var output = encodeURIComponent(string); |
|
output = output.replace(/[^A-Za-z0-9_.~\-%]+/g, escape); |
|
|
|
// AWS percent-encodes some extra non-standard characters in a URI |
|
output = output.replace(/[*]/g, function(ch) { |
|
return '%' + ch.charCodeAt(0).toString(16).toUpperCase(); |
|
}); |
|
|
|
return output; |
|
}, |
|
|
|
uriEscapePath: function uriEscapePath(string) { |
|
var parts = []; |
|
util.arrayEach(string.split('/'), function (part) { |
|
parts.push(util.uriEscape(part)); |
|
}); |
|
return parts.join('/'); |
|
}, |
|
|
|
urlParse: function urlParse(url) { |
|
return util.url.parse(url); |
|
}, |
|
|
|
urlFormat: function urlFormat(url) { |
|
return util.url.format(url); |
|
}, |
|
|
|
queryStringParse: function queryStringParse(qs) { |
|
return util.querystring.parse(qs); |
|
}, |
|
|
|
queryParamsToString: function queryParamsToString(params) { |
|
var items = []; |
|
var escape = util.uriEscape; |
|
var sortedKeys = Object.keys(params).sort(); |
|
|
|
util.arrayEach(sortedKeys, function(name) { |
|
var value = params[name]; |
|
var ename = escape(name); |
|
var result = ename + '='; |
|
if (Array.isArray(value)) { |
|
var vals = []; |
|
util.arrayEach(value, function(item) { vals.push(escape(item)); }); |
|
result = ename + '=' + vals.sort().join('&' + ename + '='); |
|
} else if (value !== undefined && value !== null) { |
|
result = ename + '=' + escape(value); |
|
} |
|
items.push(result); |
|
}); |
|
|
|
return items.join('&'); |
|
}, |
|
|
|
readFileSync: function readFileSync(path) { |
|
if (util.isBrowser()) return null; |
|
return require('fs').readFileSync(path, 'utf-8'); |
|
}, |
|
|
|
base64: { |
|
|
|
encode: function encode64(string) { |
|
return new util.Buffer(string).toString('base64'); |
|
}, |
|
|
|
decode: function decode64(string) { |
|
return new util.Buffer(string, 'base64'); |
|
} |
|
|
|
}, |
|
|
|
buffer: { |
|
toStream: function toStream(buffer) { |
|
if (!util.Buffer.isBuffer(buffer)) buffer = new util.Buffer(buffer); |
|
|
|
var readable = new (util.stream.Readable)(); |
|
var pos = 0; |
|
readable._read = function(size) { |
|
if (pos >= buffer.length) return readable.push(null); |
|
|
|
var end = pos + size; |
|
if (end > buffer.length) end = buffer.length; |
|
readable.push(buffer.slice(pos, end)); |
|
pos = end; |
|
}; |
|
|
|
return readable; |
|
}, |
|
|
|
/** |
|
* Concatenates a list of Buffer objects. |
|
*/ |
|
concat: function(buffers) { |
|
var length = 0, |
|
offset = 0, |
|
buffer = null, i; |
|
|
|
for (i = 0; i < buffers.length; i++) { |
|
length += buffers[i].length; |
|
} |
|
|
|
buffer = new util.Buffer(length); |
|
|
|
for (i = 0; i < buffers.length; i++) { |
|
buffers[i].copy(buffer, offset); |
|
offset += buffers[i].length; |
|
} |
|
|
|
return buffer; |
|
} |
|
}, |
|
|
|
string: { |
|
byteLength: function byteLength(string) { |
|
if (string === null || string === undefined) return 0; |
|
if (typeof string === 'string') string = new util.Buffer(string); |
|
|
|
if (typeof string.byteLength === 'number') { |
|
return string.byteLength; |
|
} else if (typeof string.length === 'number') { |
|
return string.length; |
|
} else if (typeof string.size === 'number') { |
|
return string.size; |
|
} else if (typeof string.path === 'string') { |
|
return require('fs').lstatSync(string.path).size; |
|
} else { |
|
throw util.error(new Error('Cannot determine length of ' + string), |
|
{ object: string }); |
|
} |
|
}, |
|
|
|
upperFirst: function upperFirst(string) { |
|
return string[0].toUpperCase() + string.substr(1); |
|
}, |
|
|
|
lowerFirst: function lowerFirst(string) { |
|
return string[0].toLowerCase() + string.substr(1); |
|
} |
|
}, |
|
|
|
ini: { |
|
parse: function string(ini) { |
|
var currentSection, map = {}; |
|
util.arrayEach(ini.split(/\r?\n/), function(line) { |
|
line = line.split(/(^|\s)[;#]/)[0]; // remove comments |
|
var section = line.match(/^\s*\[([^\[\]]+)\]\s*$/); |
|
if (section) { |
|
currentSection = section[1]; |
|
} else if (currentSection) { |
|
var item = line.match(/^\s*(.+?)\s*=\s*(.+?)\s*$/); |
|
if (item) { |
|
map[currentSection] = map[currentSection] || {}; |
|
map[currentSection][item[1]] = item[2]; |
|
} |
|
} |
|
}); |
|
|
|
return map; |
|
} |
|
}, |
|
|
|
fn: { |
|
noop: function() {}, |
|
|
|
/** |
|
* Turn a synchronous function into as "async" function by making it call |
|
* a callback. The underlying function is called with all but the last argument, |
|
* which is treated as the callback. The callback is passed passed a first argument |
|
* of null on success to mimick standard node callbacks. |
|
*/ |
|
makeAsync: function makeAsync(fn, expectedArgs) { |
|
if (expectedArgs && expectedArgs <= fn.length) { |
|
return fn; |
|
} |
|
|
|
return function() { |
|
var args = Array.prototype.slice.call(arguments, 0); |
|
var callback = args.pop(); |
|
var result = fn.apply(null, args); |
|
callback(result); |
|
}; |
|
} |
|
}, |
|
|
|
/** |
|
* Date and time utility functions. |
|
*/ |
|
date: { |
|
|
|
/** |
|
* @return [Date] the current JavaScript date object. Since all |
|
* AWS services rely on this date object, you can override |
|
* this function to provide a special time value to AWS service |
|
* requests. |
|
*/ |
|
getDate: function getDate() { |
|
if (!AWS) AWS = require('./core'); |
|
if (AWS.config.systemClockOffset) { // use offset when non-zero |
|
return new Date(new Date().getTime() + AWS.config.systemClockOffset); |
|
} else { |
|
return new Date(); |
|
} |
|
}, |
|
|
|
/** |
|
* @return [String] the date in ISO-8601 format |
|
*/ |
|
iso8601: function iso8601(date) { |
|
if (date === undefined) { date = util.date.getDate(); } |
|
return date.toISOString().replace(/\.\d{3}Z$/, 'Z'); |
|
}, |
|
|
|
/** |
|
* @return [String] the date in RFC 822 format |
|
*/ |
|
rfc822: function rfc822(date) { |
|
if (date === undefined) { date = util.date.getDate(); } |
|
return date.toUTCString(); |
|
}, |
|
|
|
/** |
|
* @return [Integer] the UNIX timestamp value for the current time |
|
*/ |
|
unixTimestamp: function unixTimestamp(date) { |
|
if (date === undefined) { date = util.date.getDate(); } |
|
return date.getTime() / 1000; |
|
}, |
|
|
|
/** |
|
* @param [String,number,Date] date |
|
* @return [Date] |
|
*/ |
|
from: function format(date) { |
|
if (typeof date === 'number') { |
|
return new Date(date * 1000); // unix timestamp |
|
} else { |
|
return new Date(date); |
|
} |
|
}, |
|
|
|
/** |
|
* Given a Date or date-like value, this function formats the |
|
* date into a string of the requested value. |
|
* @param [String,number,Date] date |
|
* @param [String] formatter Valid formats are: |
|
# * 'iso8601' |
|
# * 'rfc822' |
|
# * 'unixTimestamp' |
|
* @return [String] |
|
*/ |
|
format: function format(date, formatter) { |
|
if (!formatter) formatter = 'iso8601'; |
|
return util.date[formatter](util.date.from(date)); |
|
}, |
|
|
|
parseTimestamp: function parseTimestamp(value) { |
|
if (typeof value === 'number') { // unix timestamp (number) |
|
return new Date(value * 1000); |
|
} else if (value.match(/^\d+$/)) { // unix timestamp |
|
return new Date(value * 1000); |
|
} else if (value.match(/^\d{4}/)) { // iso8601 |
|
return new Date(value); |
|
} else if (value.match(/^\w{3},/)) { // rfc822 |
|
return new Date(value); |
|
} else { |
|
throw util.error( |
|
new Error('unhandled timestamp format: ' + value), |
|
{code: 'TimestampParserError'}); |
|
} |
|
} |
|
|
|
}, |
|
|
|
crypto: { |
|
crc32Table: [ |
|
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, |
|
0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, |
|
0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, |
|
0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, |
|
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, |
|
0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, |
|
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, |
|
0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, |
|
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, |
|
0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, |
|
0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, |
|
0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, |
|
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, |
|
0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, |
|
0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, |
|
0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, |
|
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, |
|
0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, |
|
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, |
|
0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, |
|
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, |
|
0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, |
|
0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, |
|
0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, |
|
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, |
|
0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, |
|
0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, |
|
0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, |
|
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, |
|
0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, |
|
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, |
|
0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, |
|
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, |
|
0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, |
|
0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, |
|
0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, |
|
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, |
|
0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, |
|
0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, |
|
0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, |
|
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, |
|
0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, |
|
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, |
|
0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, |
|
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, |
|
0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, |
|
0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, |
|
0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, |
|
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, |
|
0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, |
|
0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, |
|
0x2D02EF8D], |
|
|
|
crc32: function crc32(data) { |
|
var tbl = util.crypto.crc32Table; |
|
var crc = 0 ^ -1; |
|
|
|
if (typeof data === 'string') { |
|
data = new util.Buffer(data); |
|
} |
|
|
|
for (var i = 0; i < data.length; i++) { |
|
var code = data.readUInt8(i); |
|
crc = (crc >>> 8) ^ tbl[(crc ^ code) & 0xFF]; |
|
} |
|
return (crc ^ -1) >>> 0; |
|
}, |
|
|
|
hmac: function hmac(key, string, digest, fn) { |
|
if (!digest) digest = 'binary'; |
|
if (digest === 'buffer') { digest = undefined; } |
|
if (!fn) fn = 'sha256'; |
|
if (typeof string === 'string') string = new util.Buffer(string); |
|
return util.crypto.lib.createHmac(fn, key).update(string).digest(digest); |
|
}, |
|
|
|
md5: function md5(data, digest, callback) { |
|
return util.crypto.hash('md5', data, digest, callback); |
|
}, |
|
|
|
sha256: function sha256(data, digest, callback) { |
|
return util.crypto.hash('sha256', data, digest, callback); |
|
}, |
|
|
|
hash: function(algorithm, data, digest, callback) { |
|
var hash = util.crypto.createHash(algorithm); |
|
if (!digest) { digest = 'binary'; } |
|
if (digest === 'buffer') { digest = undefined; } |
|
if (typeof data === 'string') data = new util.Buffer(data); |
|
var sliceFn = util.arraySliceFn(data); |
|
var isBuffer = util.Buffer.isBuffer(data); |
|
//Identifying objects with an ArrayBuffer as buffers |
|
if (util.isBrowser() && typeof ArrayBuffer !== 'undefined' && data && data.buffer instanceof ArrayBuffer) isBuffer = true; |
|
|
|
if (callback && typeof data === 'object' && |
|
typeof data.on === 'function' && !isBuffer) { |
|
data.on('data', function(chunk) { hash.update(chunk); }); |
|
data.on('error', function(err) { callback(err); }); |
|
data.on('end', function() { callback(null, hash.digest(digest)); }); |
|
} else if (callback && sliceFn && !isBuffer && |
|
typeof FileReader !== 'undefined') { |
|
// this might be a File/Blob |
|
var index = 0, size = 1024 * 512; |
|
var reader = new FileReader(); |
|
reader.onerror = function() { |
|
callback(new Error('Failed to read data.')); |
|
}; |
|
reader.onload = function() { |
|
var buf = new util.Buffer(new Uint8Array(reader.result)); |
|
hash.update(buf); |
|
index += buf.length; |
|
reader._continueReading(); |
|
}; |
|
reader._continueReading = function() { |
|
if (index >= data.size) { |
|
callback(null, hash.digest(digest)); |
|
return; |
|
} |
|
|
|
var back = index + size; |
|
if (back > data.size) back = data.size; |
|
reader.readAsArrayBuffer(sliceFn.call(data, index, back)); |
|
}; |
|
|
|
reader._continueReading(); |
|
} else { |
|
if (util.isBrowser() && typeof data === 'object' && !isBuffer) { |
|
data = new util.Buffer(new Uint8Array(data)); |
|
} |
|
var out = hash.update(data).digest(digest); |
|
if (callback) callback(null, out); |
|
return out; |
|
} |
|
}, |
|
|
|
toHex: function toHex(data) { |
|
var out = []; |
|
for (var i = 0; i < data.length; i++) { |
|
out.push(('0' + data.charCodeAt(i).toString(16)).substr(-2, 2)); |
|
} |
|
return out.join(''); |
|
}, |
|
|
|
createHash: function createHash(algorithm) { |
|
return util.crypto.lib.createHash(algorithm); |
|
} |
|
|
|
}, |
|
|
|
/** @!ignore */ |
|
|
|
/* Abort constant */ |
|
abort: {}, |
|
|
|
each: function each(object, iterFunction) { |
|
for (var key in object) { |
|
if (Object.prototype.hasOwnProperty.call(object, key)) { |
|
var ret = iterFunction.call(this, key, object[key]); |
|
if (ret === util.abort) break; |
|
} |
|
} |
|
}, |
|
|
|
arrayEach: function arrayEach(array, iterFunction) { |
|
for (var idx in array) { |
|
if (Object.prototype.hasOwnProperty.call(array, idx)) { |
|
var ret = iterFunction.call(this, array[idx], parseInt(idx, 10)); |
|
if (ret === util.abort) break; |
|
} |
|
} |
|
}, |
|
|
|
update: function update(obj1, obj2) { |
|
util.each(obj2, function iterator(key, item) { |
|
obj1[key] = item; |
|
}); |
|
return obj1; |
|
}, |
|
|
|
merge: function merge(obj1, obj2) { |
|
return util.update(util.copy(obj1), obj2); |
|
}, |
|
|
|
copy: function copy(object) { |
|
if (object === null || object === undefined) return object; |
|
var dupe = {}; |
|
// jshint forin:false |
|
for (var key in object) { |
|
dupe[key] = object[key]; |
|
} |
|
return dupe; |
|
}, |
|
|
|
isEmpty: function isEmpty(obj) { |
|
for (var prop in obj) { |
|
if (Object.prototype.hasOwnProperty.call(obj, prop)) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
}, |
|
|
|
arraySliceFn: function arraySliceFn(obj) { |
|
var fn = obj.slice || obj.webkitSlice || obj.mozSlice; |
|
return typeof fn === 'function' ? fn : null; |
|
}, |
|
|
|
isType: function isType(obj, type) { |
|
// handle cross-"frame" objects |
|
if (typeof type === 'function') type = util.typeName(type); |
|
return Object.prototype.toString.call(obj) === '[object ' + type + ']'; |
|
}, |
|
|
|
typeName: function typeName(type) { |
|
if (Object.prototype.hasOwnProperty.call(type, 'name')) return type.name; |
|
var str = type.toString(); |
|
var match = str.match(/^\s*function (.+)\(/); |
|
return match ? match[1] : str; |
|
}, |
|
|
|
error: function error(err, options) { |
|
var originalError = null; |
|
if (typeof err.message === 'string' && err.message !== '') { |
|
if (typeof options === 'string' || (options && options.message)) { |
|
originalError = util.copy(err); |
|
originalError.message = err.message; |
|
} |
|
} |
|
err.message = err.message || null; |
|
|
|
if (typeof options === 'string') { |
|
err.message = options; |
|
} else if (typeof options === 'object' && options !== null) { |
|
util.update(err, options); |
|
if (options.message) |
|
err.message = options.message; |
|
if (options.code || options.name) |
|
err.code = options.code || options.name; |
|
if (options.stack) |
|
err.stack = options.stack; |
|
} |
|
|
|
if (typeof Object.defineProperty === 'function') { |
|
Object.defineProperty(err, 'name', {writable: true, enumerable: false}); |
|
Object.defineProperty(err, 'message', {enumerable: true}); |
|
} |
|
|
|
err.name = options && options.name || err.name || err.code || 'Error'; |
|
err.time = new Date(); |
|
|
|
if (originalError) err.originalError = originalError; |
|
|
|
return err; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
inherit: function inherit(klass, features) { |
|
var newObject = null; |
|
if (features === undefined) { |
|
features = klass; |
|
klass = Object; |
|
newObject = {}; |
|
} else { |
|
var ctor = function ConstructorWrapper() {}; |
|
ctor.prototype = klass.prototype; |
|
newObject = new ctor(); |
|
} |
|
|
|
// constructor not supplied, create pass-through ctor |
|
if (features.constructor === Object) { |
|
features.constructor = function() { |
|
if (klass !== Object) { |
|
return klass.apply(this, arguments); |
|
} |
|
}; |
|
} |
|
|
|
features.constructor.prototype = newObject; |
|
util.update(features.constructor.prototype, features); |
|
features.constructor.__super__ = klass; |
|
return features.constructor; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
mixin: function mixin() { |
|
var klass = arguments[0]; |
|
for (var i = 1; i < arguments.length; i++) { |
|
// jshint forin:false |
|
for (var prop in arguments[i].prototype) { |
|
var fn = arguments[i].prototype[prop]; |
|
if (prop !== 'constructor') { |
|
klass.prototype[prop] = fn; |
|
} |
|
} |
|
} |
|
return klass; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
hideProperties: function hideProperties(obj, props) { |
|
if (typeof Object.defineProperty !== 'function') return; |
|
|
|
util.arrayEach(props, function (key) { |
|
Object.defineProperty(obj, key, { |
|
enumerable: false, writable: true, configurable: true }); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
property: function property(obj, name, value, enumerable, isValue) { |
|
var opts = { |
|
configurable: true, |
|
enumerable: enumerable !== undefined ? enumerable : true |
|
}; |
|
if (typeof value === 'function' && !isValue) { |
|
opts.get = value; |
|
} |
|
else { |
|
opts.value = value; opts.writable = true; |
|
} |
|
|
|
Object.defineProperty(obj, name, opts); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
memoizedProperty: function memoizedProperty(obj, name, get, enumerable) { |
|
var cachedValue = null; |
|
|
|
// build enumerable attribute for each value with lazy accessor. |
|
util.property(obj, name, function() { |
|
if (cachedValue === null) { |
|
cachedValue = get(); |
|
} |
|
return cachedValue; |
|
}, enumerable); |
|
}, |
|
|
|
/** |
|
* TODO Remove in major version revision |
|
* This backfill populates response data without the |
|
* top-level payload name. |
|
* |
|
* @api private |
|
*/ |
|
hoistPayloadMember: function hoistPayloadMember(resp) { |
|
var req = resp.request; |
|
var operation = req.operation; |
|
var output = req.service.api.operations[operation].output; |
|
if (output.payload) { |
|
var payloadMember = output.members[output.payload]; |
|
var responsePayload = resp.data[output.payload]; |
|
if (payloadMember.type === 'structure') { |
|
util.each(responsePayload, function(key, value) { |
|
util.property(resp.data, key, value, false); |
|
}); |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* Compute SHA-256 checksums of streams |
|
* |
|
* @api private |
|
*/ |
|
computeSha256: function computeSha256(body, done) { |
|
if (util.isNode()) { |
|
var Stream = util.stream.Stream; |
|
var fs = require('fs'); |
|
if (body instanceof Stream) { |
|
if (typeof body.path === 'string') { // assume file object |
|
var settings = {}; |
|
if (typeof body.start === 'number') { |
|
settings.start = body.start; |
|
} |
|
if (typeof body.end === 'number') { |
|
settings.end = body.end; |
|
} |
|
body = fs.createReadStream(body.path, settings); |
|
} else { // TODO support other stream types |
|
return done(new Error('Non-file stream objects are ' + |
|
'not supported with SigV4')); |
|
} |
|
} |
|
} |
|
|
|
util.crypto.sha256(body, 'hex', function(err, sha) { |
|
if (err) done(err); |
|
else done(null, sha); |
|
}); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
isClockSkewed: function isClockSkewed(serverTime) { |
|
if (serverTime) { |
|
util.property(AWS.config, 'isClockSkewed', |
|
Math.abs(new Date().getTime() - serverTime) >= 300000, false); |
|
return AWS.config.isClockSkewed; |
|
} |
|
}, |
|
|
|
applyClockOffset: function applyClockOffset(serverTime) { |
|
if (serverTime) |
|
AWS.config.systemClockOffset = serverTime - new Date().getTime(); |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
extractRequestId: function extractRequestId(resp) { |
|
var requestId = resp.httpResponse.headers['x-amz-request-id'] || |
|
resp.httpResponse.headers['x-amzn-requestid']; |
|
|
|
if (!requestId && resp.data && resp.data.ResponseMetadata) { |
|
requestId = resp.data.ResponseMetadata.RequestId; |
|
} |
|
|
|
if (requestId) { |
|
resp.requestId = requestId; |
|
} |
|
|
|
if (resp.error) { |
|
resp.error.requestId = requestId; |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
addPromises: function addPromises(constructors, PromiseDependency) { |
|
if (PromiseDependency === undefined && AWS && AWS.config) { |
|
PromiseDependency = AWS.config.getPromisesDependency(); |
|
} |
|
if (PromiseDependency === undefined && typeof Promise !== 'undefined') { |
|
PromiseDependency = Promise; |
|
} |
|
if (typeof PromiseDependency !== 'function') var deletePromises = true; |
|
if (!Array.isArray(constructors)) constructors = [constructors]; |
|
|
|
for (var ind = 0; ind < constructors.length; ind++) { |
|
var constructor = constructors[ind]; |
|
if (deletePromises) { |
|
if (constructor.deletePromisesFromClass) { |
|
constructor.deletePromisesFromClass(); |
|
} |
|
} else if (constructor.addPromisesToClass) { |
|
constructor.addPromisesToClass(PromiseDependency); |
|
} |
|
} |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
promisifyMethod: function promisifyMethod(methodName, PromiseDependency) { |
|
return function promise() { |
|
var self = this; |
|
return new PromiseDependency(function(resolve, reject) { |
|
self[methodName](function(err, data) { |
|
if (err) { |
|
reject(err); |
|
} else { |
|
resolve(data); |
|
} |
|
}); |
|
}); |
|
}; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
isDualstackAvailable: function isDualstackAvailable(service) { |
|
if (!service) return false; |
|
var metadata = require('../apis/metadata.json'); |
|
if (typeof service !== 'string') service = service.serviceIdentifier; |
|
if (typeof service !== 'string' || !metadata.hasOwnProperty(service)) return false; |
|
return !!metadata[service].dualstackAvailable; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
calculateRetryDelay: function calculateRetryDelay(retryCount, retryDelayOptions) { |
|
if (!retryDelayOptions) retryDelayOptions = {}; |
|
var customBackoff = retryDelayOptions.customBackoff || null; |
|
if (typeof customBackoff === 'function') { |
|
return customBackoff(retryCount); |
|
} |
|
var base = retryDelayOptions.base || 100; |
|
var delay = Math.random() * (Math.pow(2, retryCount) * base); |
|
return delay; |
|
}, |
|
|
|
/** |
|
* @api private |
|
*/ |
|
handleRequestWithRetries: function handleRequestWithRetries(httpRequest, options, cb) { |
|
if (!options) options = {}; |
|
var http = AWS.HttpClient.getInstance(); |
|
var httpOptions = options.httpOptions || {}; |
|
var retryCount = 0; |
|
|
|
var errCallback = function(err) { |
|
var maxRetries = options.maxRetries || 0; |
|
if (err && err.code === 'TimeoutError') err.retryable = true; |
|
if (err && err.retryable && retryCount < maxRetries) { |
|
retryCount++; |
|
var delay = util.calculateRetryDelay(retryCount, options.retryDelayOptions); |
|
setTimeout(sendRequest, delay + (err.retryAfter || 0)); |
|
} else { |
|
cb(err); |
|
} |
|
}; |
|
|
|
var sendRequest = function() { |
|
var data = ''; |
|
http.handleRequest(httpRequest, httpOptions, function(httpResponse) { |
|
httpResponse.on('data', function(chunk) { data += chunk.toString(); }); |
|
httpResponse.on('end', function() { |
|
var statusCode = httpResponse.statusCode; |
|
if (statusCode < 300) { |
|
cb(null, data); |
|
} else { |
|
var retryAfter = parseInt(httpResponse.headers['retry-after'], 10) * 1000 || 0; |
|
var err = util.error(new Error(), |
|
{ retryable: statusCode >= 500 || statusCode === 429 } |
|
); |
|
if (retryAfter && err.retryable) err.retryAfter = retryAfter; |
|
errCallback(err); |
|
} |
|
}); |
|
}, errCallback); |
|
}; |
|
|
|
process.nextTick(sendRequest); |
|
} |
|
|
|
}; |
|
|
|
module.exports = util; |
|
|
|
}).call(this,require('_process')) |
|
},{"../apis/metadata.json":2,"./core":14,"_process":151,"fs":146}],62:[function(require,module,exports){ |
|
var util = require('../util'); |
|
var Shape = require('../model/shape'); |
|
|
|
function DomXmlParser() { } |
|
|
|
DomXmlParser.prototype.parse = function(xml, shape) { |
|
if (xml.replace(/^\s+/, '') === '') return {}; |
|
|
|
var result, error; |
|
try { |
|
if (window.DOMParser) { |
|
try { |
|
var parser = new DOMParser(); |
|
result = parser.parseFromString(xml, 'text/xml'); |
|
} catch (syntaxError) { |
|
throw util.error(new Error('Parse error in document'), |
|
{ |
|
originalError: syntaxError, |
|
code: 'XMLParserError', |
|
retryable: true |
|
}); |
|
} |
|
|
|
if (result.documentElement === null) { |
|
throw util.error(new Error('Cannot parse empty document.'), |
|
{ |
|
code: 'XMLParserError', |
|
retryable: true |
|
}); |
|
} |
|
|
|
var isError = result.getElementsByTagName('parsererror')[0]; |
|
if (isError && (isError.parentNode === result || |
|
isError.parentNode.nodeName === 'body' || |
|
isError.parentNode.parentNode === result || |
|
isError.parentNode.parentNode.nodeName === 'body')) { |
|
var errorElement = isError.getElementsByTagName('div')[0] || isError; |
|
throw util.error(new Error(errorElement.textContent || 'Parser error in document'), |
|
{ |
|
code: 'XMLParserError', |
|
retryable: true |
|
}); |
|
} |
|
} else if (window.ActiveXObject) { |
|
result = new window.ActiveXObject('Microsoft.XMLDOM'); |
|
result.async = false; |
|
|
|
if (!result.loadXML(xml)) { |
|
throw util.error(new Error('Parse error in document'), |
|
{ |
|
code: 'XMLParserError', |
|
retryable: true |
|
}); |
|
} |
|
} else { |
|
throw new Error('Cannot load XML parser'); |
|
} |
|
} catch (e) { |
|
error = e; |
|
} |
|
|
|
if (result && result.documentElement && !error) { |
|
var data = parseXml(result.documentElement, shape); |
|
var metadata = result.getElementsByTagName('ResponseMetadata')[0]; |
|
if (metadata) { |
|
data.ResponseMetadata = parseXml(metadata, {}); |
|
} |
|
return data; |
|
} else if (error) { |
|
throw util.error(error || new Error(), {code: 'XMLParserError', retryable: true}); |
|
} else { // empty xml document |
|
return {}; |
|
} |
|
}; |
|
|
|
function parseXml(xml, shape) { |
|
if (!shape) shape = {}; |
|
switch (shape.type) { |
|
case 'structure': return parseStructure(xml, shape); |
|
case 'map': return parseMap(xml, shape); |
|
case 'list': return parseList(xml, shape); |
|
case undefined: case null: return parseUnknown(xml); |
|
default: return parseScalar(xml, shape); |
|
} |
|
} |
|
|
|
function parseStructure(xml, shape) { |
|
var data = {}; |
|
if (xml === null) return data; |
|
|
|
util.each(shape.members, function(memberName, memberShape) { |
|
if (memberShape.isXmlAttribute) { |
|
if (Object.prototype.hasOwnProperty.call(xml.attributes, memberShape.name)) { |
|
var value = xml.attributes[memberShape.name].value; |
|
data[memberName] = parseXml({textContent: value}, memberShape); |
|
} |
|
} else { |
|
var xmlChild = memberShape.flattened ? xml : |
|
xml.getElementsByTagName(memberShape.name)[0]; |
|
if (xmlChild) { |
|
data[memberName] = parseXml(xmlChild, memberShape); |
|
} else if (!memberShape.flattened && memberShape.type === 'list') { |
|
data[memberName] = memberShape.defaultValue; |
|
} |
|
} |
|
}); |
|
|
|
return data; |
|
} |
|
|
|
function parseMap(xml, shape) { |
|
var data = {}; |
|
var xmlKey = shape.key.name || 'key'; |
|
var xmlValue = shape.value.name || 'value'; |
|
var tagName = shape.flattened ? shape.name : 'entry'; |
|
|
|
var child = xml.firstElementChild; |
|
while (child) { |
|
if (child.nodeName === tagName) { |
|
var key = child.getElementsByTagName(xmlKey)[0].textContent; |
|
var value = child.getElementsByTagName(xmlValue)[0]; |
|
data[key] = parseXml(value, shape.value); |
|
} |
|
child = child.nextElementSibling; |
|
} |
|
return data; |
|
} |
|
|
|
function parseList(xml, shape) { |
|
var data = []; |
|
var tagName = shape.flattened ? shape.name : (shape.member.name || 'member'); |
|
|
|
var child = xml.firstElementChild; |
|
while (child) { |
|
if (child.nodeName === tagName) { |
|
data.push(parseXml(child, shape.member)); |
|
} |
|
child = child.nextElementSibling; |
|
} |
|
return data; |
|
} |
|
|
|
function parseScalar(xml, shape) { |
|
if (xml.getAttribute) { |
|
var encoding = xml.getAttribute('encoding'); |
|
if (encoding === 'base64') { |
|
shape = new Shape.create({type: encoding}); |
|
} |
|
} |
|
|
|
var text = xml.textContent; |
|
if (text === '') text = null; |
|
if (typeof shape.toType === 'function') { |
|
return shape.toType(text); |
|
} else { |
|
return text; |
|
} |
|
} |
|
|
|
function parseUnknown(xml) { |
|
if (xml === undefined || xml === null) return ''; |
|
|
|
// empty object |
|
if (!xml.firstElementChild) { |
|
if (xml.parentNode.parentNode === null) return {}; |
|
if (xml.childNodes.length === 0) return ''; |
|
else return xml.textContent; |
|
} |
|
|
|
// object, parse as structure |
|
var shape = {type: 'structure', members: {}}; |
|
var child = xml.firstElementChild; |
|
while (child) { |
|
var tag = child.nodeName; |
|
if (Object.prototype.hasOwnProperty.call(shape.members, tag)) { |
|
// multiple tags of the same name makes it a list |
|
shape.members[tag].type = 'list'; |
|
} else { |
|
shape.members[tag] = {name: tag}; |
|
} |
|
child = child.nextElementSibling; |
|
} |
|
return parseStructure(xml, shape); |
|
} |
|
|
|
module.exports = DomXmlParser; |
|
|
|
},{"../model/shape":32,"../util":61}],63:[function(require,module,exports){ |
|
var util = require('../util'); |
|
var builder = require('xmlbuilder'); |
|
|
|
function XmlBuilder() { } |
|
|
|
XmlBuilder.prototype.toXML = function(params, shape, rootElement, noEmpty) { |
|
var xml = builder.create(rootElement); |
|
applyNamespaces(xml, shape); |
|
serialize(xml, params, shape); |
|
return xml.children.length > 0 || noEmpty ? xml.root().toString() : ''; |
|
}; |
|
|
|
function serialize(xml, value, shape) { |
|
switch (shape.type) { |
|
case 'structure': return serializeStructure(xml, value, shape); |
|
case 'map': return serializeMap(xml, value, shape); |
|
case 'list': return serializeList(xml, value, shape); |
|
default: return serializeScalar(xml, value, shape); |
|
} |
|
} |
|
|
|
function serializeStructure(xml, params, shape) { |
|
util.arrayEach(shape.memberNames, function(memberName) { |
|
var memberShape = shape.members[memberName]; |
|
if (memberShape.location !== 'body') return; |
|
|
|
var value = params[memberName]; |
|
var name = memberShape.name; |
|
if (value !== undefined && value !== null) { |
|
if (memberShape.isXmlAttribute) { |
|
xml.att(name, value); |
|
} else if (memberShape.flattened) { |
|
serialize(xml, value, memberShape); |
|
} else { |
|
var element = xml.ele(name); |
|
applyNamespaces(element, memberShape); |
|
serialize(element, value, memberShape); |
|
} |
|
} |
|
}); |
|
} |
|
|
|
function serializeMap(xml, map, shape) { |
|
var xmlKey = shape.key.name || 'key'; |
|
var xmlValue = shape.value.name || 'value'; |
|
|
|
util.each(map, function(key, value) { |
|
var entry = xml.ele(shape.flattened ? shape.name : 'entry'); |
|
serialize(entry.ele(xmlKey), key, shape.key); |
|
serialize(entry.ele(xmlValue), value, shape.value); |
|
}); |
|
} |
|
|
|
function serializeList(xml, list, shape) { |
|
if (shape.flattened) { |
|
util.arrayEach(list, function(value) { |
|
var name = shape.member.name || shape.name; |
|
var element = xml.ele(name); |
|
serialize(element, value, shape.member); |
|
}); |
|
} else { |
|
util.arrayEach(list, function(value) { |
|
var name = shape.member.name || 'member'; |
|
var element = xml.ele(name); |
|
serialize(element, value, shape.member); |
|
}); |
|
} |
|
} |
|
|
|
function serializeScalar(xml, value, shape) { |
|
xml.txt(shape.toWireFormat(value)); |
|
} |
|
|
|
function applyNamespaces(xml, shape) { |
|
var uri, prefix = 'xmlns'; |
|
if (shape.xmlNamespaceUri) { |
|
uri = shape.xmlNamespaceUri; |
|
if (shape.xmlNamespacePrefix) prefix += ':' + shape.xmlNamespacePrefix; |
|
} else if (xml.isRoot && shape.api.xmlNamespaceUri) { |
|
uri = shape.api.xmlNamespaceUri; |
|
} |
|
|
|
if (uri) xml.att(prefix, uri); |
|
} |
|
|
|
module.exports = XmlBuilder; |
|
|
|
},{"../util":61,"xmlbuilder":144}],64:[function(require,module,exports){ |
|
var util = require('../util'); |
|
var Shape = require('../model/shape'); |
|
|
|
function NsXmlParser() { } |
|
|
|
NsXmlParser.prototype.parse = function(xml, shape) { |
|
if (xml.replace(/^\s+/, '') === '') return {}; |
|
|
|
var result, error; |
|
try { |
|
if (NS.xml) { |
|
result = NS.xml.Parser.fromString({text: xml}); |
|
} else { |
|
throw new Error('Cannot load XML parser NS.xml'); |
|
} |
|
} catch (e) { |
|
error = e; |
|
} |
|
|
|
if (result && result.documentElement && !error) { |
|
var data = parseXml(result.documentElement, shape); |
|
var metadata = result.getElementsByTagName('ResponseMetadata'); |
|
if (metadata && metadata.length > 0) { |
|
data.ResponseMetadata = parseXml(metadata, {}); |
|
} |
|
return data; |
|
} else if (error) { |
|
if (NsXmlParser._nst_constructor) { |
|
log.error('NsXmlParser.parse [' + error.code + '] name: ' + ' message: ' + error.message + ' at ' + error.fileName + ':' + error.lineNumber, error.stack); |
|
} |
|
throw util.error(error || new Error(), {code: 'XMLParserError', retryable: false}); |
|
} else { // empty xml document |
|
return {}; |
|
} |
|
}; |
|
|
|
function parseXml(xml, shape) { |
|
if (!shape) shape = {}; |
|
switch (shape.type) { |
|
case 'structure': return parseStructure(xml, shape); |
|
case 'map': return parseMap(xml, shape); |
|
case 'list': return parseList(xml, shape); |
|
case undefined: case null: return parseUnknown(xml); |
|
default: return parseScalar(xml, shape); |
|
} |
|
} |
|
|
|
function parseStructure(xml, shape) { |
|
var data = {}; |
|
if (xml === null) return data; |
|
|
|
util.each(shape.members, function(memberName, memberShape) { |
|
if (memberShape.isXmlAttribute) { |
|
if (xml.hasAttribute({name: memberShape.name})) { |
|
var value = xml.attributes[memberShape.name]; |
|
data[memberName] = parseXml({textContent: value}, memberShape); |
|
} |
|
} else { |
|
var xmlChild = memberShape.flattened ? xml : xml.getElementsByTagName(memberShape.name)[0]; |
|
if (xmlChild) { |
|
data[memberName] = parseXml(xmlChild, memberShape); |
|
} else if (!memberShape.flattened && memberShape.type === 'list') { |
|
data[memberName] = memberShape.defaultValue; |
|
} |
|
} |
|
}); |
|
|
|
return data; |
|
} |
|
|
|
function parseMap(xml, shape) { |
|
var data = {}; |
|
var xmlKey = shape.key.name || 'key'; |
|
var xmlValue = shape.value.name || 'value'; |
|
var tagName = shape.flattened ? shape.name : 'entry'; |
|
|
|
var child = xml.firstChild; |
|
while (child) { |
|
if (child.nodeName === tagName) { |
|
var key = child.getElementsByTagName(xmlKey)[0].textContent; |
|
var value = child.getElementsByTagName(xmlValue)[0]; |
|
data[key] = parseXml(value, shape.value); |
|
} |
|
child = child.nextSibling; |
|
} |
|
return data; |
|
} |
|
|
|
function parseList(xml, shape) { |
|
var data = []; |
|
var tagName = shape.flattened ? shape.name : (shape.member.name || 'member'); |
|
|
|
var child = xml.firstChild; |
|
while (child) { |
|
if (child.nodeName === tagName) { |
|
data.push(parseXml(child, shape.member)); |
|
} |
|
child = child.nextSibling; |
|
} |
|
return data; |
|
} |
|
|
|
function parseScalar(xml, shape) { |
|
if (xml.getAttribute) { |
|
var encoding = xml.getAttribute('encoding'); |
|
if (encoding === 'base64') { |
|
shape = new Shape.create({type: encoding}); |
|
} |
|
} |
|
|
|
var text = xml.textContent; |
|
if (text === '') text = null; |
|
if (typeof shape.toType === 'function') { |
|
return shape.toType(text); |
|
} else { |
|
return text; |
|
} |
|
} |
|
|
|
function parseUnknown(xml) { |
|
if (xml === undefined || xml === null) return ''; |
|
|
|
if (!xml.firstChild) { |
|
if (xml.parentNode && xml.parentNode.parentNode === null) return {}; |
|
if (xml.childNodes && xml.childNodes.length === 0) return ''; |
|
else return xml.textContent; |
|
} |
|
|
|
var shape = {type: 'structure', members: {}}; |
|
var child = xml.firstChild; |
|
while (child) { |
|
var tag = child.nodeName; |
|
if (Object.prototype.hasOwnProperty.call(shape.members, tag)) { |
|
shape.members[tag].type = 'list'; |
|
} else { |
|
shape.members[tag] = {name: tag}; |
|
} |
|
child = child.nextSibling; |
|
} |
|
return parseStructure(xml, shape); |
|
} |
|
|
|
module.exports = NsXmlParser; |
|
},{"../model/shape":32,"../util":61}],65:[function(require,module,exports){ |
|
'use strict' |
|
|
|
exports.byteLength = byteLength |
|
exports.toByteArray = toByteArray |
|
exports.fromByteArray = fromByteArray |
|
|
|
var lookup = [] |
|
var revLookup = [] |
|
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array |
|
|
|
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' |
|
for (var i = 0, len = code.length; i < len; ++i) { |
|
lookup[i] = code[i] |
|
revLookup[code.charCodeAt(i)] = i |
|
} |
|
|
|
revLookup['-'.charCodeAt(0)] = 62 |
|
revLookup['_'.charCodeAt(0)] = 63 |
|
|
|
function placeHoldersCount (b64) { |
|
var len = b64.length |
|
if (len % 4 > 0) { |
|
throw new Error('Invalid string. Length must be a multiple of 4') |
|
} |
|
|
|
// the number of equal signs (place holders) |
|
// if there are two placeholders, than the two characters before it |
|
// represent one byte |
|
// if there is only one, then the three characters before it represent 2 bytes |
|
// this is just a cheap hack to not do indexOf twice |
|
return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 |
|
} |
|
|
|
function byteLength (b64) { |
|
// base64 is 4/3 + up to two characters of the original data |
|
return b64.length * 3 / 4 - placeHoldersCount(b64) |
|
} |
|
|
|
function toByteArray (b64) { |
|
var i, j, l, tmp, placeHolders, arr |
|
var len = b64.length |
|
placeHolders = placeHoldersCount(b64) |
|
|
|
arr = new Arr(len * 3 / 4 - placeHolders) |
|
|
|
// if there are placeholders, only get up to the last complete 4 chars |
|
l = placeHolders > 0 ? len - 4 : len |
|
|
|
var L = 0 |
|
|
|
for (i = 0, j = 0; i < l; i += 4, j += 3) { |
|
tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] |
|
arr[L++] = (tmp >> 16) & 0xFF |
|
arr[L++] = (tmp >> 8) & 0xFF |
|
arr[L++] = tmp & 0xFF |
|
} |
|
|
|
if (placeHolders === 2) { |
|
tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) |
|
arr[L++] = tmp & 0xFF |
|
} else if (placeHolders === 1) { |
|
tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) |
|
arr[L++] = (tmp >> 8) & 0xFF |
|
arr[L++] = tmp & 0xFF |
|
} |
|
|
|
return arr |
|
} |
|
|
|
function tripletToBase64 (num) { |
|
return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] |
|
} |
|
|
|
function encodeChunk (uint8, start, end) { |
|
var tmp |
|
var output = [] |
|
for (var i = start; i < end; i += 3) { |
|
tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) |
|
output.push(tripletToBase64(tmp)) |
|
} |
|
return output.join('') |
|
} |
|
|
|
function fromByteArray (uint8) { |
|
var tmp |
|
var len = uint8.length |
|
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes |
|
var output = '' |
|
var parts = [] |
|
var maxChunkLength = 16383 // must be multiple of 3 |
|
|
|
// go through the array every three bytes, we'll deal with trailing stuff later |
|
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { |
|
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) |
|
} |
|
|
|
// pad the end with zeros, but make sure to not forget the extra bytes |
|
if (extraBytes === 1) { |
|
tmp = uint8[len - 1] |
|
output += lookup[tmp >> 2] |
|
output += lookup[(tmp << 4) & 0x3F] |
|
output += '==' |
|
} else if (extraBytes === 2) { |
|
tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) |
|
output += lookup[tmp >> 10] |
|
output += lookup[(tmp >> 4) & 0x3F] |
|
output += lookup[(tmp << 2) & 0x3F] |
|
output += '=' |
|
} |
|
|
|
parts.push(output) |
|
|
|
return parts.join('') |
|
} |
|
|
|
},{}],66:[function(require,module,exports){ |
|
(function (global){ |
|
/*! |
|
* The buffer module from node.js, for the browser. |
|
* |
|
* @author Feross Aboukhadijeh <[email protected]> <http://feross.org> |
|
* @license MIT |
|
*/ |
|
/* eslint-disable no-proto */ |
|
|
|
'use strict' |
|
|
|
var base64 = require('base64-js') |
|
var ieee754 = require('ieee754') |
|
var isArray = require('isarray') |
|
|
|
exports.Buffer = Buffer |
|
exports.SlowBuffer = SlowBuffer |
|
exports.INSPECT_MAX_BYTES = 50 |
|
|
|
/** |
|
* If `Buffer.TYPED_ARRAY_SUPPORT`: |
|
* === true Use Uint8Array implementation (fastest) |
|
* === false Use Object implementation (most compatible, even IE6) |
|
* |
|
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, |
|
* Opera 11.6+, iOS 4.2+. |
|
* |
|
* Due to various browser bugs, sometimes the Object implementation will be used even |
|
* when the browser supports typed arrays. |
|
* |
|
* Note: |
|
* |
|
* - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, |
|
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. |
|
* |
|
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. |
|
* |
|
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of |
|
* incorrect length in some situations. |
|
|
|
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they |
|
* get the Object implementation, which is slower but behaves correctly. |
|
*/ |
|
Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined |
|
? global.TYPED_ARRAY_SUPPORT |
|
: typedArraySupport() |
|
|
|
/* |
|
* Export kMaxLength after typed array support is determined. |
|
*/ |
|
exports.kMaxLength = kMaxLength() |
|
|
|
function typedArraySupport () { |
|
try { |
|
var arr = new Uint8Array(1) |
|
arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} |
|
return arr.foo() === 42 && // typed array instances can be augmented |
|
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` |
|
arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` |
|
} catch (e) { |
|
return false |
|
} |
|
} |
|
|
|
function kMaxLength () { |
|
return Buffer.TYPED_ARRAY_SUPPORT |
|
? 0x7fffffff |
|
: 0x3fffffff |
|
} |
|
|
|
function createBuffer (that, length) { |
|
if (kMaxLength() < length) { |
|
throw new RangeError('Invalid typed array length') |
|
} |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
// Return an augmented `Uint8Array` instance, for best performance |
|
that = new Uint8Array(length) |
|
that.__proto__ = Buffer.prototype |
|
} else { |
|
// Fallback: Return an object instance of the Buffer class |
|
if (that === null) { |
|
that = new Buffer(length) |
|
} |
|
that.length = length |
|
} |
|
|
|
return that |
|
} |
|
|
|
/** |
|
* The Buffer constructor returns instances of `Uint8Array` that have their |
|
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of |
|
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods |
|
* and the `Uint8Array` methods. Square bracket notation works as expected -- it |
|
* returns a single octet. |
|
* |
|
* The `Uint8Array` prototype remains unmodified. |
|
*/ |
|
|
|
function Buffer (arg, encodingOrOffset, length) { |
|
if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { |
|
return new Buffer(arg, encodingOrOffset, length) |
|
} |
|
|
|
// Common case. |
|
if (typeof arg === 'number') { |
|
if (typeof encodingOrOffset === 'string') { |
|
throw new Error( |
|
'If encoding is specified then the first argument must be a string' |
|
) |
|
} |
|
return allocUnsafe(this, arg) |
|
} |
|
return from(this, arg, encodingOrOffset, length) |
|
} |
|
|
|
Buffer.poolSize = 8192 // not used by this implementation |
|
|
|
// TODO: Legacy, not needed anymore. Remove in next major version. |
|
Buffer._augment = function (arr) { |
|
arr.__proto__ = Buffer.prototype |
|
return arr |
|
} |
|
|
|
function from (that, value, encodingOrOffset, length) { |
|
if (typeof value === 'number') { |
|
throw new TypeError('"value" argument must not be a number') |
|
} |
|
|
|
if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { |
|
return fromArrayBuffer(that, value, encodingOrOffset, length) |
|
} |
|
|
|
if (typeof value === 'string') { |
|
return fromString(that, value, encodingOrOffset) |
|
} |
|
|
|
return fromObject(that, value) |
|
} |
|
|
|
/** |
|
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError |
|
* if value is a number. |
|
* Buffer.from(str[, encoding]) |
|
* Buffer.from(array) |
|
* Buffer.from(buffer) |
|
* Buffer.from(arrayBuffer[, byteOffset[, length]]) |
|
**/ |
|
Buffer.from = function (value, encodingOrOffset, length) { |
|
return from(null, value, encodingOrOffset, length) |
|
} |
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
Buffer.prototype.__proto__ = Uint8Array.prototype |
|
Buffer.__proto__ = Uint8Array |
|
if (typeof Symbol !== 'undefined' && Symbol.species && |
|
Buffer[Symbol.species] === Buffer) { |
|
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 |
|
Object.defineProperty(Buffer, Symbol.species, { |
|
value: null, |
|
configurable: true |
|
}) |
|
} |
|
} |
|
|
|
function assertSize (size) { |
|
if (typeof size !== 'number') { |
|
throw new TypeError('"size" argument must be a number') |
|
} else if (size < 0) { |
|
throw new RangeError('"size" argument must not be negative') |
|
} |
|
} |
|
|
|
function alloc (that, size, fill, encoding) { |
|
assertSize(size) |
|
if (size <= 0) { |
|
return createBuffer(that, size) |
|
} |
|
if (fill !== undefined) { |
|
// Only pay attention to encoding if it's a string. This |
|
// prevents accidentally sending in a number that would |
|
// be interpretted as a start offset. |
|
return typeof encoding === 'string' |
|
? createBuffer(that, size).fill(fill, encoding) |
|
: createBuffer(that, size).fill(fill) |
|
} |
|
return createBuffer(that, size) |
|
} |
|
|
|
/** |
|
* Creates a new filled Buffer instance. |
|
* alloc(size[, fill[, encoding]]) |
|
**/ |
|
Buffer.alloc = function (size, fill, encoding) { |
|
return alloc(null, size, fill, encoding) |
|
} |
|
|
|
function allocUnsafe (that, size) { |
|
assertSize(size) |
|
that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) |
|
if (!Buffer.TYPED_ARRAY_SUPPORT) { |
|
for (var i = 0; i < size; ++i) { |
|
that[i] = 0 |
|
} |
|
} |
|
return that |
|
} |
|
|
|
/** |
|
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. |
|
* */ |
|
Buffer.allocUnsafe = function (size) { |
|
return allocUnsafe(null, size) |
|
} |
|
/** |
|
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. |
|
*/ |
|
Buffer.allocUnsafeSlow = function (size) { |
|
return allocUnsafe(null, size) |
|
} |
|
|
|
function fromString (that, string, encoding) { |
|
if (typeof encoding !== 'string' || encoding === '') { |
|
encoding = 'utf8' |
|
} |
|
|
|
if (!Buffer.isEncoding(encoding)) { |
|
throw new TypeError('"encoding" must be a valid string encoding') |
|
} |
|
|
|
var length = byteLength(string, encoding) | 0 |
|
that = createBuffer(that, length) |
|
|
|
var actual = that.write(string, encoding) |
|
|
|
if (actual !== length) { |
|
// Writing a hex string, for example, that contains invalid characters will |
|
// cause everything after the first invalid character to be ignored. (e.g. |
|
// 'abxxcd' will be treated as 'ab') |
|
that = that.slice(0, actual) |
|
} |
|
|
|
return that |
|
} |
|
|
|
function fromArrayLike (that, array) { |
|
var length = array.length < 0 ? 0 : checked(array.length) | 0 |
|
that = createBuffer(that, length) |
|
for (var i = 0; i < length; i += 1) { |
|
that[i] = array[i] & 255 |
|
} |
|
return that |
|
} |
|
|
|
function fromArrayBuffer (that, array, byteOffset, length) { |
|
array.byteLength // this throws if `array` is not a valid ArrayBuffer |
|
|
|
if (byteOffset < 0 || array.byteLength < byteOffset) { |
|
throw new RangeError('\'offset\' is out of bounds') |
|
} |
|
|
|
if (array.byteLength < byteOffset + (length || 0)) { |
|
throw new RangeError('\'length\' is out of bounds') |
|
} |
|
|
|
if (byteOffset === undefined && length === undefined) { |
|
array = new Uint8Array(array) |
|
} else if (length === undefined) { |
|
array = new Uint8Array(array, byteOffset) |
|
} else { |
|
array = new Uint8Array(array, byteOffset, length) |
|
} |
|
|
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
// Return an augmented `Uint8Array` instance, for best performance |
|
that = array |
|
that.__proto__ = Buffer.prototype |
|
} else { |
|
// Fallback: Return an object instance of the Buffer class |
|
that = fromArrayLike(that, array) |
|
} |
|
return that |
|
} |
|
|
|
function fromObject (that, obj) { |
|
if (Buffer.isBuffer(obj)) { |
|
var len = checked(obj.length) | 0 |
|
that = createBuffer(that, len) |
|
|
|
if (that.length === 0) { |
|
return that |
|
} |
|
|
|
obj.copy(that, 0, 0, len) |
|
return that |
|
} |
|
|
|
if (obj) { |
|
if ((typeof ArrayBuffer !== 'undefined' && |
|
obj.buffer instanceof ArrayBuffer) || 'length' in obj) { |
|
if (typeof obj.length !== 'number' || isnan(obj.length)) { |
|
return createBuffer(that, 0) |
|
} |
|
return fromArrayLike(that, obj) |
|
} |
|
|
|
if (obj.type === 'Buffer' && isArray(obj.data)) { |
|
return fromArrayLike(that, obj.data) |
|
} |
|
} |
|
|
|
throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') |
|
} |
|
|
|
function checked (length) { |
|
// Note: cannot use `length < kMaxLength()` here because that fails when |
|
// length is NaN (which is otherwise coerced to zero.) |
|
if (length >= kMaxLength()) { |
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' + |
|
'size: 0x' + kMaxLength().toString(16) + ' bytes') |
|
} |
|
return length | 0 |
|
} |
|
|
|
function SlowBuffer (length) { |
|
if (+length != length) { // eslint-disable-line eqeqeq |
|
length = 0 |
|
} |
|
return Buffer.alloc(+length) |
|
} |
|
|
|
Buffer.isBuffer = function isBuffer (b) { |
|
return !!(b != null && b._isBuffer) |
|
} |
|
|
|
Buffer.compare = function compare (a, b) { |
|
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { |
|
throw new TypeError('Arguments must be Buffers') |
|
} |
|
|
|
if (a === b) return 0 |
|
|
|
var x = a.length |
|
var y = b.length |
|
|
|
for (var i = 0, len = Math.min(x, y); i < len; ++i) { |
|
if (a[i] !== b[i]) { |
|
x = a[i] |
|
y = b[i] |
|
break |
|
} |
|
} |
|
|
|
if (x < y) return -1 |
|
if (y < x) return 1 |
|
return 0 |
|
} |
|
|
|
Buffer.isEncoding = function isEncoding (encoding) { |
|
switch (String(encoding).toLowerCase()) { |
|
case 'hex': |
|
case 'utf8': |
|
case 'utf-8': |
|
case 'ascii': |
|
case 'latin1': |
|
case 'binary': |
|
case 'base64': |
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return true |
|
default: |
|
return false |
|
} |
|
} |
|
|
|
Buffer.concat = function concat (list, length) { |
|
if (!isArray(list)) { |
|
throw new TypeError('"list" argument must be an Array of Buffers') |
|
} |
|
|
|
if (list.length === 0) { |
|
return Buffer.alloc(0) |
|
} |
|
|
|
var i |
|
if (length === undefined) { |
|
length = 0 |
|
for (i = 0; i < list.length; ++i) { |
|
length += list[i].length |
|
} |
|
} |
|
|
|
var buffer = Buffer.allocUnsafe(length) |
|
var pos = 0 |
|
for (i = 0; i < list.length; ++i) { |
|
var buf = list[i] |
|
if (!Buffer.isBuffer(buf)) { |
|
throw new TypeError('"list" argument must be an Array of Buffers') |
|
} |
|
buf.copy(buffer, pos) |
|
pos += buf.length |
|
} |
|
return buffer |
|
} |
|
|
|
function byteLength (string, encoding) { |
|
if (Buffer.isBuffer(string)) { |
|
return string.length |
|
} |
|
if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && |
|
(ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { |
|
return string.byteLength |
|
} |
|
if (typeof string !== 'string') { |
|
string = '' + string |
|
} |
|
|
|
var len = string.length |
|
if (len === 0) return 0 |
|
|
|
// Use a for loop to avoid recursion |
|
var loweredCase = false |
|
for (;;) { |
|
switch (encoding) { |
|
case 'ascii': |
|
case 'latin1': |
|
case 'binary': |
|
return len |
|
case 'utf8': |
|
case 'utf-8': |
|
case undefined: |
|
return utf8ToBytes(string).length |
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return len * 2 |
|
case 'hex': |
|
return len >>> 1 |
|
case 'base64': |
|
return base64ToBytes(string).length |
|
default: |
|
if (loweredCase) return utf8ToBytes(string).length // assume utf8 |
|
encoding = ('' + encoding).toLowerCase() |
|
loweredCase = true |
|
} |
|
} |
|
} |
|
Buffer.byteLength = byteLength |
|
|
|
function slowToString (encoding, start, end) { |
|
var loweredCase = false |
|
|
|
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only |
|
// property of a typed array. |
|
|
|
// This behaves neither like String nor Uint8Array in that we set start/end |
|
// to their upper/lower bounds if the value passed is out of range. |
|
// undefined is handled specially as per ECMA-262 6th Edition, |
|
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. |
|
if (start === undefined || start < 0) { |
|
start = 0 |
|
} |
|
// Return early if start > this.length. Done here to prevent potential uint32 |
|
// coercion fail below. |
|
if (start > this.length) { |
|
return '' |
|
} |
|
|
|
if (end === undefined || end > this.length) { |
|
end = this.length |
|
} |
|
|
|
if (end <= 0) { |
|
return '' |
|
} |
|
|
|
// Force coersion to uint32. This will also coerce falsey/NaN values to 0. |
|
end >>>= 0 |
|
start >>>= 0 |
|
|
|
if (end <= start) { |
|
return '' |
|
} |
|
|
|
if (!encoding) encoding = 'utf8' |
|
|
|
while (true) { |
|
switch (encoding) { |
|
case 'hex': |
|
return hexSlice(this, start, end) |
|
|
|
case 'utf8': |
|
case 'utf-8': |
|
return utf8Slice(this, start, end) |
|
|
|
case 'ascii': |
|
return asciiSlice(this, start, end) |
|
|
|
case 'latin1': |
|
case 'binary': |
|
return latin1Slice(this, start, end) |
|
|
|
case 'base64': |
|
return base64Slice(this, start, end) |
|
|
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return utf16leSlice(this, start, end) |
|
|
|
default: |
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) |
|
encoding = (encoding + '').toLowerCase() |
|
loweredCase = true |
|
} |
|
} |
|
} |
|
|
|
// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect |
|
// Buffer instances. |
|
Buffer.prototype._isBuffer = true |
|
|
|
function swap (b, n, m) { |
|
var i = b[n] |
|
b[n] = b[m] |
|
b[m] = i |
|
} |
|
|
|
Buffer.prototype.swap16 = function swap16 () { |
|
var len = this.length |
|
if (len % 2 !== 0) { |
|
throw new RangeError('Buffer size must be a multiple of 16-bits') |
|
} |
|
for (var i = 0; i < len; i += 2) { |
|
swap(this, i, i + 1) |
|
} |
|
return this |
|
} |
|
|
|
Buffer.prototype.swap32 = function swap32 () { |
|
var len = this.length |
|
if (len % 4 !== 0) { |
|
throw new RangeError('Buffer size must be a multiple of 32-bits') |
|
} |
|
for (var i = 0; i < len; i += 4) { |
|
swap(this, i, i + 3) |
|
swap(this, i + 1, i + 2) |
|
} |
|
return this |
|
} |
|
|
|
Buffer.prototype.swap64 = function swap64 () { |
|
var len = this.length |
|
if (len % 8 !== 0) { |
|
throw new RangeError('Buffer size must be a multiple of 64-bits') |
|
} |
|
for (var i = 0; i < len; i += 8) { |
|
swap(this, i, i + 7) |
|
swap(this, i + 1, i + 6) |
|
swap(this, i + 2, i + 5) |
|
swap(this, i + 3, i + 4) |
|
} |
|
return this |
|
} |
|
|
|
Buffer.prototype.toString = function toString () { |
|
var length = this.length | 0 |
|
if (length === 0) return '' |
|
if (arguments.length === 0) return utf8Slice(this, 0, length) |
|
return slowToString.apply(this, arguments) |
|
} |
|
|
|
Buffer.prototype.equals = function equals (b) { |
|
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') |
|
if (this === b) return true |
|
return Buffer.compare(this, b) === 0 |
|
} |
|
|
|
Buffer.prototype.inspect = function inspect () { |
|
var str = '' |
|
var max = exports.INSPECT_MAX_BYTES |
|
if (this.length > 0) { |
|
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') |
|
if (this.length > max) str += ' ... ' |
|
} |
|
return '<Buffer ' + str + '>' |
|
} |
|
|
|
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { |
|
if (!Buffer.isBuffer(target)) { |
|
throw new TypeError('Argument must be a Buffer') |
|
} |
|
|
|
if (start === undefined) { |
|
start = 0 |
|
} |
|
if (end === undefined) { |
|
end = target ? target.length : 0 |
|
} |
|
if (thisStart === undefined) { |
|
thisStart = 0 |
|
} |
|
if (thisEnd === undefined) { |
|
thisEnd = this.length |
|
} |
|
|
|
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { |
|
throw new RangeError('out of range index') |
|
} |
|
|
|
if (thisStart >= thisEnd && start >= end) { |
|
return 0 |
|
} |
|
if (thisStart >= thisEnd) { |
|
return -1 |
|
} |
|
if (start >= end) { |
|
return 1 |
|
} |
|
|
|
start >>>= 0 |
|
end >>>= 0 |
|
thisStart >>>= 0 |
|
thisEnd >>>= 0 |
|
|
|
if (this === target) return 0 |
|
|
|
var x = thisEnd - thisStart |
|
var y = end - start |
|
var len = Math.min(x, y) |
|
|
|
var thisCopy = this.slice(thisStart, thisEnd) |
|
var targetCopy = target.slice(start, end) |
|
|
|
for (var i = 0; i < len; ++i) { |
|
if (thisCopy[i] !== targetCopy[i]) { |
|
x = thisCopy[i] |
|
y = targetCopy[i] |
|
break |
|
} |
|
} |
|
|
|
if (x < y) return -1 |
|
if (y < x) return 1 |
|
return 0 |
|
} |
|
|
|
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, |
|
// OR the last index of `val` in `buffer` at offset <= `byteOffset`. |
|
// |
|
// Arguments: |
|
// - buffer - a Buffer to search |
|
// - val - a string, Buffer, or number |
|
// - byteOffset - an index into `buffer`; will be clamped to an int32 |
|
// - encoding - an optional encoding, relevant is val is a string |
|
// - dir - true for indexOf, false for lastIndexOf |
|
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { |
|
// Empty buffer means no match |
|
if (buffer.length === 0) return -1 |
|
|
|
// Normalize byteOffset |
|
if (typeof byteOffset === 'string') { |
|
encoding = byteOffset |
|
byteOffset = 0 |
|
} else if (byteOffset > 0x7fffffff) { |
|
byteOffset = 0x7fffffff |
|
} else if (byteOffset < -0x80000000) { |
|
byteOffset = -0x80000000 |
|
} |
|
byteOffset = +byteOffset // Coerce to Number. |
|
if (isNaN(byteOffset)) { |
|
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer |
|
byteOffset = dir ? 0 : (buffer.length - 1) |
|
} |
|
|
|
// Normalize byteOffset: negative offsets start from the end of the buffer |
|
if (byteOffset < 0) byteOffset = buffer.length + byteOffset |
|
if (byteOffset >= buffer.length) { |
|
if (dir) return -1 |
|
else byteOffset = buffer.length - 1 |
|
} else if (byteOffset < 0) { |
|
if (dir) byteOffset = 0 |
|
else return -1 |
|
} |
|
|
|
// Normalize val |
|
if (typeof val === 'string') { |
|
val = Buffer.from(val, encoding) |
|
} |
|
|
|
// Finally, search either indexOf (if dir is true) or lastIndexOf |
|
if (Buffer.isBuffer(val)) { |
|
// Special case: looking for empty string/buffer always fails |
|
if (val.length === 0) { |
|
return -1 |
|
} |
|
return arrayIndexOf(buffer, val, byteOffset, encoding, dir) |
|
} else if (typeof val === 'number') { |
|
val = val & 0xFF // Search for a byte value [0-255] |
|
if (Buffer.TYPED_ARRAY_SUPPORT && |
|
typeof Uint8Array.prototype.indexOf === 'function') { |
|
if (dir) { |
|
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) |
|
} else { |
|
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) |
|
} |
|
} |
|
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) |
|
} |
|
|
|
throw new TypeError('val must be string, number or Buffer') |
|
} |
|
|
|
function arrayIndexOf (arr, val, byteOffset, encoding, dir) { |
|
var indexSize = 1 |
|
var arrLength = arr.length |
|
var valLength = val.length |
|
|
|
if (encoding !== undefined) { |
|
encoding = String(encoding).toLowerCase() |
|
if (encoding === 'ucs2' || encoding === 'ucs-2' || |
|
encoding === 'utf16le' || encoding === 'utf-16le') { |
|
if (arr.length < 2 || val.length < 2) { |
|
return -1 |
|
} |
|
indexSize = 2 |
|
arrLength /= 2 |
|
valLength /= 2 |
|
byteOffset /= 2 |
|
} |
|
} |
|
|
|
function read (buf, i) { |
|
if (indexSize === 1) { |
|
return buf[i] |
|
} else { |
|
return buf.readUInt16BE(i * indexSize) |
|
} |
|
} |
|
|
|
var i |
|
if (dir) { |
|
var foundIndex = -1 |
|
for (i = byteOffset; i < arrLength; i++) { |
|
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { |
|
if (foundIndex === -1) foundIndex = i |
|
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize |
|
} else { |
|
if (foundIndex !== -1) i -= i - foundIndex |
|
foundIndex = -1 |
|
} |
|
} |
|
} else { |
|
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength |
|
for (i = byteOffset; i >= 0; i--) { |
|
var found = true |
|
for (var j = 0; j < valLength; j++) { |
|
if (read(arr, i + j) !== read(val, j)) { |
|
found = false |
|
break |
|
} |
|
} |
|
if (found) return i |
|
} |
|
} |
|
|
|
return -1 |
|
} |
|
|
|
Buffer.prototype.includes = function includes (val, byteOffset, encoding) { |
|
return this.indexOf(val, byteOffset, encoding) !== -1 |
|
} |
|
|
|
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { |
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, true) |
|
} |
|
|
|
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { |
|
return bidirectionalIndexOf(this, val, byteOffset, encoding, false) |
|
} |
|
|
|
function hexWrite (buf, string, offset, length) { |
|
offset = Number(offset) || 0 |
|
var remaining = buf.length - offset |
|
if (!length) { |
|
length = remaining |
|
} else { |
|
length = Number(length) |
|
if (length > remaining) { |
|
length = remaining |
|
} |
|
} |
|
|
|
// must be an even number of digits |
|
var strLen = string.length |
|
if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') |
|
|
|
if (length > strLen / 2) { |
|
length = strLen / 2 |
|
} |
|
for (var i = 0; i < length; ++i) { |
|
var parsed = parseInt(string.substr(i * 2, 2), 16) |
|
if (isNaN(parsed)) return i |
|
buf[offset + i] = parsed |
|
} |
|
return i |
|
} |
|
|
|
function utf8Write (buf, string, offset, length) { |
|
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) |
|
} |
|
|
|
function asciiWrite (buf, string, offset, length) { |
|
return blitBuffer(asciiToBytes(string), buf, offset, length) |
|
} |
|
|
|
function latin1Write (buf, string, offset, length) { |
|
return asciiWrite(buf, string, offset, length) |
|
} |
|
|
|
function base64Write (buf, string, offset, length) { |
|
return blitBuffer(base64ToBytes(string), buf, offset, length) |
|
} |
|
|
|
function ucs2Write (buf, string, offset, length) { |
|
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) |
|
} |
|
|
|
Buffer.prototype.write = function write (string, offset, length, encoding) { |
|
// Buffer#write(string) |
|
if (offset === undefined) { |
|
encoding = 'utf8' |
|
length = this.length |
|
offset = 0 |
|
// Buffer#write(string, encoding) |
|
} else if (length === undefined && typeof offset === 'string') { |
|
encoding = offset |
|
length = this.length |
|
offset = 0 |
|
// Buffer#write(string, offset[, length][, encoding]) |
|
} else if (isFinite(offset)) { |
|
offset = offset | 0 |
|
if (isFinite(length)) { |
|
length = length | 0 |
|
if (encoding === undefined) encoding = 'utf8' |
|
} else { |
|
encoding = length |
|
length = undefined |
|
} |
|
// legacy write(string, encoding, offset, length) - remove in v0.13 |
|
} else { |
|
throw new Error( |
|
'Buffer.write(string, encoding, offset[, length]) is no longer supported' |
|
) |
|
} |
|
|
|
var remaining = this.length - offset |
|
if (length === undefined || length > remaining) length = remaining |
|
|
|
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { |
|
throw new RangeError('Attempt to write outside buffer bounds') |
|
} |
|
|
|
if (!encoding) encoding = 'utf8' |
|
|
|
var loweredCase = false |
|
for (;;) { |
|
switch (encoding) { |
|
case 'hex': |
|
return hexWrite(this, string, offset, length) |
|
|
|
case 'utf8': |
|
case 'utf-8': |
|
return utf8Write(this, string, offset, length) |
|
|
|
case 'ascii': |
|
return asciiWrite(this, string, offset, length) |
|
|
|
case 'latin1': |
|
case 'binary': |
|
return latin1Write(this, string, offset, length) |
|
|
|
case 'base64': |
|
// Warning: maxLength not taken into account in base64Write |
|
return base64Write(this, string, offset, length) |
|
|
|
case 'ucs2': |
|
case 'ucs-2': |
|
case 'utf16le': |
|
case 'utf-16le': |
|
return ucs2Write(this, string, offset, length) |
|
|
|
default: |
|
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) |
|
encoding = ('' + encoding).toLowerCase() |
|
loweredCase = true |
|
} |
|
} |
|
} |
|
|
|
Buffer.prototype.toJSON = function toJSON () { |
|
return { |
|
type: 'Buffer', |
|
data: Array.prototype.slice.call(this._arr || this, 0) |
|
} |
|
} |
|
|
|
function base64Slice (buf, start, end) { |
|
if (start === 0 && end === buf.length) { |
|
return base64.fromByteArray(buf) |
|
} else { |
|
return base64.fromByteArray(buf.slice(start, end)) |
|
} |
|
} |
|
|
|
function utf8Slice (buf, start, end) { |
|
end = Math.min(buf.length, end) |
|
var res = [] |
|
|
|
var i = start |
|
while (i < end) { |
|
var firstByte = buf[i] |
|
var codePoint = null |
|
var bytesPerSequence = (firstByte > 0xEF) ? 4 |
|
: (firstByte > 0xDF) ? 3 |
|
: (firstByte > 0xBF) ? 2 |
|
: 1 |
|
|
|
if (i + bytesPerSequence <= end) { |
|
var secondByte, thirdByte, fourthByte, tempCodePoint |
|
|
|
switch (bytesPerSequence) { |
|
case 1: |
|
if (firstByte < 0x80) { |
|
codePoint = firstByte |
|
} |
|
break |
|
case 2: |
|
secondByte = buf[i + 1] |
|
if ((secondByte & 0xC0) === 0x80) { |
|
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) |
|
if (tempCodePoint > 0x7F) { |
|
codePoint = tempCodePoint |
|
} |
|
} |
|
break |
|
case 3: |
|
secondByte = buf[i + 1] |
|
thirdByte = buf[i + 2] |
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { |
|
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) |
|
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { |
|
codePoint = tempCodePoint |
|
} |
|
} |
|
break |
|
case 4: |
|
secondByte = buf[i + 1] |
|
thirdByte = buf[i + 2] |
|
fourthByte = buf[i + 3] |
|
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { |
|
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) |
|
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { |
|
codePoint = tempCodePoint |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (codePoint === null) { |
|
// we did not generate a valid codePoint so insert a |
|
// replacement char (U+FFFD) and advance only 1 byte |
|
codePoint = 0xFFFD |
|
bytesPerSequence = 1 |
|
} else if (codePoint > 0xFFFF) { |
|
// encode to utf16 (surrogate pair dance) |
|
codePoint -= 0x10000 |
|
res.push(codePoint >>> 10 & 0x3FF | 0xD800) |
|
codePoint = 0xDC00 | codePoint & 0x3FF |
|
} |
|
|
|
res.push(codePoint) |
|
i += bytesPerSequence |
|
} |
|
|
|
return decodeCodePointsArray(res) |
|
} |
|
|
|
// Based on http://stackoverflow.com/a/22747272/680742, the browser with |
|
// the lowest limit is Chrome, with 0x10000 args. |
|
// We go 1 magnitude less, for safety |
|
var MAX_ARGUMENTS_LENGTH = 0x1000 |
|
|
|
function decodeCodePointsArray (codePoints) { |
|
var len = codePoints.length |
|
if (len <= MAX_ARGUMENTS_LENGTH) { |
|
return String.fromCharCode.apply(String, codePoints) // avoid extra slice() |
|
} |
|
|
|
// Decode in chunks to avoid "call stack size exceeded". |
|
var res = '' |
|
var i = 0 |
|
while (i < len) { |
|
res += String.fromCharCode.apply( |
|
String, |
|
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) |
|
) |
|
} |
|
return res |
|
} |
|
|
|
function asciiSlice (buf, start, end) { |
|
var ret = '' |
|
end = Math.min(buf.length, end) |
|
|
|
for (var i = start; i < end; ++i) { |
|
ret += String.fromCharCode(buf[i] & 0x7F) |
|
} |
|
return ret |
|
} |
|
|
|
function latin1Slice (buf, start, end) { |
|
var ret = '' |
|
end = Math.min(buf.length, end) |
|
|
|
for (var i = start; i < end; ++i) { |
|
ret += String.fromCharCode(buf[i]) |
|
} |
|
return ret |
|
} |
|
|
|
function hexSlice (buf, start, end) { |
|
var len = buf.length |
|
|
|
if (!start || start < 0) start = 0 |
|
if (!end || end < 0 || end > len) end = len |
|
|
|
var out = '' |
|
for (var i = start; i < end; ++i) { |
|
out += toHex(buf[i]) |
|
} |
|
return out |
|
} |
|
|
|
function utf16leSlice (buf, start, end) { |
|
var bytes = buf.slice(start, end) |
|
var res = '' |
|
for (var i = 0; i < bytes.length; i += 2) { |
|
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) |
|
} |
|
return res |
|
} |
|
|
|
Buffer.prototype.slice = function slice (start, end) { |
|
var len = this.length |
|
start = ~~start |
|
end = end === undefined ? len : ~~end |
|
|
|
if (start < 0) { |
|
start += len |
|
if (start < 0) start = 0 |
|
} else if (start > len) { |
|
start = len |
|
} |
|
|
|
if (end < 0) { |
|
end += len |
|
if (end < 0) end = 0 |
|
} else if (end > len) { |
|
end = len |
|
} |
|
|
|
if (end < start) end = start |
|
|
|
var newBuf |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
newBuf = this.subarray(start, end) |
|
newBuf.__proto__ = Buffer.prototype |
|
} else { |
|
var sliceLen = end - start |
|
newBuf = new Buffer(sliceLen, undefined) |
|
for (var i = 0; i < sliceLen; ++i) { |
|
newBuf[i] = this[i + start] |
|
} |
|
} |
|
|
|
return newBuf |
|
} |
|
|
|
/* |
|
* Need to make sure that buffer isn't trying to write out of bounds. |
|
*/ |
|
function checkOffset (offset, ext, length) { |
|
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') |
|
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') |
|
} |
|
|
|
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { |
|
offset = offset | 0 |
|
byteLength = byteLength | 0 |
|
if (!noAssert) checkOffset(offset, byteLength, this.length) |
|
|
|
var val = this[offset] |
|
var mul = 1 |
|
var i = 0 |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
val += this[offset + i] * mul |
|
} |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { |
|
offset = offset | 0 |
|
byteLength = byteLength | 0 |
|
if (!noAssert) { |
|
checkOffset(offset, byteLength, this.length) |
|
} |
|
|
|
var val = this[offset + --byteLength] |
|
var mul = 1 |
|
while (byteLength > 0 && (mul *= 0x100)) { |
|
val += this[offset + --byteLength] * mul |
|
} |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 1, this.length) |
|
return this[offset] |
|
} |
|
|
|
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
return this[offset] | (this[offset + 1] << 8) |
|
} |
|
|
|
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
return (this[offset] << 8) | this[offset + 1] |
|
} |
|
|
|
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return ((this[offset]) | |
|
(this[offset + 1] << 8) | |
|
(this[offset + 2] << 16)) + |
|
(this[offset + 3] * 0x1000000) |
|
} |
|
|
|
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return (this[offset] * 0x1000000) + |
|
((this[offset + 1] << 16) | |
|
(this[offset + 2] << 8) | |
|
this[offset + 3]) |
|
} |
|
|
|
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { |
|
offset = offset | 0 |
|
byteLength = byteLength | 0 |
|
if (!noAssert) checkOffset(offset, byteLength, this.length) |
|
|
|
var val = this[offset] |
|
var mul = 1 |
|
var i = 0 |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
val += this[offset + i] * mul |
|
} |
|
mul *= 0x80 |
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength) |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { |
|
offset = offset | 0 |
|
byteLength = byteLength | 0 |
|
if (!noAssert) checkOffset(offset, byteLength, this.length) |
|
|
|
var i = byteLength |
|
var mul = 1 |
|
var val = this[offset + --i] |
|
while (i > 0 && (mul *= 0x100)) { |
|
val += this[offset + --i] * mul |
|
} |
|
mul *= 0x80 |
|
|
|
if (val >= mul) val -= Math.pow(2, 8 * byteLength) |
|
|
|
return val |
|
} |
|
|
|
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 1, this.length) |
|
if (!(this[offset] & 0x80)) return (this[offset]) |
|
return ((0xff - this[offset] + 1) * -1) |
|
} |
|
|
|
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
var val = this[offset] | (this[offset + 1] << 8) |
|
return (val & 0x8000) ? val | 0xFFFF0000 : val |
|
} |
|
|
|
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 2, this.length) |
|
var val = this[offset + 1] | (this[offset] << 8) |
|
return (val & 0x8000) ? val | 0xFFFF0000 : val |
|
} |
|
|
|
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return (this[offset]) | |
|
(this[offset + 1] << 8) | |
|
(this[offset + 2] << 16) | |
|
(this[offset + 3] << 24) |
|
} |
|
|
|
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
|
|
return (this[offset] << 24) | |
|
(this[offset + 1] << 16) | |
|
(this[offset + 2] << 8) | |
|
(this[offset + 3]) |
|
} |
|
|
|
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
return ieee754.read(this, offset, true, 23, 4) |
|
} |
|
|
|
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 4, this.length) |
|
return ieee754.read(this, offset, false, 23, 4) |
|
} |
|
|
|
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 8, this.length) |
|
return ieee754.read(this, offset, true, 52, 8) |
|
} |
|
|
|
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { |
|
if (!noAssert) checkOffset(offset, 8, this.length) |
|
return ieee754.read(this, offset, false, 52, 8) |
|
} |
|
|
|
function checkInt (buf, value, offset, ext, max, min) { |
|
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') |
|
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') |
|
if (offset + ext > buf.length) throw new RangeError('Index out of range') |
|
} |
|
|
|
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
byteLength = byteLength | 0 |
|
if (!noAssert) { |
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1 |
|
checkInt(this, value, offset, byteLength, maxBytes, 0) |
|
} |
|
|
|
var mul = 1 |
|
var i = 0 |
|
this[offset] = value & 0xFF |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
this[offset + i] = (value / mul) & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
byteLength = byteLength | 0 |
|
if (!noAssert) { |
|
var maxBytes = Math.pow(2, 8 * byteLength) - 1 |
|
checkInt(this, value, offset, byteLength, maxBytes, 0) |
|
} |
|
|
|
var i = byteLength - 1 |
|
var mul = 1 |
|
this[offset + i] = value & 0xFF |
|
while (--i >= 0 && (mul *= 0x100)) { |
|
this[offset + i] = (value / mul) & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) |
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) |
|
this[offset] = (value & 0xff) |
|
return offset + 1 |
|
} |
|
|
|
function objectWriteUInt16 (buf, value, offset, littleEndian) { |
|
if (value < 0) value = 0xffff + value + 1 |
|
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { |
|
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> |
|
(littleEndian ? i : 1 - i) * 8 |
|
} |
|
} |
|
|
|
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
} else { |
|
objectWriteUInt16(this, value, offset, true) |
|
} |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 8) |
|
this[offset + 1] = (value & 0xff) |
|
} else { |
|
objectWriteUInt16(this, value, offset, false) |
|
} |
|
return offset + 2 |
|
} |
|
|
|
function objectWriteUInt32 (buf, value, offset, littleEndian) { |
|
if (value < 0) value = 0xffffffff + value + 1 |
|
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { |
|
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff |
|
} |
|
} |
|
|
|
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset + 3] = (value >>> 24) |
|
this[offset + 2] = (value >>> 16) |
|
this[offset + 1] = (value >>> 8) |
|
this[offset] = (value & 0xff) |
|
} else { |
|
objectWriteUInt32(this, value, offset, true) |
|
} |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 24) |
|
this[offset + 1] = (value >>> 16) |
|
this[offset + 2] = (value >>> 8) |
|
this[offset + 3] = (value & 0xff) |
|
} else { |
|
objectWriteUInt32(this, value, offset, false) |
|
} |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) { |
|
var limit = Math.pow(2, 8 * byteLength - 1) |
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit) |
|
} |
|
|
|
var i = 0 |
|
var mul = 1 |
|
var sub = 0 |
|
this[offset] = value & 0xFF |
|
while (++i < byteLength && (mul *= 0x100)) { |
|
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { |
|
sub = 1 |
|
} |
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) { |
|
var limit = Math.pow(2, 8 * byteLength - 1) |
|
|
|
checkInt(this, value, offset, byteLength, limit - 1, -limit) |
|
} |
|
|
|
var i = byteLength - 1 |
|
var mul = 1 |
|
var sub = 0 |
|
this[offset + i] = value & 0xFF |
|
while (--i >= 0 && (mul *= 0x100)) { |
|
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { |
|
sub = 1 |
|
} |
|
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF |
|
} |
|
|
|
return offset + byteLength |
|
} |
|
|
|
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) |
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) |
|
if (value < 0) value = 0xff + value + 1 |
|
this[offset] = (value & 0xff) |
|
return offset + 1 |
|
} |
|
|
|
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
} else { |
|
objectWriteUInt16(this, value, offset, true) |
|
} |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 8) |
|
this[offset + 1] = (value & 0xff) |
|
} else { |
|
objectWriteUInt16(this, value, offset, false) |
|
} |
|
return offset + 2 |
|
} |
|
|
|
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value & 0xff) |
|
this[offset + 1] = (value >>> 8) |
|
this[offset + 2] = (value >>> 16) |
|
this[offset + 3] = (value >>> 24) |
|
} else { |
|
objectWriteUInt32(this, value, offset, true) |
|
} |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { |
|
value = +value |
|
offset = offset | 0 |
|
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) |
|
if (value < 0) value = 0xffffffff + value + 1 |
|
if (Buffer.TYPED_ARRAY_SUPPORT) { |
|
this[offset] = (value >>> 24) |
|
this[offset + 1] = (value >>> 16) |
|
this[offset + 2] = (value >>> 8) |
|
this[offset + 3] = (value & 0xff) |
|
} else { |
|
objectWriteUInt32(this, value, offset, false) |
|
} |
|
return offset + 4 |
|
} |
|
|
|
function checkIEEE754 (buf, value, offset, ext, max, min) { |
|
if (offset + ext > buf.length) throw new RangeError('Index out of range') |
|
if (offset < 0) throw new RangeError('Index out of range') |
|
} |
|
|
|
function writeFloat (buf, value, offset, littleEndian, noAssert) { |
|
if (!noAssert) { |
|
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) |
|
} |
|
ieee754.write(buf, value, offset, littleEndian, 23, 4) |
|
return offset + 4 |
|
} |
|
|
|
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { |
|
return writeFloat(this, value, offset, true, noAssert) |
|
} |
|
|
|
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { |
|
return writeFloat(this, value, offset, false, noAssert) |
|
} |
|
|
|
function writeDouble (buf, value, offset, littleEndian, noAssert) { |
|
if (!noAssert) { |
|
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) |
|
} |
|
ieee754.write(buf, value, offset, littleEndian, 52, 8) |
|
return offset + 8 |
|
} |
|
|
|
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { |
|
return writeDouble(this, value, offset, true, noAssert) |
|
} |
|
|
|
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { |
|
return writeDouble(this, value, offset, false, noAssert) |
|
} |
|
|
|
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) |
|
Buffer.prototype.copy = function copy (target, targetStart, start, end) { |
|
if (!start) start = 0 |
|
if (!end && end !== 0) end = this.length |
|
if (targetStart >= target.length) targetStart = target.length |
|
if (!targetStart) targetStart = 0 |
|
if (end > 0 && end < start) end = start |
|
|
|
// Copy 0 bytes; we're done |
|
if (end === start) return 0 |
|
if (target.length === 0 || this.length === 0) return 0 |
|
|
|
// Fatal error conditions |
|
if (targetStart < 0) { |
|
throw new RangeError('targetStart out of bounds') |
|
} |
|
if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') |
|
if (end < 0) throw new RangeError('sourceEnd out of bounds') |
|
|
|
// Are we oob? |
|
if (end > this.length) end = this.length |
|
if (target.length - targetStart < end - start) { |
|
end = target.length - targetStart + start |
|
} |
|
|
|
var len = end - start |
|
var i |
|
|
|
if (this === target && start < targetStart && targetStart < end) { |
|
// descending copy from end |
|
for (i = len - 1; i >= 0; --i) { |
|
target[i + targetStart] = this[i + start] |
|
} |
|
} else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { |
|
// ascending copy from start |
|
for (i = 0; i < len; ++i) { |
|
target[i + targetStart] = this[i + start] |
|
} |
|
} else { |
|
Uint8Array.prototype.set.call( |
|
target, |
|
this.subarray(start, start + len), |
|
targetStart |
|
) |
|
} |
|
|
|
return len |
|
} |
|
|
|
// Usage: |
|
// buffer.fill(number[, offset[, end]]) |
|
// buffer.fill(buffer[, offset[, end]]) |
|
// buffer.fill(string[, offset[, end]][, encoding]) |
|
Buffer.prototype.fill = function fill (val, start, end, encoding) { |
|
// Handle string cases: |
|
if (typeof val === 'string') { |
|
if (typeof start === 'string') { |
|
encoding = start |
|
start = 0 |
|
end = this.length |
|
} else if (typeof end === 'string') { |
|
encoding = end |
|
end = this.length |
|
} |
|
if (val.length === 1) { |
|
var code = val.charCodeAt(0) |
|
if (code < 256) { |
|
val = code |
|
} |
|
} |
|
if (encoding !== undefined && typeof encoding !== 'string') { |
|
throw new TypeError('encoding must be a string') |
|
} |
|
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { |
|
throw new TypeError('Unknown encoding: ' + encoding) |
|
} |
|
} else if (typeof val === 'number') { |
|
val = val & 255 |
|
} |
|
|
|
// Invalid ranges are not set to a default, so can range check early. |
|
if (start < 0 || this.length < start || this.length < end) { |
|
throw new RangeError('Out of range index') |
|
} |
|
|
|
if (end <= start) { |
|
return this |
|
} |
|
|
|
start = start >>> 0 |
|
end = end === undefined ? this.length : end >>> 0 |
|
|
|
if (!val) val = 0 |
|
|
|
var i |
|
if (typeof val === 'number') { |
|
for (i = start; i < end; ++i) { |
|
this[i] = val |
|
} |
|
} else { |
|
var bytes = Buffer.isBuffer(val) |
|
? val |
|
: utf8ToBytes(new Buffer(val, encoding).toString()) |
|
var len = bytes.length |
|
for (i = 0; i < end - start; ++i) { |
|
this[i + start] = bytes[i % len] |
|
} |
|
} |
|
|
|
return this |
|
} |
|
|
|
// HELPER FUNCTIONS |
|
// ================ |
|
|
|
var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g |
|
|
|
function base64clean (str) { |
|
// Node strips out invalid characters like \n and \t from the string, base64-js does not |
|
str = stringtrim(str).replace(INVALID_BASE64_RE, '') |
|
// Node converts strings with length < 2 to '' |
|
if (str.length < 2) return '' |
|
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not |
|
while (str.length % 4 !== 0) { |
|
str = str + '=' |
|
} |
|
return str |
|
} |
|
|
|
function stringtrim (str) { |
|
if (str.trim) return str.trim() |
|
return str.replace(/^\s+|\s+$/g, '') |
|
} |
|
|
|
function toHex (n) { |
|
if (n < 16) return '0' + n.toString(16) |
|
return n.toString(16) |
|
} |
|
|
|
function utf8ToBytes (string, units) { |
|
units = units || Infinity |
|
var codePoint |
|
var length = string.length |
|
var leadSurrogate = null |
|
var bytes = [] |
|
|
|
for (var i = 0; i < length; ++i) { |
|
codePoint = string.charCodeAt(i) |
|
|
|
// is surrogate component |
|
if (codePoint > 0xD7FF && codePoint < 0xE000) { |
|
// last char was a lead |
|
if (!leadSurrogate) { |
|
// no lead yet |
|
if (codePoint > 0xDBFF) { |
|
// unexpected trail |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
continue |
|
} else if (i + 1 === length) { |
|
// unpaired lead |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
continue |
|
} |
|
|
|
// valid lead |
|
leadSurrogate = codePoint |
|
|
|
continue |
|
} |
|
|
|
// 2 leads in a row |
|
if (codePoint < 0xDC00) { |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
leadSurrogate = codePoint |
|
continue |
|
} |
|
|
|
// valid surrogate pair |
|
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 |
|
} else if (leadSurrogate) { |
|
// valid bmp char, but last char was a lead |
|
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) |
|
} |
|
|
|
leadSurrogate = null |
|
|
|
// encode utf8 |
|
if (codePoint < 0x80) { |
|
if ((units -= 1) < 0) break |
|
bytes.push(codePoint) |
|
} else if (codePoint < 0x800) { |
|
if ((units -= 2) < 0) break |
|
bytes.push( |
|
codePoint >> 0x6 | 0xC0, |
|
codePoint & 0x3F | 0x80 |
|
) |
|
} else if (codePoint < 0x10000) { |
|
if ((units -= 3) < 0) break |
|
bytes.push( |
|
codePoint >> 0xC | 0xE0, |
|
codePoint >> 0x6 & 0x3F | 0x80, |
|
codePoint & 0x3F | 0x80 |
|
) |
|
} else if (codePoint < 0x110000) { |
|
if ((units -= 4) < 0) break |
|
bytes.push( |
|
codePoint >> 0x12 | 0xF0, |
|
codePoint >> 0xC & 0x3F | 0x80, |
|
codePoint >> 0x6 & 0x3F | 0x80, |
|
codePoint & 0x3F | 0x80 |
|
) |
|
} else { |
|
throw new Error('Invalid code point') |
|
} |
|
} |
|
|
|
return bytes |
|
} |
|
|
|
function asciiToBytes (str) { |
|
var byteArray = [] |
|
for (var i = 0; i < str.length; ++i) { |
|
// Node's code seems to be doing this and not & 0x7F.. |
|
byteArray.push(str.charCodeAt(i) & 0xFF) |
|
} |
|
return byteArray |
|
} |
|
|
|
function utf16leToBytes (str, units) { |
|
var c, hi, lo |
|
var byteArray = [] |
|
for (var i = 0; i < str.length; ++i) { |
|
if ((units -= 2) < 0) break |
|
|
|
c = str.charCodeAt(i) |
|
hi = c >> 8 |
|
lo = c % 256 |
|
byteArray.push(lo) |
|
byteArray.push(hi) |
|
} |
|
|
|
return byteArray |
|
} |
|
|
|
function base64ToBytes (str) { |
|
return base64.toByteArray(base64clean(str)) |
|
} |
|
|
|
function blitBuffer (src, dst, offset, length) { |
|
for (var i = 0; i < length; ++i) { |
|
if ((i + offset >= dst.length) || (i >= src.length)) break |
|
dst[i + offset] = src[i] |
|
} |
|
return i |
|
} |
|
|
|
function isnan (val) { |
|
return val !== val // eslint-disable-line no-self-compare |
|
} |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"base64-js":65,"ieee754":73,"isarray":74}],67:[function(require,module,exports){ |
|
var Buffer = require('buffer').Buffer; |
|
var intSize = 4; |
|
var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0); |
|
var chrsz = 8; |
|
|
|
function toArray(buf, bigEndian) { |
|
if ((buf.length % intSize) !== 0) { |
|
var len = buf.length + (intSize - (buf.length % intSize)); |
|
buf = Buffer.concat([buf, zeroBuffer], len); |
|
} |
|
|
|
var arr = []; |
|
var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE; |
|
for (var i = 0; i < buf.length; i += intSize) { |
|
arr.push(fn.call(buf, i)); |
|
} |
|
return arr; |
|
} |
|
|
|
function toBuffer(arr, size, bigEndian) { |
|
var buf = new Buffer(size); |
|
var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE; |
|
for (var i = 0; i < arr.length; i++) { |
|
fn.call(buf, arr[i], i * 4, true); |
|
} |
|
return buf; |
|
} |
|
|
|
function hash(buf, fn, hashSize, bigEndian) { |
|
if (!Buffer.isBuffer(buf)) buf = new Buffer(buf); |
|
var arr = fn(toArray(buf, bigEndian), buf.length * chrsz); |
|
return toBuffer(arr, hashSize, bigEndian); |
|
} |
|
|
|
module.exports = { hash: hash }; |
|
|
|
},{"buffer":147}],68:[function(require,module,exports){ |
|
var Buffer = require('buffer').Buffer |
|
var sha = require('./sha') |
|
var sha256 = require('./sha256') |
|
var rng = require('./rng') |
|
var md5 = require('./md5') |
|
|
|
var algorithms = { |
|
sha1: sha, |
|
sha256: sha256, |
|
md5: md5 |
|
} |
|
|
|
var blocksize = 64 |
|
var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(0) |
|
function hmac(fn, key, data) { |
|
if(!Buffer.isBuffer(key)) key = new Buffer(key) |
|
if(!Buffer.isBuffer(data)) data = new Buffer(data) |
|
|
|
if(key.length > blocksize) { |
|
key = fn(key) |
|
} else if(key.length < blocksize) { |
|
key = Buffer.concat([key, zeroBuffer], blocksize) |
|
} |
|
|
|
var ipad = new Buffer(blocksize), opad = new Buffer(blocksize) |
|
for(var i = 0; i < blocksize; i++) { |
|
ipad[i] = key[i] ^ 0x36 |
|
opad[i] = key[i] ^ 0x5C |
|
} |
|
|
|
var hash = fn(Buffer.concat([ipad, data])) |
|
return fn(Buffer.concat([opad, hash])) |
|
} |
|
|
|
function hash(alg, key) { |
|
alg = alg || 'sha1' |
|
var fn = algorithms[alg] |
|
var bufs = [] |
|
var length = 0 |
|
if(!fn) error('algorithm:', alg, 'is not yet supported') |
|
return { |
|
update: function (data) { |
|
if(!Buffer.isBuffer(data)) data = new Buffer(data) |
|
|
|
bufs.push(data) |
|
length += data.length |
|
return this |
|
}, |
|
digest: function (enc) { |
|
var buf = Buffer.concat(bufs) |
|
var r = key ? hmac(fn, key, buf) : fn(buf) |
|
bufs = null |
|
return enc ? r.toString(enc) : r |
|
} |
|
} |
|
} |
|
|
|
function error () { |
|
var m = [].slice.call(arguments).join(' ') |
|
throw new Error([ |
|
m, |
|
'we accept pull requests', |
|
'http://github.com/dominictarr/crypto-browserify' |
|
].join('\n')) |
|
} |
|
|
|
exports.createHash = function (alg) { return hash(alg) } |
|
exports.createHmac = function (alg, key) { return hash(alg, key) } |
|
exports.randomBytes = function(size, callback) { |
|
if (callback && callback.call) { |
|
try { |
|
callback.call(this, undefined, new Buffer(rng(size))) |
|
} catch (err) { callback(err) } |
|
} else { |
|
return new Buffer(rng(size)) |
|
} |
|
} |
|
|
|
function each(a, f) { |
|
for(var i in a) |
|
f(a[i], i) |
|
} |
|
|
|
// the least I can do is make error messages for the rest of the node.js/crypto api. |
|
each(['createCredentials' |
|
, 'createCipher' |
|
, 'createCipheriv' |
|
, 'createDecipher' |
|
, 'createDecipheriv' |
|
, 'createSign' |
|
, 'createVerify' |
|
, 'createDiffieHellman' |
|
, 'pbkdf2'], function (name) { |
|
exports[name] = function () { |
|
error('sorry,', name, 'is not implemented yet') |
|
} |
|
}) |
|
|
|
},{"./md5":69,"./rng":70,"./sha":71,"./sha256":72,"buffer":147}],69:[function(require,module,exports){ |
|
/* |
|
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message |
|
* Digest Algorithm, as defined in RFC 1321. |
|
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. |
|
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet |
|
* Distributed under the BSD License |
|
* See http://pajhome.org.uk/crypt/md5 for more info. |
|
*/ |
|
|
|
var helpers = require('./helpers'); |
|
|
|
/* |
|
* Perform a simple self-test to see if the VM is working |
|
*/ |
|
function md5_vm_test() |
|
{ |
|
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; |
|
} |
|
|
|
/* |
|
* Calculate the MD5 of an array of little-endian words, and a bit length |
|
*/ |
|
function core_md5(x, len) |
|
{ |
|
/* append padding */ |
|
x[len >> 5] |= 0x80 << ((len) % 32); |
|
x[(((len + 64) >>> 9) << 4) + 14] = len; |
|
|
|
var a = 1732584193; |
|
var b = -271733879; |
|
var c = -1732584194; |
|
var d = 271733878; |
|
|
|
for(var i = 0; i < x.length; i += 16) |
|
{ |
|
var olda = a; |
|
var oldb = b; |
|
var oldc = c; |
|
var oldd = d; |
|
|
|
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); |
|
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); |
|
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); |
|
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); |
|
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); |
|
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); |
|
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); |
|
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); |
|
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); |
|
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); |
|
c = md5_ff(c, d, a, b, x[i+10], 17, -42063); |
|
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); |
|
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); |
|
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); |
|
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); |
|
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); |
|
|
|
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); |
|
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); |
|
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); |
|
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); |
|
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); |
|
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); |
|
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); |
|
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); |
|
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); |
|
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); |
|
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); |
|
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); |
|
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); |
|
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); |
|
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); |
|
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); |
|
|
|
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); |
|
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); |
|
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); |
|
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); |
|
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); |
|
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); |
|
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); |
|
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); |
|
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); |
|
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); |
|
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); |
|
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); |
|
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); |
|
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); |
|
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); |
|
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); |
|
|
|
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); |
|
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); |
|
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); |
|
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); |
|
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); |
|
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); |
|
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); |
|
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); |
|
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); |
|
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); |
|
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); |
|
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); |
|
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); |
|
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); |
|
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); |
|
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); |
|
|
|
a = safe_add(a, olda); |
|
b = safe_add(b, oldb); |
|
c = safe_add(c, oldc); |
|
d = safe_add(d, oldd); |
|
} |
|
return Array(a, b, c, d); |
|
|
|
} |
|
|
|
/* |
|
* These functions implement the four basic operations the algorithm uses. |
|
*/ |
|
function md5_cmn(q, a, b, x, s, t) |
|
{ |
|
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); |
|
} |
|
function md5_ff(a, b, c, d, x, s, t) |
|
{ |
|
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); |
|
} |
|
function md5_gg(a, b, c, d, x, s, t) |
|
{ |
|
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); |
|
} |
|
function md5_hh(a, b, c, d, x, s, t) |
|
{ |
|
return md5_cmn(b ^ c ^ d, a, b, x, s, t); |
|
} |
|
function md5_ii(a, b, c, d, x, s, t) |
|
{ |
|
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); |
|
} |
|
|
|
/* |
|
* Add integers, wrapping at 2^32. This uses 16-bit operations internally |
|
* to work around bugs in some JS interpreters. |
|
*/ |
|
function safe_add(x, y) |
|
{ |
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF); |
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16); |
|
return (msw << 16) | (lsw & 0xFFFF); |
|
} |
|
|
|
/* |
|
* Bitwise rotate a 32-bit number to the left. |
|
*/ |
|
function bit_rol(num, cnt) |
|
{ |
|
return (num << cnt) | (num >>> (32 - cnt)); |
|
} |
|
|
|
module.exports = function md5(buf) { |
|
return helpers.hash(buf, core_md5, 16); |
|
}; |
|
|
|
},{"./helpers":67}],70:[function(require,module,exports){ |
|
// Original code adapted from Robert Kieffer. |
|
// details at https://github.com/broofa/node-uuid |
|
(function() { |
|
var _global = this; |
|
|
|
var mathRNG, whatwgRNG; |
|
|
|
// NOTE: Math.random() does not guarantee "cryptographic quality" |
|
mathRNG = function(size) { |
|
var bytes = new Array(size); |
|
var r; |
|
|
|
for (var i = 0, r; i < size; i++) { |
|
if ((i & 0x03) == 0) r = Math.random() * 0x100000000; |
|
bytes[i] = r >>> ((i & 0x03) << 3) & 0xff; |
|
} |
|
|
|
return bytes; |
|
} |
|
|
|
if (_global.crypto && crypto.getRandomValues) { |
|
whatwgRNG = function(size) { |
|
var bytes = new Uint8Array(size); |
|
crypto.getRandomValues(bytes); |
|
return bytes; |
|
} |
|
} |
|
|
|
module.exports = whatwgRNG || mathRNG; |
|
|
|
}()) |
|
|
|
},{}],71:[function(require,module,exports){ |
|
/* |
|
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined |
|
* in FIPS PUB 180-1 |
|
* Version 2.1a Copyright Paul Johnston 2000 - 2002. |
|
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet |
|
* Distributed under the BSD License |
|
* See http://pajhome.org.uk/crypt/md5 for details. |
|
*/ |
|
|
|
var helpers = require('./helpers'); |
|
|
|
/* |
|
* Calculate the SHA-1 of an array of big-endian words, and a bit length |
|
*/ |
|
function core_sha1(x, len) |
|
{ |
|
/* append padding */ |
|
x[len >> 5] |= 0x80 << (24 - len % 32); |
|
x[((len + 64 >> 9) << 4) + 15] = len; |
|
|
|
var w = Array(80); |
|
var a = 1732584193; |
|
var b = -271733879; |
|
var c = -1732584194; |
|
var d = 271733878; |
|
var e = -1009589776; |
|
|
|
for(var i = 0; i < x.length; i += 16) |
|
{ |
|
var olda = a; |
|
var oldb = b; |
|
var oldc = c; |
|
var oldd = d; |
|
var olde = e; |
|
|
|
for(var j = 0; j < 80; j++) |
|
{ |
|
if(j < 16) w[j] = x[i + j]; |
|
else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); |
|
var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), |
|
safe_add(safe_add(e, w[j]), sha1_kt(j))); |
|
e = d; |
|
d = c; |
|
c = rol(b, 30); |
|
b = a; |
|
a = t; |
|
} |
|
|
|
a = safe_add(a, olda); |
|
b = safe_add(b, oldb); |
|
c = safe_add(c, oldc); |
|
d = safe_add(d, oldd); |
|
e = safe_add(e, olde); |
|
} |
|
return Array(a, b, c, d, e); |
|
|
|
} |
|
|
|
/* |
|
* Perform the appropriate triplet combination function for the current |
|
* iteration |
|
*/ |
|
function sha1_ft(t, b, c, d) |
|
{ |
|
if(t < 20) return (b & c) | ((~b) & d); |
|
if(t < 40) return b ^ c ^ d; |
|
if(t < 60) return (b & c) | (b & d) | (c & d); |
|
return b ^ c ^ d; |
|
} |
|
|
|
/* |
|
* Determine the appropriate additive constant for the current iteration |
|
*/ |
|
function sha1_kt(t) |
|
{ |
|
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : |
|
(t < 60) ? -1894007588 : -899497514; |
|
} |
|
|
|
/* |
|
* Add integers, wrapping at 2^32. This uses 16-bit operations internally |
|
* to work around bugs in some JS interpreters. |
|
*/ |
|
function safe_add(x, y) |
|
{ |
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF); |
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16); |
|
return (msw << 16) | (lsw & 0xFFFF); |
|
} |
|
|
|
/* |
|
* Bitwise rotate a 32-bit number to the left. |
|
*/ |
|
function rol(num, cnt) |
|
{ |
|
return (num << cnt) | (num >>> (32 - cnt)); |
|
} |
|
|
|
module.exports = function sha1(buf) { |
|
return helpers.hash(buf, core_sha1, 20, true); |
|
}; |
|
|
|
},{"./helpers":67}],72:[function(require,module,exports){ |
|
|
|
/** |
|
* A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined |
|
* in FIPS 180-2 |
|
* Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. |
|
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet |
|
* |
|
*/ |
|
|
|
var helpers = require('./helpers'); |
|
|
|
var safe_add = function(x, y) { |
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF); |
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16); |
|
return (msw << 16) | (lsw & 0xFFFF); |
|
}; |
|
|
|
var S = function(X, n) { |
|
return (X >>> n) | (X << (32 - n)); |
|
}; |
|
|
|
var R = function(X, n) { |
|
return (X >>> n); |
|
}; |
|
|
|
var Ch = function(x, y, z) { |
|
return ((x & y) ^ ((~x) & z)); |
|
}; |
|
|
|
var Maj = function(x, y, z) { |
|
return ((x & y) ^ (x & z) ^ (y & z)); |
|
}; |
|
|
|
var Sigma0256 = function(x) { |
|
return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); |
|
}; |
|
|
|
var Sigma1256 = function(x) { |
|
return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); |
|
}; |
|
|
|
var Gamma0256 = function(x) { |
|
return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); |
|
}; |
|
|
|
var Gamma1256 = function(x) { |
|
return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); |
|
}; |
|
|
|
var core_sha256 = function(m, l) { |
|
var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2); |
|
var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19); |
|
var W = new Array(64); |
|
var a, b, c, d, e, f, g, h, i, j; |
|
var T1, T2; |
|
/* append padding */ |
|
m[l >> 5] |= 0x80 << (24 - l % 32); |
|
m[((l + 64 >> 9) << 4) + 15] = l; |
|
for (var i = 0; i < m.length; i += 16) { |
|
a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7]; |
|
for (var j = 0; j < 64; j++) { |
|
if (j < 16) { |
|
W[j] = m[j + i]; |
|
} else { |
|
W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]); |
|
} |
|
T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]); |
|
T2 = safe_add(Sigma0256(a), Maj(a, b, c)); |
|
h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2); |
|
} |
|
HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); |
|
HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]); |
|
} |
|
return HASH; |
|
}; |
|
|
|
module.exports = function sha256(buf) { |
|
return helpers.hash(buf, core_sha256, 32, true); |
|
}; |
|
|
|
},{"./helpers":67}],73:[function(require,module,exports){ |
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) { |
|
var e, m |
|
var eLen = nBytes * 8 - mLen - 1 |
|
var eMax = (1 << eLen) - 1 |
|
var eBias = eMax >> 1 |
|
var nBits = -7 |
|
var i = isLE ? (nBytes - 1) : 0 |
|
var d = isLE ? -1 : 1 |
|
var s = buffer[offset + i] |
|
|
|
i += d |
|
|
|
e = s & ((1 << (-nBits)) - 1) |
|
s >>= (-nBits) |
|
nBits += eLen |
|
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} |
|
|
|
m = e & ((1 << (-nBits)) - 1) |
|
e >>= (-nBits) |
|
nBits += mLen |
|
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} |
|
|
|
if (e === 0) { |
|
e = 1 - eBias |
|
} else if (e === eMax) { |
|
return m ? NaN : ((s ? -1 : 1) * Infinity) |
|
} else { |
|
m = m + Math.pow(2, mLen) |
|
e = e - eBias |
|
} |
|
return (s ? -1 : 1) * m * Math.pow(2, e - mLen) |
|
} |
|
|
|
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { |
|
var e, m, c |
|
var eLen = nBytes * 8 - mLen - 1 |
|
var eMax = (1 << eLen) - 1 |
|
var eBias = eMax >> 1 |
|
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) |
|
var i = isLE ? 0 : (nBytes - 1) |
|
var d = isLE ? 1 : -1 |
|
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 |
|
|
|
value = Math.abs(value) |
|
|
|
if (isNaN(value) || value === Infinity) { |
|
m = isNaN(value) ? 1 : 0 |
|
e = eMax |
|
} else { |
|
e = Math.floor(Math.log(value) / Math.LN2) |
|
if (value * (c = Math.pow(2, -e)) < 1) { |
|
e-- |
|
c *= 2 |
|
} |
|
if (e + eBias >= 1) { |
|
value += rt / c |
|
} else { |
|
value += rt * Math.pow(2, 1 - eBias) |
|
} |
|
if (value * c >= 2) { |
|
e++ |
|
c /= 2 |
|
} |
|
|
|
if (e + eBias >= eMax) { |
|
m = 0 |
|
e = eMax |
|
} else if (e + eBias >= 1) { |
|
m = (value * c - 1) * Math.pow(2, mLen) |
|
e = e + eBias |
|
} else { |
|
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) |
|
e = 0 |
|
} |
|
} |
|
|
|
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} |
|
|
|
e = (e << mLen) | m |
|
eLen += mLen |
|
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} |
|
|
|
buffer[offset + i - d] |= s * 128 |
|
} |
|
|
|
},{}],74:[function(require,module,exports){ |
|
var toString = {}.toString; |
|
|
|
module.exports = Array.isArray || function (arr) { |
|
return toString.call(arr) == '[object Array]'; |
|
}; |
|
|
|
},{}],75:[function(require,module,exports){ |
|
(function(exports) { |
|
"use strict"; |
|
|
|
function isArray(obj) { |
|
if (obj !== null) { |
|
return Object.prototype.toString.call(obj) === "[object Array]"; |
|
} else { |
|
return false; |
|
} |
|
} |
|
|
|
function isObject(obj) { |
|
if (obj !== null) { |
|
return Object.prototype.toString.call(obj) === "[object Object]"; |
|
} else { |
|
return false; |
|
} |
|
} |
|
|
|
function strictDeepEqual(first, second) { |
|
// Check the scalar case first. |
|
if (first === second) { |
|
return true; |
|
} |
|
|
|
// Check if they are the same type. |
|
var firstType = Object.prototype.toString.call(first); |
|
if (firstType !== Object.prototype.toString.call(second)) { |
|
return false; |
|
} |
|
// We know that first and second have the same type so we can just check the |
|
// first type from now on. |
|
if (isArray(first) === true) { |
|
// Short circuit if they're not the same length; |
|
if (first.length !== second.length) { |
|
return false; |
|
} |
|
for (var i = 0; i < first.length; i++) { |
|
if (strictDeepEqual(first[i], second[i]) === false) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
if (isObject(first) === true) { |
|
// An object is equal if it has the same key/value pairs. |
|
var keysSeen = {}; |
|
for (var key in first) { |
|
if (hasOwnProperty.call(first, key)) { |
|
if (strictDeepEqual(first[key], second[key]) === false) { |
|
return false; |
|
} |
|
keysSeen[key] = true; |
|
} |
|
} |
|
// Now check that there aren't any keys in second that weren't |
|
// in first. |
|
for (var key2 in second) { |
|
if (hasOwnProperty.call(second, key2)) { |
|
if (keysSeen[key2] !== true) { |
|
return false; |
|
} |
|
} |
|
} |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
function isFalse(obj) { |
|
// From the spec: |
|
// A false value corresponds to the following values: |
|
// Empty list |
|
// Empty object |
|
// Empty string |
|
// False boolean |
|
// null value |
|
|
|
// First check the scalar values. |
|
if (obj === "" || obj === false || obj === null) { |
|
return true; |
|
} else if (isArray(obj) && obj.length === 0) { |
|
// Check for an empty array. |
|
return true; |
|
} else if (isObject(obj)) { |
|
// Check for an empty object. |
|
for (var key in obj) { |
|
// If there are any keys, then |
|
// the object is not empty so the object |
|
// is not false. |
|
if (obj.hasOwnProperty(key)) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} else { |
|
return false; |
|
} |
|
} |
|
|
|
function objValues(obj) { |
|
var keys = Object.keys(obj); |
|
var values = []; |
|
for (var i = 0; i < keys.length; i++) { |
|
values.push(obj[keys[i]]); |
|
} |
|
return values; |
|
} |
|
|
|
function merge(a, b) { |
|
var merged = {}; |
|
for (var key in a) { |
|
merged[key] = a[key]; |
|
} |
|
for (var key2 in b) { |
|
merged[key2] = b[key2]; |
|
} |
|
return merged; |
|
} |
|
|
|
var trimLeft; |
|
if (typeof String.prototype.trimLeft === "function") { |
|
trimLeft = function(str) { |
|
return str.trimLeft(); |
|
}; |
|
} else { |
|
trimLeft = function(str) { |
|
return str.match(/^\s*(.*)/)[1]; |
|
}; |
|
} |
|
|
|
// Type constants used to define functions. |
|
var TYPE_NUMBER = 0; |
|
var TYPE_ANY = 1; |
|
var TYPE_STRING = 2; |
|
var TYPE_ARRAY = 3; |
|
var TYPE_OBJECT = 4; |
|
var TYPE_BOOLEAN = 5; |
|
var TYPE_EXPREF = 6; |
|
var TYPE_NULL = 7; |
|
var TYPE_ARRAY_NUMBER = 8; |
|
var TYPE_ARRAY_STRING = 9; |
|
|
|
var TOK_EOF = "EOF"; |
|
var TOK_UNQUOTEDIDENTIFIER = "UnquotedIdentifier"; |
|
var TOK_QUOTEDIDENTIFIER = "QuotedIdentifier"; |
|
var TOK_RBRACKET = "Rbracket"; |
|
var TOK_RPAREN = "Rparen"; |
|
var TOK_COMMA = "Comma"; |
|
var TOK_COLON = "Colon"; |
|
var TOK_RBRACE = "Rbrace"; |
|
var TOK_NUMBER = "Number"; |
|
var TOK_CURRENT = "Current"; |
|
var TOK_EXPREF = "Expref"; |
|
var TOK_PIPE = "Pipe"; |
|
var TOK_OR = "Or"; |
|
var TOK_AND = "And"; |
|
var TOK_EQ = "EQ"; |
|
var TOK_GT = "GT"; |
|
var TOK_LT = "LT"; |
|
var TOK_GTE = "GTE"; |
|
var TOK_LTE = "LTE"; |
|
var TOK_NE = "NE"; |
|
var TOK_FLATTEN = "Flatten"; |
|
var TOK_STAR = "Star"; |
|
var TOK_FILTER = "Filter"; |
|
var TOK_DOT = "Dot"; |
|
var TOK_NOT = "Not"; |
|
var TOK_LBRACE = "Lbrace"; |
|
var TOK_LBRACKET = "Lbracket"; |
|
var TOK_LPAREN= "Lparen"; |
|
var TOK_LITERAL= "Literal"; |
|
|
|
// The "&", "[", "<", ">" tokens |
|
// are not in basicToken because |
|
// there are two token variants |
|
// ("&&", "[?", "<=", ">="). This is specially handled |
|
// below. |
|
|
|
var basicTokens = { |
|
".": TOK_DOT, |
|
"*": TOK_STAR, |
|
",": TOK_COMMA, |
|
":": TOK_COLON, |
|
"{": TOK_LBRACE, |
|
"}": TOK_RBRACE, |
|
"]": TOK_RBRACKET, |
|
"(": TOK_LPAREN, |
|
")": TOK_RPAREN, |
|
"@": TOK_CURRENT |
|
}; |
|
|
|
var operatorStartToken = { |
|
"<": true, |
|
">": true, |
|
"=": true, |
|
"!": true |
|
}; |
|
|
|
var skipChars = { |
|
" ": true, |
|
"\t": true, |
|
"\n": true |
|
}; |
|
|
|
|
|
function isAlpha(ch) { |
|
return (ch >= "a" && ch <= "z") || |
|
(ch >= "A" && ch <= "Z") || |
|
ch === "_"; |
|
} |
|
|
|
function isNum(ch) { |
|
return (ch >= "0" && ch <= "9") || |
|
ch === "-"; |
|
} |
|
function isAlphaNum(ch) { |
|
return (ch >= "a" && ch <= "z") || |
|
(ch >= "A" && ch <= "Z") || |
|
(ch >= "0" && ch <= "9") || |
|
ch === "_"; |
|
} |
|
|
|
function Lexer() { |
|
} |
|
Lexer.prototype = { |
|
tokenize: function(stream) { |
|
var tokens = []; |
|
this._current = 0; |
|
var start; |
|
var identifier; |
|
var token; |
|
while (this._current < stream.length) { |
|
if (isAlpha(stream[this._current])) { |
|
start = this._current; |
|
identifier = this._consumeUnquotedIdentifier(stream); |
|
tokens.push({type: TOK_UNQUOTEDIDENTIFIER, |
|
value: identifier, |
|
start: start}); |
|
} else if (basicTokens[stream[this._current]] !== undefined) { |
|
tokens.push({type: basicTokens[stream[this._current]], |
|
value: stream[this._current], |
|
start: this._current}); |
|
this._current++; |
|
} else if (isNum(stream[this._current])) { |
|
token = this._consumeNumber(stream); |
|
tokens.push(token); |
|
} else if (stream[this._current] === "[") { |
|
// No need to increment this._current. This happens |
|
// in _consumeLBracket |
|
token = this._consumeLBracket(stream); |
|
tokens.push(token); |
|
} else if (stream[this._current] === "\"") { |
|
start = this._current; |
|
identifier = this._consumeQuotedIdentifier(stream); |
|
tokens.push({type: TOK_QUOTEDIDENTIFIER, |
|
value: identifier, |
|
start: start}); |
|
} else if (stream[this._current] === "'") { |
|
start = this._current; |
|
identifier = this._consumeRawStringLiteral(stream); |
|
tokens.push({type: TOK_LITERAL, |
|
value: identifier, |
|
start: start}); |
|
} else if (stream[this._current] === "`") { |
|
start = this._current; |
|
var literal = this._consumeLiteral(stream); |
|
tokens.push({type: TOK_LITERAL, |
|
value: literal, |
|
start: start}); |
|
} else if (operatorStartToken[stream[this._current]] !== undefined) { |
|
tokens.push(this._consumeOperator(stream)); |
|
} else if (skipChars[stream[this._current]] !== undefined) { |
|
// Ignore whitespace. |
|
this._current++; |
|
} else if (stream[this._current] === "&") { |
|
start = this._current; |
|
this._current++; |
|
if (stream[this._current] === "&") { |
|
this._current++; |
|
tokens.push({type: TOK_AND, value: "&&", start: start}); |
|
} else { |
|
tokens.push({type: TOK_EXPREF, value: "&", start: start}); |
|
} |
|
} else if (stream[this._current] === "|") { |
|
start = this._current; |
|
this._current++; |
|
if (stream[this._current] === "|") { |
|
this._current++; |
|
tokens.push({type: TOK_OR, value: "||", start: start}); |
|
} else { |
|
tokens.push({type: TOK_PIPE, value: "|", start: start}); |
|
} |
|
} else { |
|
var error = new Error("Unknown character:" + stream[this._current]); |
|
error.name = "LexerError"; |
|
throw error; |
|
} |
|
} |
|
return tokens; |
|
}, |
|
|
|
_consumeUnquotedIdentifier: function(stream) { |
|
var start = this._current; |
|
this._current++; |
|
while (this._current < stream.length && isAlphaNum(stream[this._current])) { |
|
this._current++; |
|
} |
|
return stream.slice(start, this._current); |
|
}, |
|
|
|
_consumeQuotedIdentifier: function(stream) { |
|
var start = this._current; |
|
this._current++; |
|
var maxLength = stream.length; |
|
while (stream[this._current] !== "\"" && this._current < maxLength) { |
|
// You can escape a double quote and you can escape an escape. |
|
var current = this._current; |
|
if (stream[current] === "\\" && (stream[current + 1] === "\\" || |
|
stream[current + 1] === "\"")) { |
|
current += 2; |
|
} else { |
|
current++; |
|
} |
|
this._current = current; |
|
} |
|
this._current++; |
|
return JSON.parse(stream.slice(start, this._current)); |
|
}, |
|
|
|
_consumeRawStringLiteral: function(stream) { |
|
var start = this._current; |
|
this._current++; |
|
var maxLength = stream.length; |
|
while (stream[this._current] !== "'" && this._current < maxLength) { |
|
// You can escape a single quote and you can escape an escape. |
|
var current = this._current; |
|
if (stream[current] === "\\" && (stream[current + 1] === "\\" || |
|
stream[current + 1] === "'")) { |
|
current += 2; |
|
} else { |
|
current++; |
|
} |
|
this._current = current; |
|
} |
|
this._current++; |
|
var literal = stream.slice(start + 1, this._current - 1); |
|
return literal.replace("\\'", "'"); |
|
}, |
|
|
|
_consumeNumber: function(stream) { |
|
var start = this._current; |
|
this._current++; |
|
var maxLength = stream.length; |
|
while (isNum(stream[this._current]) && this._current < maxLength) { |
|
this._current++; |
|
} |
|
var value = parseInt(stream.slice(start, this._current)); |
|
return {type: TOK_NUMBER, value: value, start: start}; |
|
}, |
|
|
|
_consumeLBracket: function(stream) { |
|
var start = this._current; |
|
this._current++; |
|
if (stream[this._current] === "?") { |
|
this._current++; |
|
return {type: TOK_FILTER, value: "[?", start: start}; |
|
} else if (stream[this._current] === "]") { |
|
this._current++; |
|
return {type: TOK_FLATTEN, value: "[]", start: start}; |
|
} else { |
|
return {type: TOK_LBRACKET, value: "[", start: start}; |
|
} |
|
}, |
|
|
|
_consumeOperator: function(stream) { |
|
var start = this._current; |
|
var startingChar = stream[start]; |
|
this._current++; |
|
if (startingChar === "!") { |
|
if (stream[this._current] === "=") { |
|
this._current++; |
|
return {type: TOK_NE, value: "!=", start: start}; |
|
} else { |
|
return {type: TOK_NOT, value: "!", start: start}; |
|
} |
|
} else if (startingChar === "<") { |
|
if (stream[this._current] === "=") { |
|
this._current++; |
|
return {type: TOK_LTE, value: "<=", start: start}; |
|
} else { |
|
return {type: TOK_LT, value: "<", start: start}; |
|
} |
|
} else if (startingChar === ">") { |
|
if (stream[this._current] === "=") { |
|
this._current++; |
|
return {type: TOK_GTE, value: ">=", start: start}; |
|
} else { |
|
return {type: TOK_GT, value: ">", start: start}; |
|
} |
|
} else if (startingChar === "=") { |
|
if (stream[this._current] === "=") { |
|
this._current++; |
|
return {type: TOK_EQ, value: "==", start: start}; |
|
} |
|
} |
|
}, |
|
|
|
_consumeLiteral: function(stream) { |
|
this._current++; |
|
var start = this._current; |
|
var maxLength = stream.length; |
|
var literal; |
|
while(stream[this._current] !== "`" && this._current < maxLength) { |
|
// You can escape a literal char or you can escape the escape. |
|
var current = this._current; |
|
if (stream[current] === "\\" && (stream[current + 1] === "\\" || |
|
stream[current + 1] === "`")) { |
|
current += 2; |
|
} else { |
|
current++; |
|
} |
|
this._current = current; |
|
} |
|
var literalString = trimLeft(stream.slice(start, this._current)); |
|
literalString = literalString.replace("\\`", "`"); |
|
if (this._looksLikeJSON(literalString)) { |
|
literal = JSON.parse(literalString); |
|
} else { |
|
// Try to JSON parse it as "<literal>" |
|
literal = JSON.parse("\"" + literalString + "\""); |
|
} |
|
// +1 gets us to the ending "`", +1 to move on to the next char. |
|
this._current++; |
|
return literal; |
|
}, |
|
|
|
_looksLikeJSON: function(literalString) { |
|
var startingChars = "[{\""; |
|
var jsonLiterals = ["true", "false", "null"]; |
|
var numberLooking = "-0123456789"; |
|
|
|
if (literalString === "") { |
|
return false; |
|
} else if (startingChars.indexOf(literalString[0]) >= 0) { |
|
return true; |
|
} else if (jsonLiterals.indexOf(literalString) >= 0) { |
|
return true; |
|
} else if (numberLooking.indexOf(literalString[0]) >= 0) { |
|
try { |
|
JSON.parse(literalString); |
|
return true; |
|
} catch (ex) { |
|
return false; |
|
} |
|
} else { |
|
return false; |
|
} |
|
} |
|
}; |
|
|
|
var bindingPower = {}; |
|
bindingPower[TOK_EOF] = 0; |
|
bindingPower[TOK_UNQUOTEDIDENTIFIER] = 0; |
|
bindingPower[TOK_QUOTEDIDENTIFIER] = 0; |
|
bindingPower[TOK_RBRACKET] = 0; |
|
bindingPower[TOK_RPAREN] = 0; |
|
bindingPower[TOK_COMMA] = 0; |
|
bindingPower[TOK_RBRACE] = 0; |
|
bindingPower[TOK_NUMBER] = 0; |
|
bindingPower[TOK_CURRENT] = 0; |
|
bindingPower[TOK_EXPREF] = 0; |
|
bindingPower[TOK_PIPE] = 1; |
|
bindingPower[TOK_OR] = 2; |
|
bindingPower[TOK_AND] = 3; |
|
bindingPower[TOK_EQ] = 5; |
|
bindingPower[TOK_GT] = 5; |
|
bindingPower[TOK_LT] = 5; |
|
bindingPower[TOK_GTE] = 5; |
|
bindingPower[TOK_LTE] = 5; |
|
bindingPower[TOK_NE] = 5; |
|
bindingPower[TOK_FLATTEN] = 9; |
|
bindingPower[TOK_STAR] = 20; |
|
bindingPower[TOK_FILTER] = 21; |
|
bindingPower[TOK_DOT] = 40; |
|
bindingPower[TOK_NOT] = 45; |
|
bindingPower[TOK_LBRACE] = 50; |
|
bindingPower[TOK_LBRACKET] = 55; |
|
bindingPower[TOK_LPAREN] = 60; |
|
|
|
function Parser() { |
|
} |
|
|
|
Parser.prototype = { |
|
parse: function(expression) { |
|
this._loadTokens(expression); |
|
this.index = 0; |
|
var ast = this.expression(0); |
|
if (this._lookahead(0) !== TOK_EOF) { |
|
var t = this._lookaheadToken(0); |
|
var error = new Error( |
|
"Unexpected token type: " + t.type + ", value: " + t.value); |
|
error.name = "ParserError"; |
|
throw error; |
|
} |
|
return ast; |
|
}, |
|
|
|
_loadTokens: function(expression) { |
|
var lexer = new Lexer(); |
|
var tokens = lexer.tokenize(expression); |
|
tokens.push({type: TOK_EOF, value: "", start: expression.length}); |
|
this.tokens = tokens; |
|
}, |
|
|
|
expression: function(rbp) { |
|
var leftToken = this._lookaheadToken(0); |
|
this._advance(); |
|
var left = this.nud(leftToken); |
|
var currentToken = this._lookahead(0); |
|
while (rbp < bindingPower[currentToken]) { |
|
this._advance(); |
|
left = this.led(currentToken, left); |
|
currentToken = this._lookahead(0); |
|
} |
|
return left; |
|
}, |
|
|
|
_lookahead: function(number) { |
|
return this.tokens[this.index + number].type; |
|
}, |
|
|
|
_lookaheadToken: function(number) { |
|
return this.tokens[this.index + number]; |
|
}, |
|
|
|
_advance: function() { |
|
this.index++; |
|
}, |
|
|
|
nud: function(token) { |
|
var left; |
|
var right; |
|
var expression; |
|
switch (token.type) { |
|
case TOK_LITERAL: |
|
return {type: "Literal", value: token.value}; |
|
case TOK_UNQUOTEDIDENTIFIER: |
|
return {type: "Field", name: token.value}; |
|
case TOK_QUOTEDIDENTIFIER: |
|
var node = {type: "Field", name: token.value}; |
|
if (this._lookahead(0) === TOK_LPAREN) { |
|
throw new Error("Quoted identifier not allowed for function names."); |
|
} else { |
|
return node; |
|
} |
|
break; |
|
case TOK_NOT: |
|
right = this.expression(bindingPower.Not); |
|
return {type: "NotExpression", children: [right]}; |
|
case TOK_STAR: |
|
left = {type: "Identity"}; |
|
right = null; |
|
if (this._lookahead(0) === TOK_RBRACKET) { |
|
// This can happen in a multiselect, |
|
// [a, b, *] |
|
right = {type: "Identity"}; |
|
} else { |
|
right = this._parseProjectionRHS(bindingPower.Star); |
|
} |
|
return {type: "ValueProjection", children: [left, right]}; |
|
case TOK_FILTER: |
|
return this.led(token.type, {type: "Identity"}); |
|
case TOK_LBRACE: |
|
return this._parseMultiselectHash(); |
|
case TOK_FLATTEN: |
|
left = {type: TOK_FLATTEN, children: [{type: "Identity"}]}; |
|
right = this._parseProjectionRHS(bindingPower.Flatten); |
|
return {type: "Projection", children: [left, right]}; |
|
case TOK_LBRACKET: |
|
if (this._lookahead(0) === TOK_NUMBER || this._lookahead(0) === TOK_COLON) { |
|
right = this._parseIndexExpression(); |
|
return this._projectIfSlice({type: "Identity"}, right); |
|
} else if (this._lookahead(0) === TOK_STAR && |
|
this._lookahead(1) === TOK_RBRACKET) { |
|
this._advance(); |
|
this._advance(); |
|
right = this._parseProjectionRHS(bindingPower.Star); |
|
return {type: "Projection", |
|
children: [{type: "Identity"}, right]}; |
|
} else { |
|
return this._parseMultiselectList(); |
|
} |
|
break; |
|
case TOK_CURRENT: |
|
return {type: TOK_CURRENT}; |
|
case TOK_EXPREF: |
|
expression = this.expression(bindingPower.Expref); |
|
return {type: "ExpressionReference", children: [expression]}; |
|
case TOK_LPAREN: |
|
var args = []; |
|
while (this._lookahead(0) !== TOK_RPAREN) { |
|
if (this._lookahead(0) === TOK_CURRENT) { |
|
expression = {type: TOK_CURRENT}; |
|
this._advance(); |
|
} else { |
|
expression = this.expression(0); |
|
} |
|
args.push(expression); |
|
} |
|
this._match(TOK_RPAREN); |
|
return args[0]; |
|
default: |
|
this._errorToken(token); |
|
} |
|
}, |
|
|
|
led: function(tokenName, left) { |
|
var right; |
|
switch(tokenName) { |
|
case TOK_DOT: |
|
var rbp = bindingPower.Dot; |
|
if (this._lookahead(0) !== TOK_STAR) { |
|
right = this._parseDotRHS(rbp); |
|
return {type: "Subexpression", children: [left, right]}; |
|
} else { |
|
// Creating a projection. |
|
this._advance(); |
|
right = this._parseProjectionRHS(rbp); |
|
return {type: "ValueProjection", children: [left, right]}; |
|
} |
|
break; |
|
case TOK_PIPE: |
|
right = this.expression(bindingPower.Pipe); |
|
return {type: TOK_PIPE, children: [left, right]}; |
|
case TOK_OR: |
|
right = this.expression(bindingPower.Or); |
|
return {type: "OrExpression", children: [left, right]}; |
|
case TOK_AND: |
|
right = this.expression(bindingPower.And); |
|
return {type: "AndExpression", children: [left, right]}; |
|
case TOK_LPAREN: |
|
var name = left.name; |
|
var args = []; |
|
var expression, node; |
|
while (this._lookahead(0) !== TOK_RPAREN) { |
|
if (this._lookahead(0) === TOK_CURRENT) { |
|
expression = {type: TOK_CURRENT}; |
|
this._advance(); |
|
} else { |
|
expression = this.expression(0); |
|
} |
|
if (this._lookahead(0) === TOK_COMMA) { |
|
this._match(TOK_COMMA); |
|
} |
|
args.push(expression); |
|
} |
|
this._match(TOK_RPAREN); |
|
node = {type: "Function", name: name, children: args}; |
|
return node; |
|
case TOK_FILTER: |
|
var condition = this.expression(0); |
|
this._match(TOK_RBRACKET); |
|
if (this._lookahead(0) === TOK_FLATTEN) { |
|
right = {type: "Identity"}; |
|
} else { |
|
right = this._parseProjectionRHS(bindingPower.Filter); |
|
} |
|
return {type: "FilterProjection", children: [left, right, condition]}; |
|
case TOK_FLATTEN: |
|
var leftNode = {type: TOK_FLATTEN, children: [left]}; |
|
var rightNode = this._parseProjectionRHS(bindingPower.Flatten); |
|
return {type: "Projection", children: [leftNode, rightNode]}; |
|
case TOK_EQ: |
|
case TOK_NE: |
|
case TOK_GT: |
|
case TOK_GTE: |
|
case TOK_LT: |
|
case TOK_LTE: |
|
return this._parseComparator(left, tokenName); |
|
case TOK_LBRACKET: |
|
var token = this._lookaheadToken(0); |
|
if (token.type === TOK_NUMBER || token.type === TOK_COLON) { |
|
right = this._parseIndexExpression(); |
|
return this._projectIfSlice(left, right); |
|
} else { |
|
this._match(TOK_STAR); |
|
this._match(TOK_RBRACKET); |
|
right = this._parseProjectionRHS(bindingPower.Star); |
|
return {type: "Projection", children: [left, right]}; |
|
} |
|
break; |
|
default: |
|
this._errorToken(this._lookaheadToken(0)); |
|
} |
|
}, |
|
|
|
_match: function(tokenType) { |
|
if (this._lookahead(0) === tokenType) { |
|
this._advance(); |
|
} else { |
|
var t = this._lookaheadToken(0); |
|
var error = new Error("Expected " + tokenType + ", got: " + t.type); |
|
error.name = "ParserError"; |
|
throw error; |
|
} |
|
}, |
|
|
|
_errorToken: function(token) { |
|
var error = new Error("Invalid token (" + |
|
token.type + "): \"" + |
|
token.value + "\""); |
|
error.name = "ParserError"; |
|
throw error; |
|
}, |
|
|
|
|
|
_parseIndexExpression: function() { |
|
if (this._lookahead(0) === TOK_COLON || this._lookahead(1) === TOK_COLON) { |
|
return this._parseSliceExpression(); |
|
} else { |
|
var node = { |
|
type: "Index", |
|
value: this._lookaheadToken(0).value}; |
|
this._advance(); |
|
this._match(TOK_RBRACKET); |
|
return node; |
|
} |
|
}, |
|
|
|
_projectIfSlice: function(left, right) { |
|
var indexExpr = {type: "IndexExpression", children: [left, right]}; |
|
if (right.type === "Slice") { |
|
return { |
|
type: "Projection", |
|
children: [indexExpr, this._parseProjectionRHS(bindingPower.Star)] |
|
}; |
|
} else { |
|
return indexExpr; |
|
} |
|
}, |
|
|
|
_parseSliceExpression: function() { |
|
// [start:end:step] where each part is optional, as well as the last |
|
// colon. |
|
var parts = [null, null, null]; |
|
var index = 0; |
|
var currentToken = this._lookahead(0); |
|
while (currentToken !== TOK_RBRACKET && index < 3) { |
|
if (currentToken === TOK_COLON) { |
|
index++; |
|
this._advance(); |
|
} else if (currentToken === TOK_NUMBER) { |
|
parts[index] = this._lookaheadToken(0).value; |
|
this._advance(); |
|
} else { |
|
var t = this._lookahead(0); |
|
var error = new Error("Syntax error, unexpected token: " + |
|
t.value + "(" + t.type + ")"); |
|
error.name = "Parsererror"; |
|
throw error; |
|
} |
|
currentToken = this._lookahead(0); |
|
} |
|
this._match(TOK_RBRACKET); |
|
return { |
|
type: "Slice", |
|
children: parts |
|
}; |
|
}, |
|
|
|
_parseComparator: function(left, comparator) { |
|
var right = this.expression(bindingPower[comparator]); |
|
return {type: "Comparator", name: comparator, children: [left, right]}; |
|
}, |
|
|
|
_parseDotRHS: function(rbp) { |
|
var lookahead = this._lookahead(0); |
|
var exprTokens = [TOK_UNQUOTEDIDENTIFIER, TOK_QUOTEDIDENTIFIER, TOK_STAR]; |
|
if (exprTokens.indexOf(lookahead) >= 0) { |
|
return this.expression(rbp); |
|
} else if (lookahead === TOK_LBRACKET) { |
|
this._match(TOK_LBRACKET); |
|
return this._parseMultiselectList(); |
|
} else if (lookahead === TOK_LBRACE) { |
|
this._match(TOK_LBRACE); |
|
return this._parseMultiselectHash(); |
|
} |
|
}, |
|
|
|
_parseProjectionRHS: function(rbp) { |
|
var right; |
|
if (bindingPower[this._lookahead(0)] < 10) { |
|
right = {type: "Identity"}; |
|
} else if (this._lookahead(0) === TOK_LBRACKET) { |
|
right = this.expression(rbp); |
|
} else if (this._lookahead(0) === TOK_FILTER) { |
|
right = this.expression(rbp); |
|
} else if (this._lookahead(0) === TOK_DOT) { |
|
this._match(TOK_DOT); |
|
right = this._parseDotRHS(rbp); |
|
} else { |
|
var t = this._lookaheadToken(0); |
|
var error = new Error("Sytanx error, unexpected token: " + |
|
t.value + "(" + t.type + ")"); |
|
error.name = "ParserError"; |
|
throw error; |
|
} |
|
return right; |
|
}, |
|
|
|
_parseMultiselectList: function() { |
|
var expressions = []; |
|
while (this._lookahead(0) !== TOK_RBRACKET) { |
|
var expression = this.expression(0); |
|
expressions.push(expression); |
|
if (this._lookahead(0) === TOK_COMMA) { |
|
this._match(TOK_COMMA); |
|
if (this._lookahead(0) === TOK_RBRACKET) { |
|
throw new Error("Unexpected token Rbracket"); |
|
} |
|
} |
|
} |
|
this._match(TOK_RBRACKET); |
|
return {type: "MultiSelectList", children: expressions}; |
|
}, |
|
|
|
_parseMultiselectHash: function() { |
|
var pairs = []; |
|
var identifierTypes = [TOK_UNQUOTEDIDENTIFIER, TOK_QUOTEDIDENTIFIER]; |
|
var keyToken, keyName, value, node; |
|
for (;;) { |
|
keyToken = this._lookaheadToken(0); |
|
if (identifierTypes.indexOf(keyToken.type) < 0) { |
|
throw new Error("Expecting an identifier token, got: " + |
|
keyToken.type); |
|
} |
|
keyName = keyToken.value; |
|
this._advance(); |
|
this._match(TOK_COLON); |
|
value = this.expression(0); |
|
node = {type: "KeyValuePair", name: keyName, value: value}; |
|
pairs.push(node); |
|
if (this._lookahead(0) === TOK_COMMA) { |
|
this._match(TOK_COMMA); |
|
} else if (this._lookahead(0) === TOK_RBRACE) { |
|
this._match(TOK_RBRACE); |
|
break; |
|
} |
|
} |
|
return {type: "MultiSelectHash", children: pairs}; |
|
} |
|
}; |
|
|
|
|
|
function TreeInterpreter(runtime) { |
|
this.runtime = runtime; |
|
} |
|
|
|
TreeInterpreter.prototype = { |
|
search: function(node, value) { |
|
return this.visit(node, value); |
|
}, |
|
|
|
visit: function(node, value) { |
|
var matched, current, result, first, second, field, left, right, collected, i; |
|
switch (node.type) { |
|
case "Field": |
|
if (value === null ) { |
|
return null; |
|
} else if (isObject(value)) { |
|
field = value[node.name]; |
|
if (field === undefined) { |
|
return null; |
|
} else { |
|
return field; |
|
} |
|
} else { |
|
return null; |
|
} |
|
break; |
|
case "Subexpression": |
|
result = this.visit(node.children[0], value); |
|
for (i = 1; i < node.children.length; i++) { |
|
result = this.visit(node.children[1], result); |
|
if (result === null) { |
|
return null; |
|
} |
|
} |
|
return result; |
|
case "IndexExpression": |
|
left = this.visit(node.children[0], value); |
|
right = this.visit(node.children[1], left); |
|
return right; |
|
case "Index": |
|
if (!isArray(value)) { |
|
return null; |
|
} |
|
var index = node.value; |
|
if (index < 0) { |
|
index = value.length + index; |
|
} |
|
result = value[index]; |
|
if (result === undefined) { |
|
result = null; |
|
} |
|
return result; |
|
case "Slice": |
|
if (!isArray(value)) { |
|
return null; |
|
} |
|
var sliceParams = node.children.slice(0); |
|
var computed = this.computeSliceParams(value.length, sliceParams); |
|
var start = computed[0]; |
|
var stop = computed[1]; |
|
var step = computed[2]; |
|
result = []; |
|
if (step > 0) { |
|
for (i = start; i < stop; i += step) { |
|
result.push(value[i]); |
|
} |
|
} else { |
|
for (i = start; i > stop; i += step) { |
|
result.push(value[i]); |
|
} |
|
} |
|
return result; |
|
case "Projection": |
|
// Evaluate left child. |
|
var base = this.visit(node.children[0], value); |
|
if (!isArray(base)) { |
|
return null; |
|
} |
|
collected = []; |
|
for (i = 0; i < base.length; i++) { |
|
current = this.visit(node.children[1], base[i]); |
|
if (current !== null) { |
|
collected.push(current); |
|
} |
|
} |
|
return collected; |
|
case "ValueProjection": |
|
// Evaluate left child. |
|
base = this.visit(node.children[0], value); |
|
if (!isObject(base)) { |
|
return null; |
|
} |
|
collected = []; |
|
var values = objValues(base); |
|
for (i = 0; i < values.length; i++) { |
|
current = this.visit(node.children[1], values[i]); |
|
if (current !== null) { |
|
collected.push(current); |
|
} |
|
} |
|
return collected; |
|
case "FilterProjection": |
|
base = this.visit(node.children[0], value); |
|
if (!isArray(base)) { |
|
return null; |
|
} |
|
var filtered = []; |
|
var finalResults = []; |
|
for (i = 0; i < base.length; i++) { |
|
matched = this.visit(node.children[2], base[i]); |
|
if (!isFalse(matched)) { |
|
filtered.push(base[i]); |
|
} |
|
} |
|
for (var j = 0; j < filtered.length; j++) { |
|
current = this.visit(node.children[1], filtered[j]); |
|
if (current !== null) { |
|
finalResults.push(current); |
|
} |
|
} |
|
return finalResults; |
|
case "Comparator": |
|
first = this.visit(node.children[0], value); |
|
second = this.visit(node.children[1], value); |
|
switch(node.name) { |
|
case TOK_EQ: |
|
result = strictDeepEqual(first, second); |
|
break; |
|
case TOK_NE: |
|
result = !strictDeepEqual(first, second); |
|
break; |
|
case TOK_GT: |
|
result = first > second; |
|
break; |
|
case TOK_GTE: |
|
result = first >= second; |
|
break; |
|
case TOK_LT: |
|
result = first < second; |
|
break; |
|
case TOK_LTE: |
|
result = first <= second; |
|
break; |
|
default: |
|
throw new Error("Unknown comparator: " + node.name); |
|
} |
|
return result; |
|
case TOK_FLATTEN: |
|
var original = this.visit(node.children[0], value); |
|
if (!isArray(original)) { |
|
return null; |
|
} |
|
var merged = []; |
|
for (i = 0; i < original.length; i++) { |
|
current = original[i]; |
|
if (isArray(current)) { |
|
merged.push.apply(merged, current); |
|
} else { |
|
merged.push(current); |
|
} |
|
} |
|
return merged; |
|
case "Identity": |
|
return value; |
|
case "MultiSelectList": |
|
if (value === null) { |
|
return null; |
|
} |
|
collected = []; |
|
for (i = 0; i < node.children.length; i++) { |
|
collected.push(this.visit(node.children[i], value)); |
|
} |
|
return collected; |
|
case "MultiSelectHash": |
|
if (value === null) { |
|
return null; |
|
} |
|
collected = {}; |
|
var child; |
|
for (i = 0; i < node.children.length; i++) { |
|
child = node.children[i]; |
|
collected[child.name] = this.visit(child.value, value); |
|
} |
|
return collected; |
|
case "OrExpression": |
|
matched = this.visit(node.children[0], value); |
|
if (isFalse(matched)) { |
|
matched = this.visit(node.children[1], value); |
|
} |
|
return matched; |
|
case "AndExpression": |
|
first = this.visit(node.children[0], value); |
|
|
|
if (isFalse(first) === true) { |
|
return first; |
|
} |
|
return this.visit(node.children[1], value); |
|
case "NotExpression": |
|
first = this.visit(node.children[0], value); |
|
return isFalse(first); |
|
case "Literal": |
|
return node.value; |
|
case TOK_PIPE: |
|
left = this.visit(node.children[0], value); |
|
return this.visit(node.children[1], left); |
|
case TOK_CURRENT: |
|
return value; |
|
case "Function": |
|
var resolvedArgs = []; |
|
for (i = 0; i < node.children.length; i++) { |
|
resolvedArgs.push(this.visit(node.children[i], value)); |
|
} |
|
return this.runtime.callFunction(node.name, resolvedArgs); |
|
case "ExpressionReference": |
|
var refNode = node.children[0]; |
|
// Tag the node with a specific attribute so the type |
|
// checker verify the type. |
|
refNode.jmespathType = TOK_EXPREF; |
|
return refNode; |
|
default: |
|
throw new Error("Unknown node type: " + node.type); |
|
} |
|
}, |
|
|
|
computeSliceParams: function(arrayLength, sliceParams) { |
|
var start = sliceParams[0]; |
|
var stop = sliceParams[1]; |
|
var step = sliceParams[2]; |
|
var computed = [null, null, null]; |
|
if (step === null) { |
|
step = 1; |
|
} else if (step === 0) { |
|
var error = new Error("Invalid slice, step cannot be 0"); |
|
error.name = "RuntimeError"; |
|
throw error; |
|
} |
|
var stepValueNegative = step < 0 ? true : false; |
|
|
|
if (start === null) { |
|
start = stepValueNegative ? arrayLength - 1 : 0; |
|
} else { |
|
start = this.capSliceRange(arrayLength, start, step); |
|
} |
|
|
|
if (stop === null) { |
|
stop = stepValueNegative ? -1 : arrayLength; |
|
} else { |
|
stop = this.capSliceRange(arrayLength, stop, step); |
|
} |
|
computed[0] = start; |
|
computed[1] = stop; |
|
computed[2] = step; |
|
return computed; |
|
}, |
|
|
|
capSliceRange: function(arrayLength, actualValue, step) { |
|
if (actualValue < 0) { |
|
actualValue += arrayLength; |
|
if (actualValue < 0) { |
|
actualValue = step < 0 ? -1 : 0; |
|
} |
|
} else if (actualValue >= arrayLength) { |
|
actualValue = step < 0 ? arrayLength - 1 : arrayLength; |
|
} |
|
return actualValue; |
|
} |
|
|
|
}; |
|
|
|
function Runtime(interpreter) { |
|
this._interpreter = interpreter; |
|
this.functionTable = { |
|
// name: [function, <signature>] |
|
// The <signature> can be: |
|
// |
|
// { |
|
// args: [[type1, type2], [type1, type2]], |
|
// variadic: true|false |
|
// } |
|
// |
|
// Each arg in the arg list is a list of valid types |
|
// (if the function is overloaded and supports multiple |
|
// types. If the type is "any" then no type checking |
|
// occurs on the argument. Variadic is optional |
|
// and if not provided is assumed to be false. |
|
abs: {_func: this._functionAbs, _signature: [{types: [TYPE_NUMBER]}]}, |
|
avg: {_func: this._functionAvg, _signature: [{types: [TYPE_ARRAY_NUMBER]}]}, |
|
ceil: {_func: this._functionCeil, _signature: [{types: [TYPE_NUMBER]}]}, |
|
contains: { |
|
_func: this._functionContains, |
|
_signature: [{types: [TYPE_STRING, TYPE_ARRAY]}, |
|
{types: [TYPE_ANY]}]}, |
|
"ends_with": { |
|
_func: this._functionEndsWith, |
|
_signature: [{types: [TYPE_STRING]}, {types: [TYPE_STRING]}]}, |
|
floor: {_func: this._functionFloor, _signature: [{types: [TYPE_NUMBER]}]}, |
|
length: { |
|
_func: this._functionLength, |
|
_signature: [{types: [TYPE_STRING, TYPE_ARRAY, TYPE_OBJECT]}]}, |
|
map: { |
|
_func: this._functionMap, |
|
_signature: [{types: [TYPE_EXPREF]}, {types: [TYPE_ARRAY]}]}, |
|
max: { |
|
_func: this._functionMax, |
|
_signature: [{types: [TYPE_ARRAY_NUMBER, TYPE_ARRAY_STRING]}]}, |
|
"merge": { |
|
_func: this._functionMerge, |
|
_signature: [{types: [TYPE_OBJECT], variadic: true}] |
|
}, |
|
"max_by": { |
|
_func: this._functionMaxBy, |
|
_signature: [{types: [TYPE_ARRAY]}, {types: [TYPE_EXPREF]}] |
|
}, |
|
sum: {_func: this._functionSum, _signature: [{types: [TYPE_ARRAY_NUMBER]}]}, |
|
"starts_with": { |
|
_func: this._functionStartsWith, |
|
_signature: [{types: [TYPE_STRING]}, {types: [TYPE_STRING]}]}, |
|
min: { |
|
_func: this._functionMin, |
|
_signature: [{types: [TYPE_ARRAY_NUMBER, TYPE_ARRAY_STRING]}]}, |
|
"min_by": { |
|
_func: this._functionMinBy, |
|
_signature: [{types: [TYPE_ARRAY]}, {types: [TYPE_EXPREF]}] |
|
}, |
|
type: {_func: this._functionType, _signature: [{types: [TYPE_ANY]}]}, |
|
keys: {_func: this._functionKeys, _signature: [{types: [TYPE_OBJECT]}]}, |
|
values: {_func: this._functionValues, _signature: [{types: [TYPE_OBJECT]}]}, |
|
sort: {_func: this._functionSort, _signature: [{types: [TYPE_ARRAY_STRING, TYPE_ARRAY_NUMBER]}]}, |
|
"sort_by": { |
|
_func: this._functionSortBy, |
|
_signature: [{types: [TYPE_ARRAY]}, {types: [TYPE_EXPREF]}] |
|
}, |
|
join: { |
|
_func: this._functionJoin, |
|
_signature: [ |
|
{types: [TYPE_STRING]}, |
|
{types: [TYPE_ARRAY_STRING]} |
|
] |
|
}, |
|
reverse: { |
|
_func: this._functionReverse, |
|
_signature: [{types: [TYPE_STRING, TYPE_ARRAY]}]}, |
|
"to_array": {_func: this._functionToArray, _signature: [{types: [TYPE_ANY]}]}, |
|
"to_string": {_func: this._functionToString, _signature: [{types: [TYPE_ANY]}]}, |
|
"to_number": {_func: this._functionToNumber, _signature: [{types: [TYPE_ANY]}]}, |
|
"not_null": { |
|
_func: this._functionNotNull, |
|
_signature: [{types: [TYPE_ANY], variadic: true}] |
|
} |
|
}; |
|
} |
|
|
|
Runtime.prototype = { |
|
callFunction: function(name, resolvedArgs) { |
|
var functionEntry = this.functionTable[name]; |
|
if (functionEntry === undefined) { |
|
throw new Error("Unknown function: " + name + "()"); |
|
} |
|
this._validateArgs(name, resolvedArgs, functionEntry._signature); |
|
return functionEntry._func.call(this, resolvedArgs); |
|
}, |
|
|
|
_validateArgs: function(name, args, signature) { |
|
// Validating the args requires validating |
|
// the correct arity and the correct type of each arg. |
|
// If the last argument is declared as variadic, then we need |
|
// a minimum number of args to be required. Otherwise it has to |
|
// be an exact amount. |
|
var pluralized; |
|
if (signature[signature.length - 1].variadic) { |
|
if (args.length < signature.length) { |
|
pluralized = signature.length === 1 ? " argument" : " arguments"; |
|
throw new Error("ArgumentError: " + name + "() " + |
|
"takes at least" + signature.length + pluralized + |
|
" but received " + args.length); |
|
} |
|
} else if (args.length !== signature.length) { |
|
pluralized = signature.length === 1 ? " argument" : " arguments"; |
|
throw new Error("ArgumentError: " + name + "() " + |
|
"takes " + signature.length + pluralized + |
|
" but received " + args.length); |
|
} |
|
var currentSpec; |
|
var actualType; |
|
var typeMatched; |
|
for (var i = 0; i < signature.length; i++) { |
|
typeMatched = false; |
|
currentSpec = signature[i].types; |
|
actualType = this._getTypeName(args[i]); |
|
for (var j = 0; j < currentSpec.length; j++) { |
|
if (this._typeMatches(actualType, currentSpec[j], args[i])) { |
|
typeMatched = true; |
|
break; |
|
} |
|
} |
|
if (!typeMatched) { |
|
throw new Error("TypeError: " + name + "() " + |
|
"expected argument " + (i + 1) + |
|
" to be type " + currentSpec + |
|
" but received type " + actualType + |
|
" instead."); |
|
} |
|
} |
|
}, |
|
|
|
_typeMatches: function(actual, expected, argValue) { |
|
if (expected === TYPE_ANY) { |
|
return true; |
|
} |
|
if (expected === TYPE_ARRAY_STRING || |
|
expected === TYPE_ARRAY_NUMBER || |
|
expected === TYPE_ARRAY) { |
|
// The expected type can either just be array, |
|
// or it can require a specific subtype (array of numbers). |
|
// |
|
// The simplest case is if "array" with no subtype is specified. |
|
if (expected === TYPE_ARRAY) { |
|
return actual === TYPE_ARRAY; |
|
} else if (actual === TYPE_ARRAY) { |
|
// Otherwise we need to check subtypes. |
|
// I think this has potential to be improved. |
|
var subtype; |
|
if (expected === TYPE_ARRAY_NUMBER) { |
|
subtype = TYPE_NUMBER; |
|
} else if (expected === TYPE_ARRAY_STRING) { |
|
subtype = TYPE_STRING; |
|
} |
|
for (var i = 0; i < argValue.length; i++) { |
|
if (!this._typeMatches( |
|
this._getTypeName(argValue[i]), subtype, |
|
argValue[i])) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
} else { |
|
return actual === expected; |
|
} |
|
}, |
|
_getTypeName: function(obj) { |
|
switch (Object.prototype.toString.call(obj)) { |
|
case "[object String]": |
|
return TYPE_STRING; |
|
case "[object Number]": |
|
return TYPE_NUMBER; |
|
case "[object Array]": |
|
return TYPE_ARRAY; |
|
case "[object Boolean]": |
|
return TYPE_BOOLEAN; |
|
case "[object Null]": |
|
return TYPE_NULL; |
|
case "[object Object]": |
|
// Check if it's an expref. If it has, it's been |
|
// tagged with a jmespathType attr of 'Expref'; |
|
if (obj.jmespathType === TOK_EXPREF) { |
|
return TYPE_EXPREF; |
|
} else { |
|
return TYPE_OBJECT; |
|
} |
|
} |
|
}, |
|
|
|
_functionStartsWith: function(resolvedArgs) { |
|
return resolvedArgs[0].lastIndexOf(resolvedArgs[1]) === 0; |
|
}, |
|
|
|
_functionEndsWith: function(resolvedArgs) { |
|
var searchStr = resolvedArgs[0]; |
|
var suffix = resolvedArgs[1]; |
|
return searchStr.indexOf(suffix, searchStr.length - suffix.length) !== -1; |
|
}, |
|
|
|
_functionReverse: function(resolvedArgs) { |
|
var typeName = this._getTypeName(resolvedArgs[0]); |
|
if (typeName === TYPE_STRING) { |
|
var originalStr = resolvedArgs[0]; |
|
var reversedStr = ""; |
|
for (var i = originalStr.length - 1; i >= 0; i--) { |
|
reversedStr += originalStr[i]; |
|
} |
|
return reversedStr; |
|
} else { |
|
var reversedArray = resolvedArgs[0].slice(0); |
|
reversedArray.reverse(); |
|
return reversedArray; |
|
} |
|
}, |
|
|
|
_functionAbs: function(resolvedArgs) { |
|
return Math.abs(resolvedArgs[0]); |
|
}, |
|
|
|
_functionCeil: function(resolvedArgs) { |
|
return Math.ceil(resolvedArgs[0]); |
|
}, |
|
|
|
_functionAvg: function(resolvedArgs) { |
|
var sum = 0; |
|
var inputArray = resolvedArgs[0]; |
|
for (var i = 0; i < inputArray.length; i++) { |
|
sum += inputArray[i]; |
|
} |
|
return sum / inputArray.length; |
|
}, |
|
|
|
_functionContains: function(resolvedArgs) { |
|
return resolvedArgs[0].indexOf(resolvedArgs[1]) >= 0; |
|
}, |
|
|
|
_functionFloor: function(resolvedArgs) { |
|
return Math.floor(resolvedArgs[0]); |
|
}, |
|
|
|
_functionLength: function(resolvedArgs) { |
|
if (!isObject(resolvedArgs[0])) { |
|
return resolvedArgs[0].length; |
|
} else { |
|
// As far as I can tell, there's no way to get the length |
|
// of an object without O(n) iteration through the object. |
|
return Object.keys(resolvedArgs[0]).length; |
|
} |
|
}, |
|
|
|
_functionMap: function(resolvedArgs) { |
|
var mapped = []; |
|
var interpreter = this._interpreter; |
|
var exprefNode = resolvedArgs[0]; |
|
var elements = resolvedArgs[1]; |
|
for (var i = 0; i < elements.length; i++) { |
|
mapped.push(interpreter.visit(exprefNode, elements[i])); |
|
} |
|
return mapped; |
|
}, |
|
|
|
_functionMerge: function(resolvedArgs) { |
|
var merged = {}; |
|
for (var i = 0; i < resolvedArgs.length; i++) { |
|
var current = resolvedArgs[i]; |
|
for (var key in current) { |
|
merged[key] = current[key]; |
|
} |
|
} |
|
return merged; |
|
}, |
|
|
|
_functionMax: function(resolvedArgs) { |
|
if (resolvedArgs[0].length > 0) { |
|
var typeName = this._getTypeName(resolvedArgs[0][0]); |
|
if (typeName === TYPE_NUMBER) { |
|
return Math.max.apply(Math, resolvedArgs[0]); |
|
} else { |
|
var elements = resolvedArgs[0]; |
|
var maxElement = elements[0]; |
|
for (var i = 1; i < elements.length; i++) { |
|
if (maxElement.localeCompare(elements[i]) < 0) { |
|
maxElement = elements[i]; |
|
} |
|
} |
|
return maxElement; |
|
} |
|
} else { |
|
return null; |
|
} |
|
}, |
|
|
|
_functionMin: function(resolvedArgs) { |
|
if (resolvedArgs[0].length > 0) { |
|
var typeName = this._getTypeName(resolvedArgs[0][0]); |
|
if (typeName === TYPE_NUMBER) { |
|
return Math.min.apply(Math, resolvedArgs[0]); |
|
} else { |
|
var elements = resolvedArgs[0]; |
|
var minElement = elements[0]; |
|
for (var i = 1; i < elements.length; i++) { |
|
if (elements[i].localeCompare(minElement) < 0) { |
|
minElement = elements[i]; |
|
} |
|
} |
|
return minElement; |
|
} |
|
} else { |
|
return null; |
|
} |
|
}, |
|
|
|
_functionSum: function(resolvedArgs) { |
|
var sum = 0; |
|
var listToSum = resolvedArgs[0]; |
|
for (var i = 0; i < listToSum.length; i++) { |
|
sum += listToSum[i]; |
|
} |
|
return sum; |
|
}, |
|
|
|
_functionType: function(resolvedArgs) { |
|
switch (this._getTypeName(resolvedArgs[0])) { |
|
case TYPE_NUMBER: |
|
return "number"; |
|
case TYPE_STRING: |
|
return "string"; |
|
case TYPE_ARRAY: |
|
return "array"; |
|
case TYPE_OBJECT: |
|
return "object"; |
|
case TYPE_BOOLEAN: |
|
return "boolean"; |
|
case TYPE_EXPREF: |
|
return "expref"; |
|
case TYPE_NULL: |
|
return "null"; |
|
} |
|
}, |
|
|
|
_functionKeys: function(resolvedArgs) { |
|
return Object.keys(resolvedArgs[0]); |
|
}, |
|
|
|
_functionValues: function(resolvedArgs) { |
|
var obj = resolvedArgs[0]; |
|
var keys = Object.keys(obj); |
|
var values = []; |
|
for (var i = 0; i < keys.length; i++) { |
|
values.push(obj[keys[i]]); |
|
} |
|
return values; |
|
}, |
|
|
|
_functionJoin: function(resolvedArgs) { |
|
var joinChar = resolvedArgs[0]; |
|
var listJoin = resolvedArgs[1]; |
|
return listJoin.join(joinChar); |
|
}, |
|
|
|
_functionToArray: function(resolvedArgs) { |
|
if (this._getTypeName(resolvedArgs[0]) === TYPE_ARRAY) { |
|
return resolvedArgs[0]; |
|
} else { |
|
return [resolvedArgs[0]]; |
|
} |
|
}, |
|
|
|
_functionToString: function(resolvedArgs) { |
|
if (this._getTypeName(resolvedArgs[0]) === TYPE_STRING) { |
|
return resolvedArgs[0]; |
|
} else { |
|
return JSON.stringify(resolvedArgs[0]); |
|
} |
|
}, |
|
|
|
_functionToNumber: function(resolvedArgs) { |
|
var typeName = this._getTypeName(resolvedArgs[0]); |
|
var convertedValue; |
|
if (typeName === TYPE_NUMBER) { |
|
return resolvedArgs[0]; |
|
} else if (typeName === TYPE_STRING) { |
|
convertedValue = +resolvedArgs[0]; |
|
if (!isNaN(convertedValue)) { |
|
return convertedValue; |
|
} |
|
} |
|
return null; |
|
}, |
|
|
|
_functionNotNull: function(resolvedArgs) { |
|
for (var i = 0; i < resolvedArgs.length; i++) { |
|
if (this._getTypeName(resolvedArgs[i]) !== TYPE_NULL) { |
|
return resolvedArgs[i]; |
|
} |
|
} |
|
return null; |
|
}, |
|
|
|
_functionSort: function(resolvedArgs) { |
|
var sortedArray = resolvedArgs[0].slice(0); |
|
sortedArray.sort(); |
|
return sortedArray; |
|
}, |
|
|
|
_functionSortBy: function(resolvedArgs) { |
|
var sortedArray = resolvedArgs[0].slice(0); |
|
if (sortedArray.length === 0) { |
|
return sortedArray; |
|
} |
|
var interpreter = this._interpreter; |
|
var exprefNode = resolvedArgs[1]; |
|
var requiredType = this._getTypeName( |
|
interpreter.visit(exprefNode, sortedArray[0])); |
|
if ([TYPE_NUMBER, TYPE_STRING].indexOf(requiredType) < 0) { |
|
throw new Error("TypeError"); |
|
} |
|
var that = this; |
|
// In order to get a stable sort out of an unstable |
|
// sort algorithm, we decorate/sort/undecorate (DSU) |
|
// by creating a new list of [index, element] pairs. |
|
// In the cmp function, if the evaluated elements are |
|
// equal, then the index will be used as the tiebreaker. |
|
// After the decorated list has been sorted, it will be |
|
// undecorated to extract the original elements. |
|
var decorated = []; |
|
for (var i = 0; i < sortedArray.length; i++) { |
|
decorated.push([i, sortedArray[i]]); |
|
} |
|
decorated.sort(function(a, b) { |
|
var exprA = interpreter.visit(exprefNode, a[1]); |
|
var exprB = interpreter.visit(exprefNode, b[1]); |
|
if (that._getTypeName(exprA) !== requiredType) { |
|
throw new Error( |
|
"TypeError: expected " + requiredType + ", received " + |
|
that._getTypeName(exprA)); |
|
} else if (that._getTypeName(exprB) !== requiredType) { |
|
throw new Error( |
|
"TypeError: expected " + requiredType + ", received " + |
|
that._getTypeName(exprB)); |
|
} |
|
if (exprA > exprB) { |
|
return 1; |
|
} else if (exprA < exprB) { |
|
return -1; |
|
} else { |
|
// If they're equal compare the items by their |
|
// order to maintain relative order of equal keys |
|
// (i.e. to get a stable sort). |
|
return a[0] - b[0]; |
|
} |
|
}); |
|
// Undecorate: extract out the original list elements. |
|
for (var j = 0; j < decorated.length; j++) { |
|
sortedArray[j] = decorated[j][1]; |
|
} |
|
return sortedArray; |
|
}, |
|
|
|
_functionMaxBy: function(resolvedArgs) { |
|
var exprefNode = resolvedArgs[1]; |
|
var resolvedArray = resolvedArgs[0]; |
|
var keyFunction = this.createKeyFunction(exprefNode, [TYPE_NUMBER, TYPE_STRING]); |
|
var maxNumber = -Infinity; |
|
var maxRecord; |
|
var current; |
|
for (var i = 0; i < resolvedArray.length; i++) { |
|
current = keyFunction(resolvedArray[i]); |
|
if (current > maxNumber) { |
|
maxNumber = current; |
|
maxRecord = resolvedArray[i]; |
|
} |
|
} |
|
return maxRecord; |
|
}, |
|
|
|
_functionMinBy: function(resolvedArgs) { |
|
var exprefNode = resolvedArgs[1]; |
|
var resolvedArray = resolvedArgs[0]; |
|
var keyFunction = this.createKeyFunction(exprefNode, [TYPE_NUMBER, TYPE_STRING]); |
|
var minNumber = Infinity; |
|
var minRecord; |
|
var current; |
|
for (var i = 0; i < resolvedArray.length; i++) { |
|
current = keyFunction(resolvedArray[i]); |
|
if (current < minNumber) { |
|
minNumber = current; |
|
minRecord = resolvedArray[i]; |
|
} |
|
} |
|
return minRecord; |
|
}, |
|
|
|
createKeyFunction: function(exprefNode, allowedTypes) { |
|
var that = this; |
|
var interpreter = this._interpreter; |
|
var keyFunc = function(x) { |
|
var current = interpreter.visit(exprefNode, x); |
|
if (allowedTypes.indexOf(that._getTypeName(current)) < 0) { |
|
var msg = "TypeError: expected one of " + allowedTypes + |
|
", received " + that._getTypeName(current); |
|
throw new Error(msg); |
|
} |
|
return current; |
|
}; |
|
return keyFunc; |
|
} |
|
|
|
}; |
|
|
|
function compile(stream) { |
|
var parser = new Parser(); |
|
var ast = parser.parse(stream); |
|
return ast; |
|
} |
|
|
|
function tokenize(stream) { |
|
var lexer = new Lexer(); |
|
return lexer.tokenize(stream); |
|
} |
|
|
|
function search(data, expression) { |
|
var parser = new Parser(); |
|
// This needs to be improved. Both the interpreter and runtime depend on |
|
// each other. The runtime needs the interpreter to support exprefs. |
|
// There's likely a clean way to avoid the cyclic dependency. |
|
var runtime = new Runtime(); |
|
var interpreter = new TreeInterpreter(runtime); |
|
runtime._interpreter = interpreter; |
|
var node = parser.parse(expression); |
|
return interpreter.search(node, data); |
|
} |
|
|
|
exports.tokenize = tokenize; |
|
exports.compile = compile; |
|
exports.search = search; |
|
exports.strictDeepEqual = strictDeepEqual; |
|
})(typeof exports === "undefined" ? this.jmespath = {} : exports); |
|
|
|
},{}],76:[function(require,module,exports){ |
|
var arrayEvery = require('../internal/arrayEvery'), |
|
baseCallback = require('../internal/baseCallback'), |
|
baseEvery = require('../internal/baseEvery'), |
|
isArray = require('../lang/isArray'); |
|
|
|
/** |
|
* Checks if `predicate` returns truthy for **all** elements of `collection`. |
|
* The predicate is bound to `thisArg` and invoked with three arguments; |
|
* (value, index|key, collection). |
|
* |
|
* If a property name is provided for `predicate` the created `_.property` |
|
* style callback returns the property value of the given element. |
|
* |
|
* If a value is also provided for `thisArg` the created `_.matchesProperty` |
|
* style callback returns `true` for elements that have a matching property |
|
* value, else `false`. |
|
* |
|
* If an object is provided for `predicate` the created `_.matches` style |
|
* callback returns `true` for elements that have the properties of the given |
|
* object, else `false`. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @alias all |
|
* @category Collection |
|
* @param {Array|Object|string} collection The collection to iterate over. |
|
* @param {Function|Object|string} [predicate=_.identity] The function invoked |
|
* per iteration. |
|
* @param {*} [thisArg] The `this` binding of `predicate`. |
|
* @returns {boolean} Returns `true` if all elements pass the predicate check, |
|
* else `false`. |
|
* @example |
|
* |
|
* _.every([true, 1, null, 'yes'], Boolean); |
|
* // => false |
|
* |
|
* var users = [ |
|
* { 'user': 'barney', 'active': false }, |
|
* { 'user': 'fred', 'active': false } |
|
* ]; |
|
* |
|
* // using the `_.matches` callback shorthand |
|
* _.every(users, { 'user': 'barney', 'active': false }); |
|
* // => false |
|
* |
|
* // using the `_.matchesProperty` callback shorthand |
|
* _.every(users, 'active', false); |
|
* // => true |
|
* |
|
* // using the `_.property` callback shorthand |
|
* _.every(users, 'active'); |
|
* // => false |
|
*/ |
|
function every(collection, predicate, thisArg) { |
|
var func = isArray(collection) ? arrayEvery : baseEvery; |
|
if (typeof predicate != 'function' || typeof thisArg != 'undefined') { |
|
predicate = baseCallback(predicate, thisArg, 3); |
|
} |
|
return func(collection, predicate); |
|
} |
|
|
|
module.exports = every; |
|
|
|
},{"../internal/arrayEvery":77,"../internal/baseCallback":79,"../internal/baseEvery":83,"../lang/isArray":110}],77:[function(require,module,exports){ |
|
/** |
|
* A specialized version of `_.every` for arrays without support for callback |
|
* shorthands or `this` binding. |
|
* |
|
* @private |
|
* @param {Array} array The array to iterate over. |
|
* @param {Function} predicate The function invoked per iteration. |
|
* @returns {boolean} Returns `true` if all elements pass the predicate check, |
|
* else `false`. |
|
*/ |
|
function arrayEvery(array, predicate) { |
|
var index = -1, |
|
length = array.length; |
|
|
|
while (++index < length) { |
|
if (!predicate(array[index], index, array)) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
module.exports = arrayEvery; |
|
|
|
},{}],78:[function(require,module,exports){ |
|
var baseCopy = require('./baseCopy'), |
|
keys = require('../object/keys'); |
|
|
|
/** |
|
* The base implementation of `_.assign` without support for argument juggling, |
|
* multiple sources, and `this` binding `customizer` functions. |
|
* |
|
* @private |
|
* @param {Object} object The destination object. |
|
* @param {Object} source The source object. |
|
* @param {Function} [customizer] The function to customize assigning values. |
|
* @returns {Object} Returns the destination object. |
|
*/ |
|
function baseAssign(object, source, customizer) { |
|
var props = keys(source); |
|
if (!customizer) { |
|
return baseCopy(source, object, props); |
|
} |
|
var index = -1, |
|
length = props.length; |
|
|
|
while (++index < length) { |
|
var key = props[index], |
|
value = object[key], |
|
result = customizer(value, source[key], key, object, source); |
|
|
|
if ((result === result ? (result !== value) : (value === value)) || |
|
(typeof value == 'undefined' && !(key in object))) { |
|
object[key] = result; |
|
} |
|
} |
|
return object; |
|
} |
|
|
|
module.exports = baseAssign; |
|
|
|
},{"../object/keys":119,"./baseCopy":80}],79:[function(require,module,exports){ |
|
var baseMatches = require('./baseMatches'), |
|
baseMatchesProperty = require('./baseMatchesProperty'), |
|
baseProperty = require('./baseProperty'), |
|
bindCallback = require('./bindCallback'), |
|
identity = require('../utility/identity'), |
|
isBindable = require('./isBindable'); |
|
|
|
/** |
|
* The base implementation of `_.callback` which supports specifying the |
|
* number of arguments to provide to `func`. |
|
* |
|
* @private |
|
* @param {*} [func=_.identity] The value to convert to a callback. |
|
* @param {*} [thisArg] The `this` binding of `func`. |
|
* @param {number} [argCount] The number of arguments to provide to `func`. |
|
* @returns {Function} Returns the callback. |
|
*/ |
|
function baseCallback(func, thisArg, argCount) { |
|
var type = typeof func; |
|
if (type == 'function') { |
|
return (typeof thisArg != 'undefined' && isBindable(func)) |
|
? bindCallback(func, thisArg, argCount) |
|
: func; |
|
} |
|
if (func == null) { |
|
return identity; |
|
} |
|
if (type == 'object') { |
|
return baseMatches(func); |
|
} |
|
return typeof thisArg == 'undefined' |
|
? baseProperty(func + '') |
|
: baseMatchesProperty(func + '', thisArg); |
|
} |
|
|
|
module.exports = baseCallback; |
|
|
|
},{"../utility/identity":123,"./baseMatches":90,"./baseMatchesProperty":91,"./baseProperty":92,"./bindCallback":95,"./isBindable":100}],80:[function(require,module,exports){ |
|
/** |
|
* Copies the properties of `source` to `object`. |
|
* |
|
* @private |
|
* @param {Object} source The object to copy properties from. |
|
* @param {Object} [object={}] The object to copy properties to. |
|
* @param {Array} props The property names to copy. |
|
* @returns {Object} Returns `object`. |
|
*/ |
|
function baseCopy(source, object, props) { |
|
if (!props) { |
|
props = object; |
|
object = {}; |
|
} |
|
var index = -1, |
|
length = props.length; |
|
|
|
while (++index < length) { |
|
var key = props[index]; |
|
object[key] = source[key]; |
|
} |
|
return object; |
|
} |
|
|
|
module.exports = baseCopy; |
|
|
|
},{}],81:[function(require,module,exports){ |
|
(function (global){ |
|
var isObject = require('../lang/isObject'); |
|
|
|
/** |
|
* The base implementation of `_.create` without support for assigning |
|
* properties to the created object. |
|
* |
|
* @private |
|
* @param {Object} prototype The object to inherit from. |
|
* @returns {Object} Returns the new object. |
|
*/ |
|
var baseCreate = (function() { |
|
function Object() {} |
|
return function(prototype) { |
|
if (isObject(prototype)) { |
|
Object.prototype = prototype; |
|
var result = new Object; |
|
Object.prototype = null; |
|
} |
|
return result || global.Object(); |
|
}; |
|
}()); |
|
|
|
module.exports = baseCreate; |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"../lang/isObject":114}],82:[function(require,module,exports){ |
|
var baseForOwn = require('./baseForOwn'), |
|
isLength = require('./isLength'), |
|
toObject = require('./toObject'); |
|
|
|
/** |
|
* The base implementation of `_.forEach` without support for callback |
|
* shorthands and `this` binding. |
|
* |
|
* @private |
|
* @param {Array|Object|string} collection The collection to iterate over. |
|
* @param {Function} iteratee The function invoked per iteration. |
|
* @returns {Array|Object|string} Returns `collection`. |
|
*/ |
|
function baseEach(collection, iteratee) { |
|
var length = collection ? collection.length : 0; |
|
if (!isLength(length)) { |
|
return baseForOwn(collection, iteratee); |
|
} |
|
var index = -1, |
|
iterable = toObject(collection); |
|
|
|
while (++index < length) { |
|
if (iteratee(iterable[index], index, iterable) === false) { |
|
break; |
|
} |
|
} |
|
return collection; |
|
} |
|
|
|
module.exports = baseEach; |
|
|
|
},{"./baseForOwn":85,"./isLength":103,"./toObject":108}],83:[function(require,module,exports){ |
|
var baseEach = require('./baseEach'); |
|
|
|
/** |
|
* The base implementation of `_.every` without support for callback |
|
* shorthands or `this` binding. |
|
* |
|
* @private |
|
* @param {Array|Object|string} collection The collection to iterate over. |
|
* @param {Function} predicate The function invoked per iteration. |
|
* @returns {boolean} Returns `true` if all elements pass the predicate check, |
|
* else `false` |
|
*/ |
|
function baseEvery(collection, predicate) { |
|
var result = true; |
|
baseEach(collection, function(value, index, collection) { |
|
result = !!predicate(value, index, collection); |
|
return result; |
|
}); |
|
return result; |
|
} |
|
|
|
module.exports = baseEvery; |
|
|
|
},{"./baseEach":82}],84:[function(require,module,exports){ |
|
var toObject = require('./toObject'); |
|
|
|
/** |
|
* The base implementation of `baseForIn` and `baseForOwn` which iterates |
|
* over `object` properties returned by `keysFunc` invoking `iteratee` for |
|
* each property. Iterator functions may exit iteration early by explicitly |
|
* returning `false`. |
|
* |
|
* @private |
|
* @param {Object} object The object to iterate over. |
|
* @param {Function} iteratee The function invoked per iteration. |
|
* @param {Function} keysFunc The function to get the keys of `object`. |
|
* @returns {Object} Returns `object`. |
|
*/ |
|
function baseFor(object, iteratee, keysFunc) { |
|
var index = -1, |
|
iterable = toObject(object), |
|
props = keysFunc(object), |
|
length = props.length; |
|
|
|
while (++index < length) { |
|
var key = props[index]; |
|
if (iteratee(iterable[key], key, iterable) === false) { |
|
break; |
|
} |
|
} |
|
return object; |
|
} |
|
|
|
module.exports = baseFor; |
|
|
|
},{"./toObject":108}],85:[function(require,module,exports){ |
|
var baseFor = require('./baseFor'), |
|
keys = require('../object/keys'); |
|
|
|
/** |
|
* The base implementation of `_.forOwn` without support for callback |
|
* shorthands and `this` binding. |
|
* |
|
* @private |
|
* @param {Object} object The object to iterate over. |
|
* @param {Function} iteratee The function invoked per iteration. |
|
* @returns {Object} Returns `object`. |
|
*/ |
|
function baseForOwn(object, iteratee) { |
|
return baseFor(object, iteratee, keys); |
|
} |
|
|
|
module.exports = baseForOwn; |
|
|
|
},{"../object/keys":119,"./baseFor":84}],86:[function(require,module,exports){ |
|
var baseIsEqualDeep = require('./baseIsEqualDeep'); |
|
|
|
/** |
|
* The base implementation of `_.isEqual` without support for `this` binding |
|
* `customizer` functions. |
|
* |
|
* @private |
|
* @param {*} value The value to compare. |
|
* @param {*} other The other value to compare. |
|
* @param {Function} [customizer] The function to customize comparing values. |
|
* @param {boolean} [isWhere] Specify performing partial comparisons. |
|
* @param {Array} [stackA] Tracks traversed `value` objects. |
|
* @param {Array} [stackB] Tracks traversed `other` objects. |
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
|
*/ |
|
function baseIsEqual(value, other, customizer, isWhere, stackA, stackB) { |
|
// Exit early for identical values. |
|
if (value === other) { |
|
// Treat `+0` vs. `-0` as not equal. |
|
return value !== 0 || (1 / value == 1 / other); |
|
} |
|
var valType = typeof value, |
|
othType = typeof other; |
|
|
|
// Exit early for unlike primitive values. |
|
if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') || |
|
value == null || other == null) { |
|
// Return `false` unless both values are `NaN`. |
|
return value !== value && other !== other; |
|
} |
|
return baseIsEqualDeep(value, other, baseIsEqual, customizer, isWhere, stackA, stackB); |
|
} |
|
|
|
module.exports = baseIsEqual; |
|
|
|
},{"./baseIsEqualDeep":87}],87:[function(require,module,exports){ |
|
var equalArrays = require('./equalArrays'), |
|
equalByTag = require('./equalByTag'), |
|
equalObjects = require('./equalObjects'), |
|
isArray = require('../lang/isArray'), |
|
isTypedArray = require('../lang/isTypedArray'); |
|
|
|
/** `Object#toString` result references. */ |
|
var argsTag = '[object Arguments]', |
|
arrayTag = '[object Array]', |
|
objectTag = '[object Object]'; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to check objects for own properties. */ |
|
var hasOwnProperty = objectProto.hasOwnProperty; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/** |
|
* A specialized version of `baseIsEqual` for arrays and objects which performs |
|
* deep comparisons and tracks traversed objects enabling objects with circular |
|
* references to be compared. |
|
* |
|
* @private |
|
* @param {Object} object The object to compare. |
|
* @param {Object} other The other object to compare. |
|
* @param {Function} equalFunc The function to determine equivalents of values. |
|
* @param {Function} [customizer] The function to customize comparing objects. |
|
* @param {boolean} [isWhere] Specify performing partial comparisons. |
|
* @param {Array} [stackA=[]] Tracks traversed `value` objects. |
|
* @param {Array} [stackB=[]] Tracks traversed `other` objects. |
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
|
*/ |
|
function baseIsEqualDeep(object, other, equalFunc, customizer, isWhere, stackA, stackB) { |
|
var objIsArr = isArray(object), |
|
othIsArr = isArray(other), |
|
objTag = arrayTag, |
|
othTag = arrayTag; |
|
|
|
if (!objIsArr) { |
|
objTag = objToString.call(object); |
|
if (objTag == argsTag) { |
|
objTag = objectTag; |
|
} else if (objTag != objectTag) { |
|
objIsArr = isTypedArray(object); |
|
} |
|
} |
|
if (!othIsArr) { |
|
othTag = objToString.call(other); |
|
if (othTag == argsTag) { |
|
othTag = objectTag; |
|
} else if (othTag != objectTag) { |
|
othIsArr = isTypedArray(other); |
|
} |
|
} |
|
var objIsObj = objTag == objectTag, |
|
othIsObj = othTag == objectTag, |
|
isSameTag = objTag == othTag; |
|
|
|
if (isSameTag && !(objIsArr || objIsObj)) { |
|
return equalByTag(object, other, objTag); |
|
} |
|
var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), |
|
othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); |
|
|
|
if (valWrapped || othWrapped) { |
|
return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isWhere, stackA, stackB); |
|
} |
|
if (!isSameTag) { |
|
return false; |
|
} |
|
// Assume cyclic values are equal. |
|
// For more information on detecting circular references see https://es5.github.io/#JO. |
|
stackA || (stackA = []); |
|
stackB || (stackB = []); |
|
|
|
var length = stackA.length; |
|
while (length--) { |
|
if (stackA[length] == object) { |
|
return stackB[length] == other; |
|
} |
|
} |
|
// Add `object` and `other` to the stack of traversed objects. |
|
stackA.push(object); |
|
stackB.push(other); |
|
|
|
var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isWhere, stackA, stackB); |
|
|
|
stackA.pop(); |
|
stackB.pop(); |
|
|
|
return result; |
|
} |
|
|
|
module.exports = baseIsEqualDeep; |
|
|
|
},{"../lang/isArray":110,"../lang/isTypedArray":116,"./equalArrays":97,"./equalByTag":98,"./equalObjects":99}],88:[function(require,module,exports){ |
|
/** |
|
* The base implementation of `_.isFunction` without support for environments |
|
* with incorrect `typeof` results. |
|
* |
|
* @private |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
|
*/ |
|
function baseIsFunction(value) { |
|
// Avoid a Chakra JIT bug in compatibility modes of IE 11. |
|
// See https://github.com/jashkenas/underscore/issues/1621 for more details. |
|
return typeof value == 'function' || false; |
|
} |
|
|
|
module.exports = baseIsFunction; |
|
|
|
},{}],89:[function(require,module,exports){ |
|
var baseIsEqual = require('./baseIsEqual'); |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to check objects for own properties. */ |
|
var hasOwnProperty = objectProto.hasOwnProperty; |
|
|
|
/** |
|
* The base implementation of `_.isMatch` without support for callback |
|
* shorthands or `this` binding. |
|
* |
|
* @private |
|
* @param {Object} object The object to inspect. |
|
* @param {Array} props The source property names to match. |
|
* @param {Array} values The source values to match. |
|
* @param {Array} strictCompareFlags Strict comparison flags for source values. |
|
* @param {Function} [customizer] The function to customize comparing objects. |
|
* @returns {boolean} Returns `true` if `object` is a match, else `false`. |
|
*/ |
|
function baseIsMatch(object, props, values, strictCompareFlags, customizer) { |
|
var length = props.length; |
|
if (object == null) { |
|
return !length; |
|
} |
|
var index = -1, |
|
noCustomizer = !customizer; |
|
|
|
while (++index < length) { |
|
if ((noCustomizer && strictCompareFlags[index]) |
|
? values[index] !== object[props[index]] |
|
: !hasOwnProperty.call(object, props[index]) |
|
) { |
|
return false; |
|
} |
|
} |
|
index = -1; |
|
while (++index < length) { |
|
var key = props[index]; |
|
if (noCustomizer && strictCompareFlags[index]) { |
|
var result = hasOwnProperty.call(object, key); |
|
} else { |
|
var objValue = object[key], |
|
srcValue = values[index]; |
|
|
|
result = customizer ? customizer(objValue, srcValue, key) : undefined; |
|
if (typeof result == 'undefined') { |
|
result = baseIsEqual(srcValue, objValue, customizer, true); |
|
} |
|
} |
|
if (!result) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
module.exports = baseIsMatch; |
|
|
|
},{"./baseIsEqual":86}],90:[function(require,module,exports){ |
|
var baseIsMatch = require('./baseIsMatch'), |
|
isStrictComparable = require('./isStrictComparable'), |
|
keys = require('../object/keys'); |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to check objects for own properties. */ |
|
var hasOwnProperty = objectProto.hasOwnProperty; |
|
|
|
/** |
|
* The base implementation of `_.matches` which does not clone `source`. |
|
* |
|
* @private |
|
* @param {Object} source The object of property values to match. |
|
* @returns {Function} Returns the new function. |
|
*/ |
|
function baseMatches(source) { |
|
var props = keys(source), |
|
length = props.length; |
|
|
|
if (length == 1) { |
|
var key = props[0], |
|
value = source[key]; |
|
|
|
if (isStrictComparable(value)) { |
|
return function(object) { |
|
return object != null && object[key] === value && hasOwnProperty.call(object, key); |
|
}; |
|
} |
|
} |
|
var values = Array(length), |
|
strictCompareFlags = Array(length); |
|
|
|
while (length--) { |
|
value = source[props[length]]; |
|
values[length] = value; |
|
strictCompareFlags[length] = isStrictComparable(value); |
|
} |
|
return function(object) { |
|
return baseIsMatch(object, props, values, strictCompareFlags); |
|
}; |
|
} |
|
|
|
module.exports = baseMatches; |
|
|
|
},{"../object/keys":119,"./baseIsMatch":89,"./isStrictComparable":105}],91:[function(require,module,exports){ |
|
var baseIsEqual = require('./baseIsEqual'), |
|
isStrictComparable = require('./isStrictComparable'); |
|
|
|
/** |
|
* The base implementation of `_.matchesProperty` which does not coerce `key` |
|
* to a string. |
|
* |
|
* @private |
|
* @param {string} key The key of the property to get. |
|
* @param {*} value The value to compare. |
|
* @returns {Function} Returns the new function. |
|
*/ |
|
function baseMatchesProperty(key, value) { |
|
if (isStrictComparable(value)) { |
|
return function(object) { |
|
return object != null && object[key] === value; |
|
}; |
|
} |
|
return function(object) { |
|
return object != null && baseIsEqual(value, object[key], null, true); |
|
}; |
|
} |
|
|
|
module.exports = baseMatchesProperty; |
|
|
|
},{"./baseIsEqual":86,"./isStrictComparable":105}],92:[function(require,module,exports){ |
|
/** |
|
* The base implementation of `_.property` which does not coerce `key` to a string. |
|
* |
|
* @private |
|
* @param {string} key The key of the property to get. |
|
* @returns {Function} Returns the new function. |
|
*/ |
|
function baseProperty(key) { |
|
return function(object) { |
|
return object == null ? undefined : object[key]; |
|
}; |
|
} |
|
|
|
module.exports = baseProperty; |
|
|
|
},{}],93:[function(require,module,exports){ |
|
var identity = require('../utility/identity'), |
|
metaMap = require('./metaMap'); |
|
|
|
/** |
|
* The base implementation of `setData` without support for hot loop detection. |
|
* |
|
* @private |
|
* @param {Function} func The function to associate metadata with. |
|
* @param {*} data The metadata. |
|
* @returns {Function} Returns `func`. |
|
*/ |
|
var baseSetData = !metaMap ? identity : function(func, data) { |
|
metaMap.set(func, data); |
|
return func; |
|
}; |
|
|
|
module.exports = baseSetData; |
|
|
|
},{"../utility/identity":123,"./metaMap":106}],94:[function(require,module,exports){ |
|
/** |
|
* Converts `value` to a string if it is not one. An empty string is returned |
|
* for `null` or `undefined` values. |
|
* |
|
* @private |
|
* @param {*} value The value to process. |
|
* @returns {string} Returns the string. |
|
*/ |
|
function baseToString(value) { |
|
if (typeof value == 'string') { |
|
return value; |
|
} |
|
return value == null ? '' : (value + ''); |
|
} |
|
|
|
module.exports = baseToString; |
|
|
|
},{}],95:[function(require,module,exports){ |
|
var identity = require('../utility/identity'); |
|
|
|
/** |
|
* A specialized version of `baseCallback` which only supports `this` binding |
|
* and specifying the number of arguments to provide to `func`. |
|
* |
|
* @private |
|
* @param {Function} func The function to bind. |
|
* @param {*} thisArg The `this` binding of `func`. |
|
* @param {number} [argCount] The number of arguments to provide to `func`. |
|
* @returns {Function} Returns the callback. |
|
*/ |
|
function bindCallback(func, thisArg, argCount) { |
|
if (typeof func != 'function') { |
|
return identity; |
|
} |
|
if (typeof thisArg == 'undefined') { |
|
return func; |
|
} |
|
switch (argCount) { |
|
case 1: return function(value) { |
|
return func.call(thisArg, value); |
|
}; |
|
case 3: return function(value, index, collection) { |
|
return func.call(thisArg, value, index, collection); |
|
}; |
|
case 4: return function(accumulator, value, index, collection) { |
|
return func.call(thisArg, accumulator, value, index, collection); |
|
}; |
|
case 5: return function(value, other, key, object, source) { |
|
return func.call(thisArg, value, other, key, object, source); |
|
}; |
|
} |
|
return function() { |
|
return func.apply(thisArg, arguments); |
|
}; |
|
} |
|
|
|
module.exports = bindCallback; |
|
|
|
},{"../utility/identity":123}],96:[function(require,module,exports){ |
|
var bindCallback = require('./bindCallback'), |
|
isIterateeCall = require('./isIterateeCall'); |
|
|
|
/** |
|
* Creates a function that assigns properties of source object(s) to a given |
|
* destination object. |
|
* |
|
* @private |
|
* @param {Function} assigner The function to assign values. |
|
* @returns {Function} Returns the new assigner function. |
|
*/ |
|
function createAssigner(assigner) { |
|
return function() { |
|
var args = arguments, |
|
length = args.length, |
|
object = args[0]; |
|
|
|
if (length < 2 || object == null) { |
|
return object; |
|
} |
|
var customizer = args[length - 2], |
|
thisArg = args[length - 1], |
|
guard = args[3]; |
|
|
|
if (length > 3 && typeof customizer == 'function') { |
|
customizer = bindCallback(customizer, thisArg, 5); |
|
length -= 2; |
|
} else { |
|
customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null; |
|
length -= (customizer ? 1 : 0); |
|
} |
|
if (guard && isIterateeCall(args[1], args[2], guard)) { |
|
customizer = length == 3 ? null : customizer; |
|
length = 2; |
|
} |
|
var index = 0; |
|
while (++index < length) { |
|
var source = args[index]; |
|
if (source) { |
|
assigner(object, source, customizer); |
|
} |
|
} |
|
return object; |
|
}; |
|
} |
|
|
|
module.exports = createAssigner; |
|
|
|
},{"./bindCallback":95,"./isIterateeCall":102}],97:[function(require,module,exports){ |
|
/** |
|
* A specialized version of `baseIsEqualDeep` for arrays with support for |
|
* partial deep comparisons. |
|
* |
|
* @private |
|
* @param {Array} array The array to compare. |
|
* @param {Array} other The other array to compare. |
|
* @param {Function} equalFunc The function to determine equivalents of values. |
|
* @param {Function} [customizer] The function to customize comparing arrays. |
|
* @param {boolean} [isWhere] Specify performing partial comparisons. |
|
* @param {Array} [stackA] Tracks traversed `value` objects. |
|
* @param {Array} [stackB] Tracks traversed `other` objects. |
|
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. |
|
*/ |
|
function equalArrays(array, other, equalFunc, customizer, isWhere, stackA, stackB) { |
|
var index = -1, |
|
arrLength = array.length, |
|
othLength = other.length, |
|
result = true; |
|
|
|
if (arrLength != othLength && !(isWhere && othLength > arrLength)) { |
|
return false; |
|
} |
|
// Deep compare the contents, ignoring non-numeric properties. |
|
while (result && ++index < arrLength) { |
|
var arrValue = array[index], |
|
othValue = other[index]; |
|
|
|
result = undefined; |
|
if (customizer) { |
|
result = isWhere |
|
? customizer(othValue, arrValue, index) |
|
: customizer(arrValue, othValue, index); |
|
} |
|
if (typeof result == 'undefined') { |
|
// Recursively compare arrays (susceptible to call stack limits). |
|
if (isWhere) { |
|
var othIndex = othLength; |
|
while (othIndex--) { |
|
othValue = other[othIndex]; |
|
result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB); |
|
if (result) { |
|
break; |
|
} |
|
} |
|
} else { |
|
result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB); |
|
} |
|
} |
|
} |
|
return !!result; |
|
} |
|
|
|
module.exports = equalArrays; |
|
|
|
},{}],98:[function(require,module,exports){ |
|
/** `Object#toString` result references. */ |
|
var boolTag = '[object Boolean]', |
|
dateTag = '[object Date]', |
|
errorTag = '[object Error]', |
|
numberTag = '[object Number]', |
|
regexpTag = '[object RegExp]', |
|
stringTag = '[object String]'; |
|
|
|
/** |
|
* A specialized version of `baseIsEqualDeep` for comparing objects of |
|
* the same `toStringTag`. |
|
* |
|
* **Note:** This function only supports comparing values with tags of |
|
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. |
|
* |
|
* @private |
|
* @param {Object} value The object to compare. |
|
* @param {Object} other The other object to compare. |
|
* @param {string} tag The `toStringTag` of the objects to compare. |
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
|
*/ |
|
function equalByTag(object, other, tag) { |
|
switch (tag) { |
|
case boolTag: |
|
case dateTag: |
|
// Coerce dates and booleans to numbers, dates to milliseconds and booleans |
|
// to `1` or `0` treating invalid dates coerced to `NaN` as not equal. |
|
return +object == +other; |
|
|
|
case errorTag: |
|
return object.name == other.name && object.message == other.message; |
|
|
|
case numberTag: |
|
// Treat `NaN` vs. `NaN` as equal. |
|
return (object != +object) |
|
? other != +other |
|
// But, treat `-0` vs. `+0` as not equal. |
|
: (object == 0 ? ((1 / object) == (1 / other)) : object == +other); |
|
|
|
case regexpTag: |
|
case stringTag: |
|
// Coerce regexes to strings and treat strings primitives and string |
|
// objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. |
|
return object == (other + ''); |
|
} |
|
return false; |
|
} |
|
|
|
module.exports = equalByTag; |
|
|
|
},{}],99:[function(require,module,exports){ |
|
var keys = require('../object/keys'); |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to check objects for own properties. */ |
|
var hasOwnProperty = objectProto.hasOwnProperty; |
|
|
|
/** |
|
* A specialized version of `baseIsEqualDeep` for objects with support for |
|
* partial deep comparisons. |
|
* |
|
* @private |
|
* @param {Object} object The object to compare. |
|
* @param {Object} other The other object to compare. |
|
* @param {Function} equalFunc The function to determine equivalents of values. |
|
* @param {Function} [customizer] The function to customize comparing values. |
|
* @param {boolean} [isWhere] Specify performing partial comparisons. |
|
* @param {Array} [stackA] Tracks traversed `value` objects. |
|
* @param {Array} [stackB] Tracks traversed `other` objects. |
|
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
|
*/ |
|
function equalObjects(object, other, equalFunc, customizer, isWhere, stackA, stackB) { |
|
var objProps = keys(object), |
|
objLength = objProps.length, |
|
othProps = keys(other), |
|
othLength = othProps.length; |
|
|
|
if (objLength != othLength && !isWhere) { |
|
return false; |
|
} |
|
var hasCtor, |
|
index = -1; |
|
|
|
while (++index < objLength) { |
|
var key = objProps[index], |
|
result = hasOwnProperty.call(other, key); |
|
|
|
if (result) { |
|
var objValue = object[key], |
|
othValue = other[key]; |
|
|
|
result = undefined; |
|
if (customizer) { |
|
result = isWhere |
|
? customizer(othValue, objValue, key) |
|
: customizer(objValue, othValue, key); |
|
} |
|
if (typeof result == 'undefined') { |
|
// Recursively compare objects (susceptible to call stack limits). |
|
result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isWhere, stackA, stackB); |
|
} |
|
} |
|
if (!result) { |
|
return false; |
|
} |
|
hasCtor || (hasCtor = key == 'constructor'); |
|
} |
|
if (!hasCtor) { |
|
var objCtor = object.constructor, |
|
othCtor = other.constructor; |
|
|
|
// Non `Object` object instances with different constructors are not equal. |
|
if (objCtor != othCtor && |
|
('constructor' in object && 'constructor' in other) && |
|
!(typeof objCtor == 'function' && objCtor instanceof objCtor && |
|
typeof othCtor == 'function' && othCtor instanceof othCtor)) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
module.exports = equalObjects; |
|
|
|
},{"../object/keys":119}],100:[function(require,module,exports){ |
|
var baseSetData = require('./baseSetData'), |
|
isNative = require('../lang/isNative'), |
|
support = require('../support'); |
|
|
|
/** Used to detect named functions. */ |
|
var reFuncName = /^\s*function[ \n\r\t]+\w/; |
|
|
|
/** Used to detect functions containing a `this` reference. */ |
|
var reThis = /\bthis\b/; |
|
|
|
/** Used to resolve the decompiled source of functions. */ |
|
var fnToString = Function.prototype.toString; |
|
|
|
/** |
|
* Checks if `func` is eligible for `this` binding. |
|
* |
|
* @private |
|
* @param {Function} func The function to check. |
|
* @returns {boolean} Returns `true` if `func` is eligible, else `false`. |
|
*/ |
|
function isBindable(func) { |
|
var result = !(support.funcNames ? func.name : support.funcDecomp); |
|
|
|
if (!result) { |
|
var source = fnToString.call(func); |
|
if (!support.funcNames) { |
|
result = !reFuncName.test(source); |
|
} |
|
if (!result) { |
|
// Check if `func` references the `this` keyword and store the result. |
|
result = reThis.test(source) || isNative(func); |
|
baseSetData(func, result); |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
module.exports = isBindable; |
|
|
|
},{"../lang/isNative":113,"../support":122,"./baseSetData":93}],101:[function(require,module,exports){ |
|
/** |
|
* Used as the maximum length of an array-like value. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) |
|
* for more details. |
|
*/ |
|
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; |
|
|
|
/** |
|
* Checks if `value` is a valid array-like index. |
|
* |
|
* @private |
|
* @param {*} value The value to check. |
|
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. |
|
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`. |
|
*/ |
|
function isIndex(value, length) { |
|
value = +value; |
|
length = length == null ? MAX_SAFE_INTEGER : length; |
|
return value > -1 && value % 1 == 0 && value < length; |
|
} |
|
|
|
module.exports = isIndex; |
|
|
|
},{}],102:[function(require,module,exports){ |
|
var isIndex = require('./isIndex'), |
|
isLength = require('./isLength'), |
|
isObject = require('../lang/isObject'); |
|
|
|
/** |
|
* Checks if the provided arguments are from an iteratee call. |
|
* |
|
* @private |
|
* @param {*} value The potential iteratee value argument. |
|
* @param {*} index The potential iteratee index or key argument. |
|
* @param {*} object The potential iteratee object argument. |
|
* @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`. |
|
*/ |
|
function isIterateeCall(value, index, object) { |
|
if (!isObject(object)) { |
|
return false; |
|
} |
|
var type = typeof index; |
|
if (type == 'number') { |
|
var length = object.length, |
|
prereq = isLength(length) && isIndex(index, length); |
|
} else { |
|
prereq = type == 'string' && index in object; |
|
} |
|
if (prereq) { |
|
var other = object[index]; |
|
return value === value ? (value === other) : (other !== other); |
|
} |
|
return false; |
|
} |
|
|
|
module.exports = isIterateeCall; |
|
|
|
},{"../lang/isObject":114,"./isIndex":101,"./isLength":103}],103:[function(require,module,exports){ |
|
/** |
|
* Used as the maximum length of an array-like value. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) |
|
* for more details. |
|
*/ |
|
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; |
|
|
|
/** |
|
* Checks if `value` is a valid array-like length. |
|
* |
|
* **Note:** This function is based on ES `ToLength`. See the |
|
* [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength) |
|
* for more details. |
|
* |
|
* @private |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`. |
|
*/ |
|
function isLength(value) { |
|
return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; |
|
} |
|
|
|
module.exports = isLength; |
|
|
|
},{}],104:[function(require,module,exports){ |
|
/** |
|
* Checks if `value` is object-like. |
|
* |
|
* @private |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`. |
|
*/ |
|
function isObjectLike(value) { |
|
return (value && typeof value == 'object') || false; |
|
} |
|
|
|
module.exports = isObjectLike; |
|
|
|
},{}],105:[function(require,module,exports){ |
|
var isObject = require('../lang/isObject'); |
|
|
|
/** |
|
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`. |
|
* |
|
* @private |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` if suitable for strict |
|
* equality comparisons, else `false`. |
|
*/ |
|
function isStrictComparable(value) { |
|
return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value)); |
|
} |
|
|
|
module.exports = isStrictComparable; |
|
|
|
},{"../lang/isObject":114}],106:[function(require,module,exports){ |
|
(function (global){ |
|
var isNative = require('../lang/isNative'); |
|
|
|
/** Native method references. */ |
|
var WeakMap = isNative(WeakMap = global.WeakMap) && WeakMap; |
|
|
|
/** Used to store function metadata. */ |
|
var metaMap = WeakMap && new WeakMap; |
|
|
|
module.exports = metaMap; |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"../lang/isNative":113}],107:[function(require,module,exports){ |
|
var isArguments = require('../lang/isArguments'), |
|
isArray = require('../lang/isArray'), |
|
isIndex = require('./isIndex'), |
|
isLength = require('./isLength'), |
|
keysIn = require('../object/keysIn'), |
|
support = require('../support'); |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to check objects for own properties. */ |
|
var hasOwnProperty = objectProto.hasOwnProperty; |
|
|
|
/** |
|
* A fallback implementation of `Object.keys` which creates an array of the |
|
* own enumerable property names of `object`. |
|
* |
|
* @private |
|
* @param {Object} object The object to inspect. |
|
* @returns {Array} Returns the array of property names. |
|
*/ |
|
function shimKeys(object) { |
|
var props = keysIn(object), |
|
propsLength = props.length, |
|
length = propsLength && object.length; |
|
|
|
var allowIndexes = length && isLength(length) && |
|
(isArray(object) || (support.nonEnumArgs && isArguments(object))); |
|
|
|
var index = -1, |
|
result = []; |
|
|
|
while (++index < propsLength) { |
|
var key = props[index]; |
|
if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { |
|
result.push(key); |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
module.exports = shimKeys; |
|
|
|
},{"../lang/isArguments":109,"../lang/isArray":110,"../object/keysIn":120,"../support":122,"./isIndex":101,"./isLength":103}],108:[function(require,module,exports){ |
|
var isObject = require('../lang/isObject'); |
|
|
|
/** |
|
* Converts `value` to an object if it is not one. |
|
* |
|
* @private |
|
* @param {*} value The value to process. |
|
* @returns {Object} Returns the object. |
|
*/ |
|
function toObject(value) { |
|
return isObject(value) ? value : Object(value); |
|
} |
|
|
|
module.exports = toObject; |
|
|
|
},{"../lang/isObject":114}],109:[function(require,module,exports){ |
|
var isLength = require('../internal/isLength'), |
|
isObjectLike = require('../internal/isObjectLike'); |
|
|
|
/** `Object#toString` result references. */ |
|
var argsTag = '[object Arguments]'; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/** |
|
* Checks if `value` is classified as an `arguments` object. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
|
* @example |
|
* |
|
* _.isArguments(function() { return arguments; }()); |
|
* // => true |
|
* |
|
* _.isArguments([1, 2, 3]); |
|
* // => false |
|
*/ |
|
function isArguments(value) { |
|
var length = isObjectLike(value) ? value.length : undefined; |
|
return (isLength(length) && objToString.call(value) == argsTag) || false; |
|
} |
|
|
|
module.exports = isArguments; |
|
|
|
},{"../internal/isLength":103,"../internal/isObjectLike":104}],110:[function(require,module,exports){ |
|
var isLength = require('../internal/isLength'), |
|
isNative = require('./isNative'), |
|
isObjectLike = require('../internal/isObjectLike'); |
|
|
|
/** `Object#toString` result references. */ |
|
var arrayTag = '[object Array]'; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/* Native method references for those with the same name as other `lodash` methods. */ |
|
var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray; |
|
|
|
/** |
|
* Checks if `value` is classified as an `Array` object. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
|
* @example |
|
* |
|
* _.isArray([1, 2, 3]); |
|
* // => true |
|
* |
|
* _.isArray(function() { return arguments; }()); |
|
* // => false |
|
*/ |
|
var isArray = nativeIsArray || function(value) { |
|
return (isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag) || false; |
|
}; |
|
|
|
module.exports = isArray; |
|
|
|
},{"../internal/isLength":103,"../internal/isObjectLike":104,"./isNative":113}],111:[function(require,module,exports){ |
|
var isArguments = require('./isArguments'), |
|
isArray = require('./isArray'), |
|
isFunction = require('./isFunction'), |
|
isLength = require('../internal/isLength'), |
|
isObjectLike = require('../internal/isObjectLike'), |
|
isString = require('./isString'), |
|
keys = require('../object/keys'); |
|
|
|
/** |
|
* Checks if `value` is empty. A value is considered empty unless it is an |
|
* `arguments` object, array, string, or jQuery-like collection with a length |
|
* greater than `0` or an object with own enumerable properties. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {Array|Object|string} value The value to inspect. |
|
* @returns {boolean} Returns `true` if `value` is empty, else `false`. |
|
* @example |
|
* |
|
* _.isEmpty(null); |
|
* // => true |
|
* |
|
* _.isEmpty(true); |
|
* // => true |
|
* |
|
* _.isEmpty(1); |
|
* // => true |
|
* |
|
* _.isEmpty([1, 2, 3]); |
|
* // => false |
|
* |
|
* _.isEmpty({ 'a': 1 }); |
|
* // => false |
|
*/ |
|
function isEmpty(value) { |
|
if (value == null) { |
|
return true; |
|
} |
|
var length = value.length; |
|
if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) || |
|
(isObjectLike(value) && isFunction(value.splice)))) { |
|
return !length; |
|
} |
|
return !keys(value).length; |
|
} |
|
|
|
module.exports = isEmpty; |
|
|
|
},{"../internal/isLength":103,"../internal/isObjectLike":104,"../object/keys":119,"./isArguments":109,"./isArray":110,"./isFunction":112,"./isString":115}],112:[function(require,module,exports){ |
|
(function (global){ |
|
var baseIsFunction = require('../internal/baseIsFunction'), |
|
isNative = require('./isNative'); |
|
|
|
/** `Object#toString` result references. */ |
|
var funcTag = '[object Function]'; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/** Native method references. */ |
|
var Uint8Array = isNative(Uint8Array = global.Uint8Array) && Uint8Array; |
|
|
|
/** |
|
* Checks if `value` is classified as a `Function` object. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
|
* @example |
|
* |
|
* _.isFunction(_); |
|
* // => true |
|
* |
|
* _.isFunction(/abc/); |
|
* // => false |
|
*/ |
|
var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) { |
|
// The use of `Object#toString` avoids issues with the `typeof` operator |
|
// in older versions of Chrome and Safari which return 'function' for regexes |
|
// and Safari 8 equivalents which return 'object' for typed array constructors. |
|
return objToString.call(value) == funcTag; |
|
}; |
|
|
|
module.exports = isFunction; |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"../internal/baseIsFunction":88,"./isNative":113}],113:[function(require,module,exports){ |
|
var escapeRegExp = require('../string/escapeRegExp'), |
|
isObjectLike = require('../internal/isObjectLike'); |
|
|
|
/** `Object#toString` result references. */ |
|
var funcTag = '[object Function]'; |
|
|
|
/** Used to detect host constructors (Safari > 5). */ |
|
var reHostCtor = /^\[object .+?Constructor\]$/; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to resolve the decompiled source of functions. */ |
|
var fnToString = Function.prototype.toString; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/** Used to detect if a method is native. */ |
|
var reNative = RegExp('^' + |
|
escapeRegExp(objToString) |
|
.replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' |
|
); |
|
|
|
/** |
|
* Checks if `value` is a native function. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is a native function, else `false`. |
|
* @example |
|
* |
|
* _.isNative(Array.prototype.push); |
|
* // => true |
|
* |
|
* _.isNative(_); |
|
* // => false |
|
*/ |
|
function isNative(value) { |
|
if (value == null) { |
|
return false; |
|
} |
|
if (objToString.call(value) == funcTag) { |
|
return reNative.test(fnToString.call(value)); |
|
} |
|
return (isObjectLike(value) && reHostCtor.test(value)) || false; |
|
} |
|
|
|
module.exports = isNative; |
|
|
|
},{"../internal/isObjectLike":104,"../string/escapeRegExp":121}],114:[function(require,module,exports){ |
|
/** |
|
* Checks if `value` is the language type of `Object`. |
|
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) |
|
* |
|
* **Note:** See the [ES5 spec](https://es5.github.io/#x8) for more details. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`. |
|
* @example |
|
* |
|
* _.isObject({}); |
|
* // => true |
|
* |
|
* _.isObject([1, 2, 3]); |
|
* // => true |
|
* |
|
* _.isObject(1); |
|
* // => false |
|
*/ |
|
function isObject(value) { |
|
// Avoid a V8 JIT bug in Chrome 19-20. |
|
// See https://code.google.com/p/v8/issues/detail?id=2291 for more details. |
|
var type = typeof value; |
|
return type == 'function' || (value && type == 'object') || false; |
|
} |
|
|
|
module.exports = isObject; |
|
|
|
},{}],115:[function(require,module,exports){ |
|
var isObjectLike = require('../internal/isObjectLike'); |
|
|
|
/** `Object#toString` result references. */ |
|
var stringTag = '[object String]'; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/** |
|
* Checks if `value` is classified as a `String` primitive or object. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
|
* @example |
|
* |
|
* _.isString('abc'); |
|
* // => true |
|
* |
|
* _.isString(1); |
|
* // => false |
|
*/ |
|
function isString(value) { |
|
return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag) || false; |
|
} |
|
|
|
module.exports = isString; |
|
|
|
},{"../internal/isObjectLike":104}],116:[function(require,module,exports){ |
|
var isLength = require('../internal/isLength'), |
|
isObjectLike = require('../internal/isObjectLike'); |
|
|
|
/** `Object#toString` result references. */ |
|
var argsTag = '[object Arguments]', |
|
arrayTag = '[object Array]', |
|
boolTag = '[object Boolean]', |
|
dateTag = '[object Date]', |
|
errorTag = '[object Error]', |
|
funcTag = '[object Function]', |
|
mapTag = '[object Map]', |
|
numberTag = '[object Number]', |
|
objectTag = '[object Object]', |
|
regexpTag = '[object RegExp]', |
|
setTag = '[object Set]', |
|
stringTag = '[object String]', |
|
weakMapTag = '[object WeakMap]'; |
|
|
|
var arrayBufferTag = '[object ArrayBuffer]', |
|
float32Tag = '[object Float32Array]', |
|
float64Tag = '[object Float64Array]', |
|
int8Tag = '[object Int8Array]', |
|
int16Tag = '[object Int16Array]', |
|
int32Tag = '[object Int32Array]', |
|
uint8Tag = '[object Uint8Array]', |
|
uint8ClampedTag = '[object Uint8ClampedArray]', |
|
uint16Tag = '[object Uint16Array]', |
|
uint32Tag = '[object Uint32Array]'; |
|
|
|
/** Used to identify `toStringTag` values of typed arrays. */ |
|
var typedArrayTags = {}; |
|
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = |
|
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = |
|
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = |
|
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = |
|
typedArrayTags[uint32Tag] = true; |
|
typedArrayTags[argsTag] = typedArrayTags[arrayTag] = |
|
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = |
|
typedArrayTags[dateTag] = typedArrayTags[errorTag] = |
|
typedArrayTags[funcTag] = typedArrayTags[mapTag] = |
|
typedArrayTags[numberTag] = typedArrayTags[objectTag] = |
|
typedArrayTags[regexpTag] = typedArrayTags[setTag] = |
|
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** |
|
* Used to resolve the `toStringTag` of values. |
|
* See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) |
|
* for more details. |
|
*/ |
|
var objToString = objectProto.toString; |
|
|
|
/** |
|
* Checks if `value` is classified as a typed array. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Lang |
|
* @param {*} value The value to check. |
|
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. |
|
* @example |
|
* |
|
* _.isTypedArray(new Uint8Array); |
|
* // => true |
|
* |
|
* _.isTypedArray([]); |
|
* // => false |
|
*/ |
|
function isTypedArray(value) { |
|
return (isObjectLike(value) && isLength(value.length) && typedArrayTags[objToString.call(value)]) || false; |
|
} |
|
|
|
module.exports = isTypedArray; |
|
|
|
},{"../internal/isLength":103,"../internal/isObjectLike":104}],117:[function(require,module,exports){ |
|
var baseAssign = require('../internal/baseAssign'), |
|
createAssigner = require('../internal/createAssigner'); |
|
|
|
/** |
|
* Assigns own enumerable properties of source object(s) to the destination |
|
* object. Subsequent sources overwrite property assignments of previous sources. |
|
* If `customizer` is provided it is invoked to produce the assigned values. |
|
* The `customizer` is bound to `thisArg` and invoked with five arguments; |
|
* (objectValue, sourceValue, key, object, source). |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @alias extend |
|
* @category Object |
|
* @param {Object} object The destination object. |
|
* @param {...Object} [sources] The source objects. |
|
* @param {Function} [customizer] The function to customize assigning values. |
|
* @param {*} [thisArg] The `this` binding of `customizer`. |
|
* @returns {Object} Returns `object`. |
|
* @example |
|
* |
|
* _.assign({ 'user': 'barney' }, { 'age': 40 }, { 'user': 'fred' }); |
|
* // => { 'user': 'fred', 'age': 40 } |
|
* |
|
* // using a customizer callback |
|
* var defaults = _.partialRight(_.assign, function(value, other) { |
|
* return typeof value == 'undefined' ? other : value; |
|
* }); |
|
* |
|
* defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); |
|
* // => { 'user': 'barney', 'age': 36 } |
|
*/ |
|
var assign = createAssigner(baseAssign); |
|
|
|
module.exports = assign; |
|
|
|
},{"../internal/baseAssign":78,"../internal/createAssigner":96}],118:[function(require,module,exports){ |
|
var baseCopy = require('../internal/baseCopy'), |
|
baseCreate = require('../internal/baseCreate'), |
|
isIterateeCall = require('../internal/isIterateeCall'), |
|
keys = require('./keys'); |
|
|
|
/** |
|
* Creates an object that inherits from the given `prototype` object. If a |
|
* `properties` object is provided its own enumerable properties are assigned |
|
* to the created object. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Object |
|
* @param {Object} prototype The object to inherit from. |
|
* @param {Object} [properties] The properties to assign to the object. |
|
* @param- {Object} [guard] Enables use as a callback for functions like `_.map`. |
|
* @returns {Object} Returns the new object. |
|
* @example |
|
* |
|
* function Shape() { |
|
* this.x = 0; |
|
* this.y = 0; |
|
* } |
|
* |
|
* function Circle() { |
|
* Shape.call(this); |
|
* } |
|
* |
|
* Circle.prototype = _.create(Shape.prototype, { |
|
* 'constructor': Circle |
|
* }); |
|
* |
|
* var circle = new Circle; |
|
* circle instanceof Circle; |
|
* // => true |
|
* |
|
* circle instanceof Shape; |
|
* // => true |
|
*/ |
|
function create(prototype, properties, guard) { |
|
var result = baseCreate(prototype); |
|
if (guard && isIterateeCall(prototype, properties, guard)) { |
|
properties = null; |
|
} |
|
return properties ? baseCopy(properties, result, keys(properties)) : result; |
|
} |
|
|
|
module.exports = create; |
|
|
|
},{"../internal/baseCopy":80,"../internal/baseCreate":81,"../internal/isIterateeCall":102,"./keys":119}],119:[function(require,module,exports){ |
|
var isLength = require('../internal/isLength'), |
|
isNative = require('../lang/isNative'), |
|
isObject = require('../lang/isObject'), |
|
shimKeys = require('../internal/shimKeys'); |
|
|
|
/* Native method references for those with the same name as other `lodash` methods. */ |
|
var nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys; |
|
|
|
/** |
|
* Creates an array of the own enumerable property names of `object`. |
|
* |
|
* **Note:** Non-object values are coerced to objects. See the |
|
* [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys) |
|
* for more details. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Object |
|
* @param {Object} object The object to inspect. |
|
* @returns {Array} Returns the array of property names. |
|
* @example |
|
* |
|
* function Foo() { |
|
* this.a = 1; |
|
* this.b = 2; |
|
* } |
|
* |
|
* Foo.prototype.c = 3; |
|
* |
|
* _.keys(new Foo); |
|
* // => ['a', 'b'] (iteration order is not guaranteed) |
|
* |
|
* _.keys('hi'); |
|
* // => ['0', '1'] |
|
*/ |
|
var keys = !nativeKeys ? shimKeys : function(object) { |
|
if (object) { |
|
var Ctor = object.constructor, |
|
length = object.length; |
|
} |
|
if ((typeof Ctor == 'function' && Ctor.prototype === object) || |
|
(typeof object != 'function' && (length && isLength(length)))) { |
|
return shimKeys(object); |
|
} |
|
return isObject(object) ? nativeKeys(object) : []; |
|
}; |
|
|
|
module.exports = keys; |
|
|
|
},{"../internal/isLength":103,"../internal/shimKeys":107,"../lang/isNative":113,"../lang/isObject":114}],120:[function(require,module,exports){ |
|
var isArguments = require('../lang/isArguments'), |
|
isArray = require('../lang/isArray'), |
|
isIndex = require('../internal/isIndex'), |
|
isLength = require('../internal/isLength'), |
|
isObject = require('../lang/isObject'), |
|
support = require('../support'); |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to check objects for own properties. */ |
|
var hasOwnProperty = objectProto.hasOwnProperty; |
|
|
|
/** |
|
* Creates an array of the own and inherited enumerable property names of `object`. |
|
* |
|
* **Note:** Non-object values are coerced to objects. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Object |
|
* @param {Object} object The object to inspect. |
|
* @returns {Array} Returns the array of property names. |
|
* @example |
|
* |
|
* function Foo() { |
|
* this.a = 1; |
|
* this.b = 2; |
|
* } |
|
* |
|
* Foo.prototype.c = 3; |
|
* |
|
* _.keysIn(new Foo); |
|
* // => ['a', 'b', 'c'] (iteration order is not guaranteed) |
|
*/ |
|
function keysIn(object) { |
|
if (object == null) { |
|
return []; |
|
} |
|
if (!isObject(object)) { |
|
object = Object(object); |
|
} |
|
var length = object.length; |
|
length = (length && isLength(length) && |
|
(isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0; |
|
|
|
var Ctor = object.constructor, |
|
index = -1, |
|
isProto = typeof Ctor == 'function' && Ctor.prototype === object, |
|
result = Array(length), |
|
skipIndexes = length > 0; |
|
|
|
while (++index < length) { |
|
result[index] = (index + ''); |
|
} |
|
for (var key in object) { |
|
if (!(skipIndexes && isIndex(key, length)) && |
|
!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { |
|
result.push(key); |
|
} |
|
} |
|
return result; |
|
} |
|
|
|
module.exports = keysIn; |
|
|
|
},{"../internal/isIndex":101,"../internal/isLength":103,"../lang/isArguments":109,"../lang/isArray":110,"../lang/isObject":114,"../support":122}],121:[function(require,module,exports){ |
|
var baseToString = require('../internal/baseToString'); |
|
|
|
/** |
|
* Used to match `RegExp` special characters. |
|
* See this [article on `RegExp` characters](http://www.regular-expressions.info/characters.html#special) |
|
* for more details. |
|
*/ |
|
var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g, |
|
reHasRegExpChars = RegExp(reRegExpChars.source); |
|
|
|
/** |
|
* Escapes the `RegExp` special characters "\", "^", "$", ".", "|", "?", "*", |
|
* "+", "(", ")", "[", "]", "{" and "}" in `string`. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category String |
|
* @param {string} [string=''] The string to escape. |
|
* @returns {string} Returns the escaped string. |
|
* @example |
|
* |
|
* _.escapeRegExp('[lodash](https://lodash.com/)'); |
|
* // => '\[lodash\]\(https://lodash\.com/\)' |
|
*/ |
|
function escapeRegExp(string) { |
|
string = baseToString(string); |
|
return (string && reHasRegExpChars.test(string)) |
|
? string.replace(reRegExpChars, '\\$&') |
|
: string; |
|
} |
|
|
|
module.exports = escapeRegExp; |
|
|
|
},{"../internal/baseToString":94}],122:[function(require,module,exports){ |
|
(function (global){ |
|
var isNative = require('./lang/isNative'); |
|
|
|
/** Used to detect functions containing a `this` reference. */ |
|
var reThis = /\bthis\b/; |
|
|
|
/** Used for native method references. */ |
|
var objectProto = Object.prototype; |
|
|
|
/** Used to detect DOM support. */ |
|
var document = (document = global.window) && document.document; |
|
|
|
/** Native method references. */ |
|
var propertyIsEnumerable = objectProto.propertyIsEnumerable; |
|
|
|
/** |
|
* An object environment feature flags. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @type Object |
|
*/ |
|
var support = {}; |
|
|
|
(function(x) { |
|
|
|
/** |
|
* Detect if functions can be decompiled by `Function#toString` |
|
* (all but Firefox OS certified apps, older Opera mobile browsers, and |
|
* the PlayStation 3; forced `false` for Windows 8 apps). |
|
* |
|
* @memberOf _.support |
|
* @type boolean |
|
*/ |
|
support.funcDecomp = !isNative(global.WinRTError) && reThis.test(function() { return this; }); |
|
|
|
/** |
|
* Detect if `Function#name` is supported (all but IE). |
|
* |
|
* @memberOf _.support |
|
* @type boolean |
|
*/ |
|
support.funcNames = typeof Function.name == 'string'; |
|
|
|
/** |
|
* Detect if the DOM is supported. |
|
* |
|
* @memberOf _.support |
|
* @type boolean |
|
*/ |
|
try { |
|
support.dom = document.createDocumentFragment().nodeType === 11; |
|
} catch(e) { |
|
support.dom = false; |
|
} |
|
|
|
/** |
|
* Detect if `arguments` object indexes are non-enumerable. |
|
* |
|
* In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object |
|
* indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat |
|
* `arguments` object indexes as non-enumerable and fail `hasOwnProperty` |
|
* checks for indexes that exceed their function's formal parameters with |
|
* associated values of `0`. |
|
* |
|
* @memberOf _.support |
|
* @type boolean |
|
*/ |
|
try { |
|
support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1); |
|
} catch(e) { |
|
support.nonEnumArgs = true; |
|
} |
|
}(0, 0)); |
|
|
|
module.exports = support; |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"./lang/isNative":113}],123:[function(require,module,exports){ |
|
/** |
|
* This method returns the first argument provided to it. |
|
* |
|
* @static |
|
* @memberOf _ |
|
* @category Utility |
|
* @param {*} value Any value. |
|
* @returns {*} Returns `value`. |
|
* @example |
|
* |
|
* var object = { 'user': 'fred' }; |
|
* |
|
* _.identity(object) === object; |
|
* // => true |
|
*/ |
|
function identity(value) { |
|
return value; |
|
} |
|
|
|
module.exports = identity; |
|
|
|
},{}],124:[function(require,module,exports){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
'use strict'; |
|
|
|
// If obj.hasOwnProperty has been overridden, then calling |
|
// obj.hasOwnProperty(prop) will break. |
|
// See: https://github.com/joyent/node/issues/1707 |
|
function hasOwnProperty(obj, prop) { |
|
return Object.prototype.hasOwnProperty.call(obj, prop); |
|
} |
|
|
|
module.exports = function(qs, sep, eq, options) { |
|
sep = sep || '&'; |
|
eq = eq || '='; |
|
var obj = {}; |
|
|
|
if (typeof qs !== 'string' || qs.length === 0) { |
|
return obj; |
|
} |
|
|
|
var regexp = /\+/g; |
|
qs = qs.split(sep); |
|
|
|
var maxKeys = 1000; |
|
if (options && typeof options.maxKeys === 'number') { |
|
maxKeys = options.maxKeys; |
|
} |
|
|
|
var len = qs.length; |
|
// maxKeys <= 0 means that we should not limit keys count |
|
if (maxKeys > 0 && len > maxKeys) { |
|
len = maxKeys; |
|
} |
|
|
|
for (var i = 0; i < len; ++i) { |
|
var x = qs[i].replace(regexp, '%20'), |
|
idx = x.indexOf(eq), |
|
kstr, vstr, k, v; |
|
|
|
if (idx >= 0) { |
|
kstr = x.substr(0, idx); |
|
vstr = x.substr(idx + 1); |
|
} else { |
|
kstr = x; |
|
vstr = ''; |
|
} |
|
|
|
k = decodeURIComponent(kstr); |
|
v = decodeURIComponent(vstr); |
|
|
|
if (!hasOwnProperty(obj, k)) { |
|
obj[k] = v; |
|
} else if (Array.isArray(obj[k])) { |
|
obj[k].push(v); |
|
} else { |
|
obj[k] = [obj[k], v]; |
|
} |
|
} |
|
|
|
return obj; |
|
}; |
|
|
|
},{}],125:[function(require,module,exports){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
'use strict'; |
|
|
|
var stringifyPrimitive = function(v) { |
|
switch (typeof v) { |
|
case 'string': |
|
return v; |
|
|
|
case 'boolean': |
|
return v ? 'true' : 'false'; |
|
|
|
case 'number': |
|
return isFinite(v) ? v : ''; |
|
|
|
default: |
|
return ''; |
|
} |
|
}; |
|
|
|
module.exports = function(obj, sep, eq, name) { |
|
sep = sep || '&'; |
|
eq = eq || '='; |
|
if (obj === null) { |
|
obj = undefined; |
|
} |
|
|
|
if (typeof obj === 'object') { |
|
return Object.keys(obj).map(function(k) { |
|
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; |
|
if (Array.isArray(obj[k])) { |
|
return obj[k].map(function(v) { |
|
return ks + encodeURIComponent(stringifyPrimitive(v)); |
|
}).join(sep); |
|
} else { |
|
return ks + encodeURIComponent(stringifyPrimitive(obj[k])); |
|
} |
|
}).join(sep); |
|
|
|
} |
|
|
|
if (!name) return ''; |
|
return encodeURIComponent(stringifyPrimitive(name)) + eq + |
|
encodeURIComponent(stringifyPrimitive(obj)); |
|
}; |
|
|
|
},{}],126:[function(require,module,exports){ |
|
'use strict'; |
|
|
|
exports.decode = exports.parse = require('./decode'); |
|
exports.encode = exports.stringify = require('./encode'); |
|
|
|
},{"./decode":124,"./encode":125}],127:[function(require,module,exports){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
var punycode = require('punycode'); |
|
|
|
exports.parse = urlParse; |
|
exports.resolve = urlResolve; |
|
exports.resolveObject = urlResolveObject; |
|
exports.format = urlFormat; |
|
|
|
exports.Url = Url; |
|
|
|
function Url() { |
|
this.protocol = null; |
|
this.slashes = null; |
|
this.auth = null; |
|
this.host = null; |
|
this.port = null; |
|
this.hostname = null; |
|
this.hash = null; |
|
this.search = null; |
|
this.query = null; |
|
this.pathname = null; |
|
this.path = null; |
|
this.href = null; |
|
} |
|
|
|
// Reference: RFC 3986, RFC 1808, RFC 2396 |
|
|
|
// define these here so at least they only have to be |
|
// compiled once on the first module load. |
|
var protocolPattern = /^([a-z0-9.+-]+:)/i, |
|
portPattern = /:[0-9]*$/, |
|
|
|
// RFC 2396: characters reserved for delimiting URLs. |
|
// We actually just auto-escape these. |
|
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], |
|
|
|
// RFC 2396: characters not allowed for various reasons. |
|
unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), |
|
|
|
// Allowed by RFCs, but cause of XSS attacks. Always escape these. |
|
autoEscape = ['\''].concat(unwise), |
|
// Characters that are never ever allowed in a hostname. |
|
// Note that any invalid chars are also handled, but these |
|
// are the ones that are *expected* to be seen, so we fast-path |
|
// them. |
|
nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), |
|
hostEndingChars = ['/', '?', '#'], |
|
hostnameMaxLen = 255, |
|
hostnamePartPattern = /^[a-z0-9A-Z_-]{0,63}$/, |
|
hostnamePartStart = /^([a-z0-9A-Z_-]{0,63})(.*)$/, |
|
// protocols that can allow "unsafe" and "unwise" chars. |
|
unsafeProtocol = { |
|
'javascript': true, |
|
'javascript:': true |
|
}, |
|
// protocols that never have a hostname. |
|
hostlessProtocol = { |
|
'javascript': true, |
|
'javascript:': true |
|
}, |
|
// protocols that always contain a // bit. |
|
slashedProtocol = { |
|
'http': true, |
|
'https': true, |
|
'ftp': true, |
|
'gopher': true, |
|
'file': true, |
|
'http:': true, |
|
'https:': true, |
|
'ftp:': true, |
|
'gopher:': true, |
|
'file:': true |
|
}, |
|
querystring = require('querystring'); |
|
|
|
function urlParse(url, parseQueryString, slashesDenoteHost) { |
|
if (url && isObject(url) && url instanceof Url) return url; |
|
|
|
var u = new Url; |
|
u.parse(url, parseQueryString, slashesDenoteHost); |
|
return u; |
|
} |
|
|
|
Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { |
|
if (!isString(url)) { |
|
throw new TypeError("Parameter 'url' must be a string, not " + typeof url); |
|
} |
|
|
|
var rest = url; |
|
|
|
// trim before proceeding. |
|
// This is to support parse stuff like " http://foo.com \n" |
|
rest = rest.trim(); |
|
|
|
var proto = protocolPattern.exec(rest); |
|
if (proto) { |
|
proto = proto[0]; |
|
var lowerProto = proto.toLowerCase(); |
|
this.protocol = lowerProto; |
|
rest = rest.substr(proto.length); |
|
} |
|
|
|
// figure out if it's got a host |
|
// user@server is *always* interpreted as a hostname, and url |
|
// resolution will treat //foo/bar as host=foo,path=bar because that's |
|
// how the browser resolves relative URLs. |
|
if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { |
|
var slashes = rest.substr(0, 2) === '//'; |
|
if (slashes && !(proto && hostlessProtocol[proto])) { |
|
rest = rest.substr(2); |
|
this.slashes = true; |
|
} |
|
} |
|
|
|
if (!hostlessProtocol[proto] && |
|
(slashes || (proto && !slashedProtocol[proto]))) { |
|
|
|
// there's a hostname. |
|
// the first instance of /, ?, ;, or # ends the host. |
|
// |
|
// If there is an @ in the hostname, then non-host chars *are* allowed |
|
// to the left of the last @ sign, unless some host-ending character |
|
// comes *before* the @-sign. |
|
// URLs are obnoxious. |
|
// |
|
// ex: |
|
// http://a@b@c/ => user:a@b host:c |
|
// http://a@b?@c => user:a host:c path:/?@c |
|
|
|
// v0.12 TODO(isaacs): This is not quite how Chrome does things. |
|
// Review our test case against browsers more comprehensively. |
|
|
|
// find the first instance of any hostEndingChars |
|
var hostEnd = -1; |
|
for (var i = 0; i < hostEndingChars.length; i++) { |
|
var hec = rest.indexOf(hostEndingChars[i]); |
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) |
|
hostEnd = hec; |
|
} |
|
|
|
// at this point, either we have an explicit point where the |
|
// auth portion cannot go past, or the last @ char is the decider. |
|
var auth, atSign; |
|
if (hostEnd === -1) { |
|
// atSign can be anywhere. |
|
atSign = rest.lastIndexOf('@'); |
|
} else { |
|
// atSign must be in auth portion. |
|
// http://a@b/c@d => host:b auth:a path:/c@d |
|
atSign = rest.lastIndexOf('@', hostEnd); |
|
} |
|
|
|
// Now we have a portion which is definitely the auth. |
|
// Pull that off. |
|
if (atSign !== -1) { |
|
auth = rest.slice(0, atSign); |
|
rest = rest.slice(atSign + 1); |
|
this.auth = decodeURIComponent(auth); |
|
} |
|
|
|
// the host is the remaining to the left of the first non-host char |
|
hostEnd = -1; |
|
for (var i = 0; i < nonHostChars.length; i++) { |
|
var hec = rest.indexOf(nonHostChars[i]); |
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) |
|
hostEnd = hec; |
|
} |
|
// if we still have not hit it, then the entire thing is a host. |
|
if (hostEnd === -1) |
|
hostEnd = rest.length; |
|
|
|
this.host = rest.slice(0, hostEnd); |
|
rest = rest.slice(hostEnd); |
|
|
|
// pull out port. |
|
this.parseHost(); |
|
|
|
// we've indicated that there is a hostname, |
|
// so even if it's empty, it has to be present. |
|
this.hostname = this.hostname || ''; |
|
|
|
// if hostname begins with [ and ends with ] |
|
// assume that it's an IPv6 address. |
|
var ipv6Hostname = this.hostname[0] === '[' && |
|
this.hostname[this.hostname.length - 1] === ']'; |
|
|
|
// validate a little. |
|
if (!ipv6Hostname) { |
|
var hostparts = this.hostname.split(/\./); |
|
for (var i = 0, l = hostparts.length; i < l; i++) { |
|
var part = hostparts[i]; |
|
if (!part) continue; |
|
if (!part.match(hostnamePartPattern)) { |
|
var newpart = ''; |
|
for (var j = 0, k = part.length; j < k; j++) { |
|
if (part.charCodeAt(j) > 127) { |
|
// we replace non-ASCII char with a temporary placeholder |
|
// we need this to make sure size of hostname is not |
|
// broken by replacing non-ASCII by nothing |
|
newpart += 'x'; |
|
} else { |
|
newpart += part[j]; |
|
} |
|
} |
|
// we test again with ASCII char only |
|
if (!newpart.match(hostnamePartPattern)) { |
|
var validParts = hostparts.slice(0, i); |
|
var notHost = hostparts.slice(i + 1); |
|
var bit = part.match(hostnamePartStart); |
|
if (bit) { |
|
validParts.push(bit[1]); |
|
notHost.unshift(bit[2]); |
|
} |
|
if (notHost.length) { |
|
rest = '/' + notHost.join('.') + rest; |
|
} |
|
this.hostname = validParts.join('.'); |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (this.hostname.length > hostnameMaxLen) { |
|
this.hostname = ''; |
|
} else { |
|
// hostnames are always lower case. |
|
this.hostname = this.hostname.toLowerCase(); |
|
} |
|
|
|
if (!ipv6Hostname) { |
|
// IDNA Support: Returns a puny coded representation of "domain". |
|
// It only converts the part of the domain name that |
|
// has non ASCII characters. I.e. it dosent matter if |
|
// you call it with a domain that already is in ASCII. |
|
var domainArray = this.hostname.split('.'); |
|
var newOut = []; |
|
for (var i = 0; i < domainArray.length; ++i) { |
|
var s = domainArray[i]; |
|
newOut.push(s.match(/[^A-Za-z0-9_-]/) ? |
|
'xn--' + punycode.encode(s) : s); |
|
} |
|
this.hostname = newOut.join('.'); |
|
} |
|
|
|
var p = this.port ? ':' + this.port : ''; |
|
var h = this.hostname || ''; |
|
this.host = h + p; |
|
this.href += this.host; |
|
|
|
// strip [ and ] from the hostname |
|
// the host field still retains them, though |
|
if (ipv6Hostname) { |
|
this.hostname = this.hostname.substr(1, this.hostname.length - 2); |
|
if (rest[0] !== '/') { |
|
rest = '/' + rest; |
|
} |
|
} |
|
} |
|
|
|
// now rest is set to the post-host stuff. |
|
// chop off any delim chars. |
|
if (!unsafeProtocol[lowerProto]) { |
|
|
|
// First, make 100% sure that any "autoEscape" chars get |
|
// escaped, even if encodeURIComponent doesn't think they |
|
// need to be. |
|
for (var i = 0, l = autoEscape.length; i < l; i++) { |
|
var ae = autoEscape[i]; |
|
var esc = encodeURIComponent(ae); |
|
if (esc === ae) { |
|
esc = escape(ae); |
|
} |
|
rest = rest.split(ae).join(esc); |
|
} |
|
} |
|
|
|
|
|
// chop off from the tail first. |
|
var hash = rest.indexOf('#'); |
|
if (hash !== -1) { |
|
// got a fragment string. |
|
this.hash = rest.substr(hash); |
|
rest = rest.slice(0, hash); |
|
} |
|
var qm = rest.indexOf('?'); |
|
if (qm !== -1) { |
|
this.search = rest.substr(qm); |
|
this.query = rest.substr(qm + 1); |
|
if (parseQueryString) { |
|
this.query = querystring.parse(this.query); |
|
} |
|
rest = rest.slice(0, qm); |
|
} else if (parseQueryString) { |
|
// no query string, but parseQueryString still requested |
|
this.search = ''; |
|
this.query = {}; |
|
} |
|
if (rest) this.pathname = rest; |
|
if (slashedProtocol[lowerProto] && |
|
this.hostname && !this.pathname) { |
|
this.pathname = '/'; |
|
} |
|
|
|
//to support http.request |
|
if (this.pathname || this.search) { |
|
var p = this.pathname || ''; |
|
var s = this.search || ''; |
|
this.path = p + s; |
|
} |
|
|
|
// finally, reconstruct the href based on what has been validated. |
|
this.href = this.format(); |
|
return this; |
|
}; |
|
|
|
// format a parsed object into a url string |
|
function urlFormat(obj) { |
|
// ensure it's an object, and not a string url. |
|
// If it's an obj, this is a no-op. |
|
// this way, you can call url_format() on strings |
|
// to clean up potentially wonky urls. |
|
if (isString(obj)) obj = urlParse(obj); |
|
if (!(obj instanceof Url)) return Url.prototype.format.call(obj); |
|
return obj.format(); |
|
} |
|
|
|
Url.prototype.format = function() { |
|
var auth = this.auth || ''; |
|
if (auth) { |
|
auth = encodeURIComponent(auth); |
|
auth = auth.replace(/%3A/i, ':'); |
|
auth += '@'; |
|
} |
|
|
|
var protocol = this.protocol || '', |
|
pathname = this.pathname || '', |
|
hash = this.hash || '', |
|
host = false, |
|
query = ''; |
|
|
|
if (this.host) { |
|
host = auth + this.host; |
|
} else if (this.hostname) { |
|
host = auth + (this.hostname.indexOf(':') === -1 ? |
|
this.hostname : |
|
'[' + this.hostname + ']'); |
|
if (this.port) { |
|
host += ':' + this.port; |
|
} |
|
} |
|
|
|
if (this.query && |
|
isObject(this.query) && |
|
Object.keys(this.query).length) { |
|
query = querystring.stringify(this.query); |
|
} |
|
|
|
var search = this.search || (query && ('?' + query)) || ''; |
|
|
|
if (protocol && protocol.substr(-1) !== ':') protocol += ':'; |
|
|
|
// only the slashedProtocols get the //. Not mailto:, xmpp:, etc. |
|
// unless they had them to begin with. |
|
if (this.slashes || |
|
(!protocol || slashedProtocol[protocol]) && host !== false) { |
|
host = '//' + (host || ''); |
|
if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; |
|
} else if (!host) { |
|
host = ''; |
|
} |
|
|
|
if (hash && hash.charAt(0) !== '#') hash = '#' + hash; |
|
if (search && search.charAt(0) !== '?') search = '?' + search; |
|
|
|
pathname = pathname.replace(/[?#]/g, function(match) { |
|
return encodeURIComponent(match); |
|
}); |
|
search = search.replace('#', '%23'); |
|
|
|
return protocol + host + pathname + search + hash; |
|
}; |
|
|
|
function urlResolve(source, relative) { |
|
return urlParse(source, false, true).resolve(relative); |
|
} |
|
|
|
Url.prototype.resolve = function(relative) { |
|
return this.resolveObject(urlParse(relative, false, true)).format(); |
|
}; |
|
|
|
function urlResolveObject(source, relative) { |
|
if (!source) return relative; |
|
return urlParse(source, false, true).resolveObject(relative); |
|
} |
|
|
|
Url.prototype.resolveObject = function(relative) { |
|
if (isString(relative)) { |
|
var rel = new Url(); |
|
rel.parse(relative, false, true); |
|
relative = rel; |
|
} |
|
|
|
var result = new Url(); |
|
Object.keys(this).forEach(function(k) { |
|
result[k] = this[k]; |
|
}, this); |
|
|
|
// hash is always overridden, no matter what. |
|
// even href="" will remove it. |
|
result.hash = relative.hash; |
|
|
|
// if the relative url is empty, then there's nothing left to do here. |
|
if (relative.href === '') { |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
// hrefs like //foo/bar always cut to the protocol. |
|
if (relative.slashes && !relative.protocol) { |
|
// take everything except the protocol from relative |
|
Object.keys(relative).forEach(function(k) { |
|
if (k !== 'protocol') |
|
result[k] = relative[k]; |
|
}); |
|
|
|
//urlParse appends trailing / to urls like http://www.example.com |
|
if (slashedProtocol[result.protocol] && |
|
result.hostname && !result.pathname) { |
|
result.path = result.pathname = '/'; |
|
} |
|
|
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
if (relative.protocol && relative.protocol !== result.protocol) { |
|
// if it's a known url protocol, then changing |
|
// the protocol does weird things |
|
// first, if it's not file:, then we MUST have a host, |
|
// and if there was a path |
|
// to begin with, then we MUST have a path. |
|
// if it is file:, then the host is dropped, |
|
// because that's known to be hostless. |
|
// anything else is assumed to be absolute. |
|
if (!slashedProtocol[relative.protocol]) { |
|
Object.keys(relative).forEach(function(k) { |
|
result[k] = relative[k]; |
|
}); |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
result.protocol = relative.protocol; |
|
if (!relative.host && !hostlessProtocol[relative.protocol]) { |
|
var relPath = (relative.pathname || '').split('/'); |
|
while (relPath.length && !(relative.host = relPath.shift())); |
|
if (!relative.host) relative.host = ''; |
|
if (!relative.hostname) relative.hostname = ''; |
|
if (relPath[0] !== '') relPath.unshift(''); |
|
if (relPath.length < 2) relPath.unshift(''); |
|
result.pathname = relPath.join('/'); |
|
} else { |
|
result.pathname = relative.pathname; |
|
} |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
result.host = relative.host || ''; |
|
result.auth = relative.auth; |
|
result.hostname = relative.hostname || relative.host; |
|
result.port = relative.port; |
|
// to support http.request |
|
if (result.pathname || result.search) { |
|
var p = result.pathname || ''; |
|
var s = result.search || ''; |
|
result.path = p + s; |
|
} |
|
result.slashes = result.slashes || relative.slashes; |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), |
|
isRelAbs = ( |
|
relative.host || |
|
relative.pathname && relative.pathname.charAt(0) === '/' |
|
), |
|
mustEndAbs = (isRelAbs || isSourceAbs || |
|
(result.host && relative.pathname)), |
|
removeAllDots = mustEndAbs, |
|
srcPath = result.pathname && result.pathname.split('/') || [], |
|
relPath = relative.pathname && relative.pathname.split('/') || [], |
|
psychotic = result.protocol && !slashedProtocol[result.protocol]; |
|
|
|
// if the url is a non-slashed url, then relative |
|
// links like ../.. should be able |
|
// to crawl up to the hostname, as well. This is strange. |
|
// result.protocol has already been set by now. |
|
// Later on, put the first path part into the host field. |
|
if (psychotic) { |
|
result.hostname = ''; |
|
result.port = null; |
|
if (result.host) { |
|
if (srcPath[0] === '') srcPath[0] = result.host; |
|
else srcPath.unshift(result.host); |
|
} |
|
result.host = ''; |
|
if (relative.protocol) { |
|
relative.hostname = null; |
|
relative.port = null; |
|
if (relative.host) { |
|
if (relPath[0] === '') relPath[0] = relative.host; |
|
else relPath.unshift(relative.host); |
|
} |
|
relative.host = null; |
|
} |
|
mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); |
|
} |
|
|
|
if (isRelAbs) { |
|
// it's absolute. |
|
result.host = (relative.host || relative.host === '') ? |
|
relative.host : result.host; |
|
result.hostname = (relative.hostname || relative.hostname === '') ? |
|
relative.hostname : result.hostname; |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
srcPath = relPath; |
|
// fall through to the dot-handling below. |
|
} else if (relPath.length) { |
|
// it's relative |
|
// throw away the existing file, and take the new path instead. |
|
if (!srcPath) srcPath = []; |
|
srcPath.pop(); |
|
srcPath = srcPath.concat(relPath); |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
} else if (!isNullOrUndefined(relative.search)) { |
|
// just pull out the search. |
|
// like href='?foo'. |
|
// Put this after the other two cases because it simplifies the booleans |
|
if (psychotic) { |
|
result.hostname = result.host = srcPath.shift(); |
|
//occationaly the auth can get stuck only in host |
|
//this especialy happens in cases like |
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2') |
|
var authInHost = result.host && result.host.indexOf('@') > 0 ? |
|
result.host.split('@') : false; |
|
if (authInHost) { |
|
result.auth = authInHost.shift(); |
|
result.host = result.hostname = authInHost.shift(); |
|
} |
|
} |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
//to support http.request |
|
if (!isNull(result.pathname) || !isNull(result.search)) { |
|
result.path = (result.pathname ? result.pathname : '') + |
|
(result.search ? result.search : ''); |
|
} |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
if (!srcPath.length) { |
|
// no path at all. easy. |
|
// we've already handled the other stuff above. |
|
result.pathname = null; |
|
//to support http.request |
|
if (result.search) { |
|
result.path = '/' + result.search; |
|
} else { |
|
result.path = null; |
|
} |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
// if a url ENDs in . or .., then it must get a trailing slash. |
|
// however, if it ends in anything else non-slashy, |
|
// then it must NOT get a trailing slash. |
|
var last = srcPath.slice(-1)[0]; |
|
var hasTrailingSlash = ( |
|
(result.host || relative.host) && (last === '.' || last === '..') || |
|
last === ''); |
|
|
|
// strip single dots, resolve double dots to parent dir |
|
// if the path tries to go above the root, `up` ends up > 0 |
|
var up = 0; |
|
for (var i = srcPath.length; i >= 0; i--) { |
|
last = srcPath[i]; |
|
if (last == '.') { |
|
srcPath.splice(i, 1); |
|
} else if (last === '..') { |
|
srcPath.splice(i, 1); |
|
up++; |
|
} else if (up) { |
|
srcPath.splice(i, 1); |
|
up--; |
|
} |
|
} |
|
|
|
// if the path is allowed to go above the root, restore leading ..s |
|
if (!mustEndAbs && !removeAllDots) { |
|
for (; up--; up) { |
|
srcPath.unshift('..'); |
|
} |
|
} |
|
|
|
if (mustEndAbs && srcPath[0] !== '' && |
|
(!srcPath[0] || srcPath[0].charAt(0) !== '/')) { |
|
srcPath.unshift(''); |
|
} |
|
|
|
if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { |
|
srcPath.push(''); |
|
} |
|
|
|
var isAbsolute = srcPath[0] === '' || |
|
(srcPath[0] && srcPath[0].charAt(0) === '/'); |
|
|
|
// put the host back |
|
if (psychotic) { |
|
result.hostname = result.host = isAbsolute ? '' : |
|
srcPath.length ? srcPath.shift() : ''; |
|
//occationaly the auth can get stuck only in host |
|
//this especialy happens in cases like |
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2') |
|
var authInHost = result.host && result.host.indexOf('@') > 0 ? |
|
result.host.split('@') : false; |
|
if (authInHost) { |
|
result.auth = authInHost.shift(); |
|
result.host = result.hostname = authInHost.shift(); |
|
} |
|
} |
|
|
|
mustEndAbs = mustEndAbs || (result.host && srcPath.length); |
|
|
|
if (mustEndAbs && !isAbsolute) { |
|
srcPath.unshift(''); |
|
} |
|
|
|
if (!srcPath.length) { |
|
result.pathname = null; |
|
result.path = null; |
|
} else { |
|
result.pathname = srcPath.join('/'); |
|
} |
|
|
|
//to support request.http |
|
if (!isNull(result.pathname) || !isNull(result.search)) { |
|
result.path = (result.pathname ? result.pathname : '') + |
|
(result.search ? result.search : ''); |
|
} |
|
result.auth = relative.auth || result.auth; |
|
result.slashes = result.slashes || relative.slashes; |
|
result.href = result.format(); |
|
return result; |
|
}; |
|
|
|
Url.prototype.parseHost = function() { |
|
var host = this.host; |
|
var port = portPattern.exec(host); |
|
if (port) { |
|
port = port[0]; |
|
if (port !== ':') { |
|
this.port = port.substr(1); |
|
} |
|
host = host.substr(0, host.length - port.length); |
|
} |
|
if (host) this.hostname = host; |
|
}; |
|
|
|
function isString(arg) { |
|
return typeof arg === "string"; |
|
} |
|
|
|
function isObject(arg) { |
|
return typeof arg === 'object' && arg !== null; |
|
} |
|
|
|
function isNull(arg) { |
|
return arg === null; |
|
} |
|
function isNullOrUndefined(arg) { |
|
return arg == null; |
|
} |
|
|
|
},{"punycode":152,"querystring":155}],128:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLAttribute, create; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
module.exports = XMLAttribute = (function() { |
|
function XMLAttribute(parent, name, value) { |
|
this.stringify = parent.stringify; |
|
if (name == null) { |
|
throw new Error("Missing attribute name of element " + parent.name); |
|
} |
|
if (value == null) { |
|
throw new Error("Missing attribute value for attribute " + name + " of element " + parent.name); |
|
} |
|
this.name = this.stringify.attName(name); |
|
this.value = this.stringify.attValue(value); |
|
} |
|
|
|
XMLAttribute.prototype.clone = function() { |
|
return create(XMLAttribute.prototype, this); |
|
}; |
|
|
|
XMLAttribute.prototype.toString = function(options, level) { |
|
return ' ' + this.name + '="' + this.value + '"'; |
|
}; |
|
|
|
return XMLAttribute; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"lodash/object/create":118}],129:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier; |
|
|
|
XMLStringifier = require('./XMLStringifier'); |
|
|
|
XMLDeclaration = require('./XMLDeclaration'); |
|
|
|
XMLDocType = require('./XMLDocType'); |
|
|
|
XMLElement = require('./XMLElement'); |
|
|
|
module.exports = XMLBuilder = (function() { |
|
function XMLBuilder(name, options) { |
|
var root, temp; |
|
if (name == null) { |
|
throw new Error("Root element needs a name"); |
|
} |
|
if (options == null) { |
|
options = {}; |
|
} |
|
this.options = options; |
|
this.stringify = new XMLStringifier(options); |
|
temp = new XMLElement(this, 'doc'); |
|
root = temp.element(name); |
|
root.isRoot = true; |
|
root.documentObject = this; |
|
this.rootObject = root; |
|
if (!options.headless) { |
|
root.declaration(options); |
|
if ((options.pubID != null) || (options.sysID != null)) { |
|
root.doctype(options); |
|
} |
|
} |
|
} |
|
|
|
XMLBuilder.prototype.root = function() { |
|
return this.rootObject; |
|
}; |
|
|
|
XMLBuilder.prototype.end = function(options) { |
|
return this.toString(options); |
|
}; |
|
|
|
XMLBuilder.prototype.toString = function(options) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
r = ''; |
|
if (this.xmldec != null) { |
|
r += this.xmldec.toString(options); |
|
} |
|
if (this.doctype != null) { |
|
r += this.doctype.toString(options); |
|
} |
|
r += this.rootObject.toString(options); |
|
if (pretty && r.slice(-newline.length) === newline) { |
|
r = r.slice(0, -newline.length); |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLBuilder; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLDeclaration":136,"./XMLDocType":137,"./XMLElement":138,"./XMLStringifier":142}],130:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLCData, XMLNode, create, |
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
XMLNode = require('./XMLNode'); |
|
|
|
module.exports = XMLCData = (function(superClass) { |
|
extend(XMLCData, superClass); |
|
|
|
function XMLCData(parent, text) { |
|
XMLCData.__super__.constructor.call(this, parent); |
|
if (text == null) { |
|
throw new Error("Missing CDATA text"); |
|
} |
|
this.text = this.stringify.cdata(text); |
|
} |
|
|
|
XMLCData.prototype.clone = function() { |
|
return create(XMLCData.prototype, this); |
|
}; |
|
|
|
XMLCData.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<![CDATA[' + this.text + ']]>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLCData; |
|
|
|
})(XMLNode); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLNode":139,"lodash/object/create":118}],131:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLComment, XMLNode, create, |
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
XMLNode = require('./XMLNode'); |
|
|
|
module.exports = XMLComment = (function(superClass) { |
|
extend(XMLComment, superClass); |
|
|
|
function XMLComment(parent, text) { |
|
XMLComment.__super__.constructor.call(this, parent); |
|
if (text == null) { |
|
throw new Error("Missing comment text"); |
|
} |
|
this.text = this.stringify.comment(text); |
|
} |
|
|
|
XMLComment.prototype.clone = function() { |
|
return create(XMLComment.prototype, this); |
|
}; |
|
|
|
XMLComment.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<!-- ' + this.text + ' -->'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLComment; |
|
|
|
})(XMLNode); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLNode":139,"lodash/object/create":118}],132:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLDTDAttList, create; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
module.exports = XMLDTDAttList = (function() { |
|
function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) { |
|
this.stringify = parent.stringify; |
|
if (elementName == null) { |
|
throw new Error("Missing DTD element name"); |
|
} |
|
if (attributeName == null) { |
|
throw new Error("Missing DTD attribute name"); |
|
} |
|
if (!attributeType) { |
|
throw new Error("Missing DTD attribute type"); |
|
} |
|
if (!defaultValueType) { |
|
throw new Error("Missing DTD attribute default"); |
|
} |
|
if (defaultValueType.indexOf('#') !== 0) { |
|
defaultValueType = '#' + defaultValueType; |
|
} |
|
if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) { |
|
throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT"); |
|
} |
|
if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) { |
|
throw new Error("Default value only applies to #FIXED or #DEFAULT"); |
|
} |
|
this.elementName = this.stringify.eleName(elementName); |
|
this.attributeName = this.stringify.attName(attributeName); |
|
this.attributeType = this.stringify.dtdAttType(attributeType); |
|
this.defaultValue = this.stringify.dtdAttDefault(defaultValue); |
|
this.defaultValueType = defaultValueType; |
|
} |
|
|
|
XMLDTDAttList.prototype.clone = function() { |
|
return create(XMLDTDAttList.prototype, this); |
|
}; |
|
|
|
XMLDTDAttList.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<!ATTLIST ' + this.elementName + ' ' + this.attributeName + ' ' + this.attributeType; |
|
if (this.defaultValueType !== '#DEFAULT') { |
|
r += ' ' + this.defaultValueType; |
|
} |
|
if (this.defaultValue) { |
|
r += ' "' + this.defaultValue + '"'; |
|
} |
|
r += '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLDTDAttList; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"lodash/object/create":118}],133:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLDTDElement, create, isArray; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
isArray = require('lodash/lang/isArray'); |
|
|
|
module.exports = XMLDTDElement = (function() { |
|
function XMLDTDElement(parent, name, value) { |
|
this.stringify = parent.stringify; |
|
if (name == null) { |
|
throw new Error("Missing DTD element name"); |
|
} |
|
if (!value) { |
|
value = '(#PCDATA)'; |
|
} |
|
if (isArray(value)) { |
|
value = '(' + value.join(',') + ')'; |
|
} |
|
this.name = this.stringify.eleName(name); |
|
this.value = this.stringify.dtdElementValue(value); |
|
} |
|
|
|
XMLDTDElement.prototype.clone = function() { |
|
return create(XMLDTDElement.prototype, this); |
|
}; |
|
|
|
XMLDTDElement.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<!ELEMENT ' + this.name + ' ' + this.value + '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLDTDElement; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"lodash/lang/isArray":110,"lodash/object/create":118}],134:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLDTDEntity, create, isObject; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
isObject = require('lodash/lang/isObject'); |
|
|
|
module.exports = XMLDTDEntity = (function() { |
|
function XMLDTDEntity(parent, pe, name, value) { |
|
this.stringify = parent.stringify; |
|
if (name == null) { |
|
throw new Error("Missing entity name"); |
|
} |
|
if (value == null) { |
|
throw new Error("Missing entity value"); |
|
} |
|
this.pe = !!pe; |
|
this.name = this.stringify.eleName(name); |
|
if (!isObject(value)) { |
|
this.value = this.stringify.dtdEntityValue(value); |
|
} else { |
|
if (!value.pubID && !value.sysID) { |
|
throw new Error("Public and/or system identifiers are required for an external entity"); |
|
} |
|
if (value.pubID && !value.sysID) { |
|
throw new Error("System identifier is required for a public external entity"); |
|
} |
|
if (value.pubID != null) { |
|
this.pubID = this.stringify.dtdPubID(value.pubID); |
|
} |
|
if (value.sysID != null) { |
|
this.sysID = this.stringify.dtdSysID(value.sysID); |
|
} |
|
if (value.nData != null) { |
|
this.nData = this.stringify.dtdNData(value.nData); |
|
} |
|
if (this.pe && this.nData) { |
|
throw new Error("Notation declaration is not allowed in a parameter entity"); |
|
} |
|
} |
|
} |
|
|
|
XMLDTDEntity.prototype.clone = function() { |
|
return create(XMLDTDEntity.prototype, this); |
|
}; |
|
|
|
XMLDTDEntity.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<!ENTITY'; |
|
if (this.pe) { |
|
r += ' %'; |
|
} |
|
r += ' ' + this.name; |
|
if (this.value) { |
|
r += ' "' + this.value + '"'; |
|
} else { |
|
if (this.pubID && this.sysID) { |
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"'; |
|
} else if (this.sysID) { |
|
r += ' SYSTEM "' + this.sysID + '"'; |
|
} |
|
if (this.nData) { |
|
r += ' NDATA ' + this.nData; |
|
} |
|
} |
|
r += '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLDTDEntity; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"lodash/lang/isObject":114,"lodash/object/create":118}],135:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLDTDNotation, create; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
module.exports = XMLDTDNotation = (function() { |
|
function XMLDTDNotation(parent, name, value) { |
|
this.stringify = parent.stringify; |
|
if (name == null) { |
|
throw new Error("Missing notation name"); |
|
} |
|
if (!value.pubID && !value.sysID) { |
|
throw new Error("Public or system identifiers are required for an external entity"); |
|
} |
|
this.name = this.stringify.eleName(name); |
|
if (value.pubID != null) { |
|
this.pubID = this.stringify.dtdPubID(value.pubID); |
|
} |
|
if (value.sysID != null) { |
|
this.sysID = this.stringify.dtdSysID(value.sysID); |
|
} |
|
} |
|
|
|
XMLDTDNotation.prototype.clone = function() { |
|
return create(XMLDTDNotation.prototype, this); |
|
}; |
|
|
|
XMLDTDNotation.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<!NOTATION ' + this.name; |
|
if (this.pubID && this.sysID) { |
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"'; |
|
} else if (this.pubID) { |
|
r += ' PUBLIC "' + this.pubID + '"'; |
|
} else if (this.sysID) { |
|
r += ' SYSTEM "' + this.sysID + '"'; |
|
} |
|
r += '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLDTDNotation; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"lodash/object/create":118}],136:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLDeclaration, XMLNode, create, isObject, |
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
isObject = require('lodash/lang/isObject'); |
|
|
|
XMLNode = require('./XMLNode'); |
|
|
|
module.exports = XMLDeclaration = (function(superClass) { |
|
extend(XMLDeclaration, superClass); |
|
|
|
function XMLDeclaration(parent, version, encoding, standalone) { |
|
var ref; |
|
XMLDeclaration.__super__.constructor.call(this, parent); |
|
if (isObject(version)) { |
|
ref = version, version = ref.version, encoding = ref.encoding, standalone = ref.standalone; |
|
} |
|
if (!version) { |
|
version = '1.0'; |
|
} |
|
if (version != null) { |
|
this.version = this.stringify.xmlVersion(version); |
|
} |
|
if (encoding != null) { |
|
this.encoding = this.stringify.xmlEncoding(encoding); |
|
} |
|
if (standalone != null) { |
|
this.standalone = this.stringify.xmlStandalone(standalone); |
|
} |
|
} |
|
|
|
XMLDeclaration.prototype.clone = function() { |
|
return create(XMLDeclaration.prototype, this); |
|
}; |
|
|
|
XMLDeclaration.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<?xml'; |
|
if (this.version != null) { |
|
r += ' version="' + this.version + '"'; |
|
} |
|
if (this.encoding != null) { |
|
r += ' encoding="' + this.encoding + '"'; |
|
} |
|
if (this.standalone != null) { |
|
r += ' standalone="' + this.standalone + '"'; |
|
} |
|
r += '?>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLDeclaration; |
|
|
|
})(XMLNode); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLNode":139,"lodash/lang/isObject":114,"lodash/object/create":118}],137:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLCData, XMLComment, XMLDTDAttList, XMLDTDElement, XMLDTDEntity, XMLDTDNotation, XMLDocType, XMLProcessingInstruction, create, isObject; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
isObject = require('lodash/lang/isObject'); |
|
|
|
XMLCData = require('./XMLCData'); |
|
|
|
XMLComment = require('./XMLComment'); |
|
|
|
XMLDTDAttList = require('./XMLDTDAttList'); |
|
|
|
XMLDTDEntity = require('./XMLDTDEntity'); |
|
|
|
XMLDTDElement = require('./XMLDTDElement'); |
|
|
|
XMLDTDNotation = require('./XMLDTDNotation'); |
|
|
|
XMLProcessingInstruction = require('./XMLProcessingInstruction'); |
|
|
|
module.exports = XMLDocType = (function() { |
|
function XMLDocType(parent, pubID, sysID) { |
|
var ref, ref1; |
|
this.documentObject = parent; |
|
this.stringify = this.documentObject.stringify; |
|
this.children = []; |
|
if (isObject(pubID)) { |
|
ref = pubID, pubID = ref.pubID, sysID = ref.sysID; |
|
} |
|
if (sysID == null) { |
|
ref1 = [pubID, sysID], sysID = ref1[0], pubID = ref1[1]; |
|
} |
|
if (pubID != null) { |
|
this.pubID = this.stringify.dtdPubID(pubID); |
|
} |
|
if (sysID != null) { |
|
this.sysID = this.stringify.dtdSysID(sysID); |
|
} |
|
} |
|
|
|
XMLDocType.prototype.clone = function() { |
|
return create(XMLDocType.prototype, this); |
|
}; |
|
|
|
XMLDocType.prototype.element = function(name, value) { |
|
var child; |
|
child = new XMLDTDElement(this, name, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { |
|
var child; |
|
child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.entity = function(name, value) { |
|
var child; |
|
child = new XMLDTDEntity(this, false, name, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.pEntity = function(name, value) { |
|
var child; |
|
child = new XMLDTDEntity(this, true, name, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.notation = function(name, value) { |
|
var child; |
|
child = new XMLDTDNotation(this, name, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.cdata = function(value) { |
|
var child; |
|
child = new XMLCData(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.comment = function(value) { |
|
var child; |
|
child = new XMLComment(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.instruction = function(target, value) { |
|
var child; |
|
child = new XMLProcessingInstruction(this, target, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLDocType.prototype.root = function() { |
|
return this.documentObject.root(); |
|
}; |
|
|
|
XMLDocType.prototype.document = function() { |
|
return this.documentObject; |
|
}; |
|
|
|
XMLDocType.prototype.toString = function(options, level) { |
|
var child, i, indent, len, newline, offset, pretty, r, ref, ref1, ref2, ref3, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<!DOCTYPE ' + this.root().name; |
|
if (this.pubID && this.sysID) { |
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"'; |
|
} else if (this.sysID) { |
|
r += ' SYSTEM "' + this.sysID + '"'; |
|
} |
|
if (this.children.length > 0) { |
|
r += ' ['; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
ref3 = this.children; |
|
for (i = 0, len = ref3.length; i < len; i++) { |
|
child = ref3[i]; |
|
r += child.toString(options, level + 1); |
|
} |
|
r += ']'; |
|
} |
|
r += '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
XMLDocType.prototype.ele = function(name, value) { |
|
return this.element(name, value); |
|
}; |
|
|
|
XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) { |
|
return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue); |
|
}; |
|
|
|
XMLDocType.prototype.ent = function(name, value) { |
|
return this.entity(name, value); |
|
}; |
|
|
|
XMLDocType.prototype.pent = function(name, value) { |
|
return this.pEntity(name, value); |
|
}; |
|
|
|
XMLDocType.prototype.not = function(name, value) { |
|
return this.notation(name, value); |
|
}; |
|
|
|
XMLDocType.prototype.dat = function(value) { |
|
return this.cdata(value); |
|
}; |
|
|
|
XMLDocType.prototype.com = function(value) { |
|
return this.comment(value); |
|
}; |
|
|
|
XMLDocType.prototype.ins = function(target, value) { |
|
return this.instruction(target, value); |
|
}; |
|
|
|
XMLDocType.prototype.up = function() { |
|
return this.root(); |
|
}; |
|
|
|
XMLDocType.prototype.doc = function() { |
|
return this.document(); |
|
}; |
|
|
|
return XMLDocType; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLCData":130,"./XMLComment":131,"./XMLDTDAttList":132,"./XMLDTDElement":133,"./XMLDTDEntity":134,"./XMLDTDNotation":135,"./XMLProcessingInstruction":140,"lodash/lang/isObject":114,"lodash/object/create":118}],138:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, every, isArray, isFunction, isObject, |
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
isObject = require('lodash/lang/isObject'); |
|
|
|
isArray = require('lodash/lang/isArray'); |
|
|
|
isFunction = require('lodash/lang/isFunction'); |
|
|
|
every = require('lodash/collection/every'); |
|
|
|
XMLNode = require('./XMLNode'); |
|
|
|
XMLAttribute = require('./XMLAttribute'); |
|
|
|
XMLProcessingInstruction = require('./XMLProcessingInstruction'); |
|
|
|
module.exports = XMLElement = (function(superClass) { |
|
extend(XMLElement, superClass); |
|
|
|
function XMLElement(parent, name, attributes) { |
|
XMLElement.__super__.constructor.call(this, parent); |
|
if (name == null) { |
|
throw new Error("Missing element name"); |
|
} |
|
this.name = this.stringify.eleName(name); |
|
this.children = []; |
|
this.instructions = []; |
|
this.attributes = {}; |
|
if (attributes != null) { |
|
this.attribute(attributes); |
|
} |
|
} |
|
|
|
XMLElement.prototype.clone = function() { |
|
var att, attName, clonedSelf, i, len, pi, ref, ref1; |
|
clonedSelf = create(XMLElement.prototype, this); |
|
if (clonedSelf.isRoot) { |
|
clonedSelf.documentObject = null; |
|
} |
|
clonedSelf.attributes = {}; |
|
ref = this.attributes; |
|
for (attName in ref) { |
|
if (!hasProp.call(ref, attName)) continue; |
|
att = ref[attName]; |
|
clonedSelf.attributes[attName] = att.clone(); |
|
} |
|
clonedSelf.instructions = []; |
|
ref1 = this.instructions; |
|
for (i = 0, len = ref1.length; i < len; i++) { |
|
pi = ref1[i]; |
|
clonedSelf.instructions.push(pi.clone()); |
|
} |
|
clonedSelf.children = []; |
|
this.children.forEach(function(child) { |
|
var clonedChild; |
|
clonedChild = child.clone(); |
|
clonedChild.parent = clonedSelf; |
|
return clonedSelf.children.push(clonedChild); |
|
}); |
|
return clonedSelf; |
|
}; |
|
|
|
XMLElement.prototype.attribute = function(name, value) { |
|
var attName, attValue; |
|
if (name != null) { |
|
name = name.valueOf(); |
|
} |
|
if (isObject(name)) { |
|
for (attName in name) { |
|
if (!hasProp.call(name, attName)) continue; |
|
attValue = name[attName]; |
|
this.attribute(attName, attValue); |
|
} |
|
} else { |
|
if (isFunction(value)) { |
|
value = value.apply(); |
|
} |
|
if (!this.options.skipNullAttributes || (value != null)) { |
|
this.attributes[name] = new XMLAttribute(this, name, value); |
|
} |
|
} |
|
return this; |
|
}; |
|
|
|
XMLElement.prototype.removeAttribute = function(name) { |
|
var attName, i, len; |
|
if (name == null) { |
|
throw new Error("Missing attribute name"); |
|
} |
|
name = name.valueOf(); |
|
if (isArray(name)) { |
|
for (i = 0, len = name.length; i < len; i++) { |
|
attName = name[i]; |
|
delete this.attributes[attName]; |
|
} |
|
} else { |
|
delete this.attributes[name]; |
|
} |
|
return this; |
|
}; |
|
|
|
XMLElement.prototype.instruction = function(target, value) { |
|
var i, insTarget, insValue, instruction, len; |
|
if (target != null) { |
|
target = target.valueOf(); |
|
} |
|
if (value != null) { |
|
value = value.valueOf(); |
|
} |
|
if (isArray(target)) { |
|
for (i = 0, len = target.length; i < len; i++) { |
|
insTarget = target[i]; |
|
this.instruction(insTarget); |
|
} |
|
} else if (isObject(target)) { |
|
for (insTarget in target) { |
|
if (!hasProp.call(target, insTarget)) continue; |
|
insValue = target[insTarget]; |
|
this.instruction(insTarget, insValue); |
|
} |
|
} else { |
|
if (isFunction(value)) { |
|
value = value.apply(); |
|
} |
|
instruction = new XMLProcessingInstruction(this, target, value); |
|
this.instructions.push(instruction); |
|
} |
|
return this; |
|
}; |
|
|
|
XMLElement.prototype.toString = function(options, level) { |
|
var att, child, i, indent, instruction, j, len, len1, name, newline, offset, pretty, r, ref, ref1, ref2, ref3, ref4, ref5, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
ref3 = this.instructions; |
|
for (i = 0, len = ref3.length; i < len; i++) { |
|
instruction = ref3[i]; |
|
r += instruction.toString(options, level + 1); |
|
} |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<' + this.name; |
|
ref4 = this.attributes; |
|
for (name in ref4) { |
|
if (!hasProp.call(ref4, name)) continue; |
|
att = ref4[name]; |
|
r += att.toString(options); |
|
} |
|
if (this.children.length === 0 || every(this.children, function(e) { |
|
return e.value === ''; |
|
})) { |
|
r += '/>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
} else if (pretty && this.children.length === 1 && (this.children[0].value != null)) { |
|
r += '>'; |
|
r += this.children[0].value; |
|
r += '</' + this.name + '>'; |
|
r += newline; |
|
} else { |
|
r += '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
ref5 = this.children; |
|
for (j = 0, len1 = ref5.length; j < len1; j++) { |
|
child = ref5[j]; |
|
r += child.toString(options, level + 1); |
|
} |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '</' + this.name + '>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
} |
|
return r; |
|
}; |
|
|
|
XMLElement.prototype.att = function(name, value) { |
|
return this.attribute(name, value); |
|
}; |
|
|
|
XMLElement.prototype.ins = function(target, value) { |
|
return this.instruction(target, value); |
|
}; |
|
|
|
XMLElement.prototype.a = function(name, value) { |
|
return this.attribute(name, value); |
|
}; |
|
|
|
XMLElement.prototype.i = function(target, value) { |
|
return this.instruction(target, value); |
|
}; |
|
|
|
return XMLElement; |
|
|
|
})(XMLNode); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLAttribute":128,"./XMLNode":139,"./XMLProcessingInstruction":140,"lodash/collection/every":76,"lodash/lang/isArray":110,"lodash/lang/isFunction":112,"lodash/lang/isObject":114,"lodash/object/create":118}],139:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLCData, XMLComment, XMLDeclaration, XMLDocType, XMLElement, XMLNode, XMLRaw, XMLText, isArray, isEmpty, isFunction, isObject, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
isObject = require('lodash/lang/isObject'); |
|
|
|
isArray = require('lodash/lang/isArray'); |
|
|
|
isFunction = require('lodash/lang/isFunction'); |
|
|
|
isEmpty = require('lodash/lang/isEmpty'); |
|
|
|
XMLElement = null; |
|
|
|
XMLCData = null; |
|
|
|
XMLComment = null; |
|
|
|
XMLDeclaration = null; |
|
|
|
XMLDocType = null; |
|
|
|
XMLRaw = null; |
|
|
|
XMLText = null; |
|
|
|
module.exports = XMLNode = (function() { |
|
function XMLNode(parent) { |
|
this.parent = parent; |
|
this.options = this.parent.options; |
|
this.stringify = this.parent.stringify; |
|
if (XMLElement === null) { |
|
XMLElement = require('./XMLElement'); |
|
XMLCData = require('./XMLCData'); |
|
XMLComment = require('./XMLComment'); |
|
XMLDeclaration = require('./XMLDeclaration'); |
|
XMLDocType = require('./XMLDocType'); |
|
XMLRaw = require('./XMLRaw'); |
|
XMLText = require('./XMLText'); |
|
} |
|
} |
|
|
|
XMLNode.prototype.clone = function() { |
|
throw new Error("Cannot clone generic XMLNode"); |
|
}; |
|
|
|
XMLNode.prototype.element = function(name, attributes, text) { |
|
var item, j, key, lastChild, len, ref, val; |
|
lastChild = null; |
|
if (attributes == null) { |
|
attributes = {}; |
|
} |
|
attributes = attributes.valueOf(); |
|
if (!isObject(attributes)) { |
|
ref = [attributes, text], text = ref[0], attributes = ref[1]; |
|
} |
|
if (name != null) { |
|
name = name.valueOf(); |
|
} |
|
if (isArray(name)) { |
|
for (j = 0, len = name.length; j < len; j++) { |
|
item = name[j]; |
|
lastChild = this.element(item); |
|
} |
|
} else if (isFunction(name)) { |
|
lastChild = this.element(name.apply()); |
|
} else if (isObject(name)) { |
|
for (key in name) { |
|
if (!hasProp.call(name, key)) continue; |
|
val = name[key]; |
|
if (isFunction(val)) { |
|
val = val.apply(); |
|
} |
|
if ((isObject(val)) && (isEmpty(val))) { |
|
val = null; |
|
} |
|
if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) { |
|
lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) { |
|
lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val); |
|
} else if (isObject(val)) { |
|
if (!this.options.ignoreDecorators && this.stringify.convertListKey && key.indexOf(this.stringify.convertListKey) === 0 && isArray(val)) { |
|
lastChild = this.element(val); |
|
} else { |
|
lastChild = this.element(key); |
|
lastChild.element(val); |
|
} |
|
} else { |
|
lastChild = this.element(key, val); |
|
} |
|
} |
|
} else { |
|
if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) { |
|
lastChild = this.text(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) { |
|
lastChild = this.cdata(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) { |
|
lastChild = this.comment(text); |
|
} else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) { |
|
lastChild = this.raw(text); |
|
} else { |
|
lastChild = this.node(name, attributes, text); |
|
} |
|
} |
|
if (lastChild == null) { |
|
throw new Error("Could not create any elements with: " + name); |
|
} |
|
return lastChild; |
|
}; |
|
|
|
XMLNode.prototype.insertBefore = function(name, attributes, text) { |
|
var child, i, removed; |
|
if (this.isRoot) { |
|
throw new Error("Cannot insert elements at root level"); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i); |
|
child = this.parent.element(name, attributes, text); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.insertAfter = function(name, attributes, text) { |
|
var child, i, removed; |
|
if (this.isRoot) { |
|
throw new Error("Cannot insert elements at root level"); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
removed = this.parent.children.splice(i + 1); |
|
child = this.parent.element(name, attributes, text); |
|
Array.prototype.push.apply(this.parent.children, removed); |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.remove = function() { |
|
var i, ref; |
|
if (this.isRoot) { |
|
throw new Error("Cannot remove the root element"); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
[].splice.apply(this.parent.children, [i, i - i + 1].concat(ref = [])), ref; |
|
return this.parent; |
|
}; |
|
|
|
XMLNode.prototype.node = function(name, attributes, text) { |
|
var child, ref; |
|
if (name != null) { |
|
name = name.valueOf(); |
|
} |
|
if (attributes == null) { |
|
attributes = {}; |
|
} |
|
attributes = attributes.valueOf(); |
|
if (!isObject(attributes)) { |
|
ref = [attributes, text], text = ref[0], attributes = ref[1]; |
|
} |
|
child = new XMLElement(this, name, attributes); |
|
if (text != null) { |
|
child.text(text); |
|
} |
|
this.children.push(child); |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.text = function(value) { |
|
var child; |
|
child = new XMLText(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.cdata = function(value) { |
|
var child; |
|
child = new XMLCData(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.comment = function(value) { |
|
var child; |
|
child = new XMLComment(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.raw = function(value) { |
|
var child; |
|
child = new XMLRaw(this, value); |
|
this.children.push(child); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.declaration = function(version, encoding, standalone) { |
|
var doc, xmldec; |
|
doc = this.document(); |
|
xmldec = new XMLDeclaration(doc, version, encoding, standalone); |
|
doc.xmldec = xmldec; |
|
return doc.root(); |
|
}; |
|
|
|
XMLNode.prototype.doctype = function(pubID, sysID) { |
|
var doc, doctype; |
|
doc = this.document(); |
|
doctype = new XMLDocType(doc, pubID, sysID); |
|
doc.doctype = doctype; |
|
return doctype; |
|
}; |
|
|
|
XMLNode.prototype.up = function() { |
|
if (this.isRoot) { |
|
throw new Error("The root node has no parent. Use doc() if you need to get the document object."); |
|
} |
|
return this.parent; |
|
}; |
|
|
|
XMLNode.prototype.root = function() { |
|
var child; |
|
if (this.isRoot) { |
|
return this; |
|
} |
|
child = this.parent; |
|
while (!child.isRoot) { |
|
child = child.parent; |
|
} |
|
return child; |
|
}; |
|
|
|
XMLNode.prototype.document = function() { |
|
return this.root().documentObject; |
|
}; |
|
|
|
XMLNode.prototype.end = function(options) { |
|
return this.document().toString(options); |
|
}; |
|
|
|
XMLNode.prototype.prev = function() { |
|
var i; |
|
if (this.isRoot) { |
|
throw new Error("Root node has no siblings"); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
if (i < 1) { |
|
throw new Error("Already at the first node"); |
|
} |
|
return this.parent.children[i - 1]; |
|
}; |
|
|
|
XMLNode.prototype.next = function() { |
|
var i; |
|
if (this.isRoot) { |
|
throw new Error("Root node has no siblings"); |
|
} |
|
i = this.parent.children.indexOf(this); |
|
if (i === -1 || i === this.parent.children.length - 1) { |
|
throw new Error("Already at the last node"); |
|
} |
|
return this.parent.children[i + 1]; |
|
}; |
|
|
|
XMLNode.prototype.importXMLBuilder = function(xmlbuilder) { |
|
var clonedRoot; |
|
clonedRoot = xmlbuilder.root().clone(); |
|
clonedRoot.parent = this; |
|
clonedRoot.isRoot = false; |
|
this.children.push(clonedRoot); |
|
return this; |
|
}; |
|
|
|
XMLNode.prototype.ele = function(name, attributes, text) { |
|
return this.element(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.nod = function(name, attributes, text) { |
|
return this.node(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.txt = function(value) { |
|
return this.text(value); |
|
}; |
|
|
|
XMLNode.prototype.dat = function(value) { |
|
return this.cdata(value); |
|
}; |
|
|
|
XMLNode.prototype.com = function(value) { |
|
return this.comment(value); |
|
}; |
|
|
|
XMLNode.prototype.doc = function() { |
|
return this.document(); |
|
}; |
|
|
|
XMLNode.prototype.dec = function(version, encoding, standalone) { |
|
return this.declaration(version, encoding, standalone); |
|
}; |
|
|
|
XMLNode.prototype.dtd = function(pubID, sysID) { |
|
return this.doctype(pubID, sysID); |
|
}; |
|
|
|
XMLNode.prototype.e = function(name, attributes, text) { |
|
return this.element(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.n = function(name, attributes, text) { |
|
return this.node(name, attributes, text); |
|
}; |
|
|
|
XMLNode.prototype.t = function(value) { |
|
return this.text(value); |
|
}; |
|
|
|
XMLNode.prototype.d = function(value) { |
|
return this.cdata(value); |
|
}; |
|
|
|
XMLNode.prototype.c = function(value) { |
|
return this.comment(value); |
|
}; |
|
|
|
XMLNode.prototype.r = function(value) { |
|
return this.raw(value); |
|
}; |
|
|
|
XMLNode.prototype.u = function() { |
|
return this.up(); |
|
}; |
|
|
|
return XMLNode; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLCData":130,"./XMLComment":131,"./XMLDeclaration":136,"./XMLDocType":137,"./XMLElement":138,"./XMLRaw":141,"./XMLText":143,"lodash/lang/isArray":110,"lodash/lang/isEmpty":111,"lodash/lang/isFunction":112,"lodash/lang/isObject":114}],140:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLProcessingInstruction, create; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
module.exports = XMLProcessingInstruction = (function() { |
|
function XMLProcessingInstruction(parent, target, value) { |
|
this.stringify = parent.stringify; |
|
if (target == null) { |
|
throw new Error("Missing instruction target"); |
|
} |
|
this.target = this.stringify.insTarget(target); |
|
if (value) { |
|
this.value = this.stringify.insValue(value); |
|
} |
|
} |
|
|
|
XMLProcessingInstruction.prototype.clone = function() { |
|
return create(XMLProcessingInstruction.prototype, this); |
|
}; |
|
|
|
XMLProcessingInstruction.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += '<?'; |
|
r += this.target; |
|
if (this.value) { |
|
r += ' ' + this.value; |
|
} |
|
r += '?>'; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLProcessingInstruction; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{"lodash/object/create":118}],141:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLNode, XMLRaw, create, |
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
XMLNode = require('./XMLNode'); |
|
|
|
module.exports = XMLRaw = (function(superClass) { |
|
extend(XMLRaw, superClass); |
|
|
|
function XMLRaw(parent, text) { |
|
XMLRaw.__super__.constructor.call(this, parent); |
|
if (text == null) { |
|
throw new Error("Missing raw text"); |
|
} |
|
this.value = this.stringify.raw(text); |
|
} |
|
|
|
XMLRaw.prototype.clone = function() { |
|
return create(XMLRaw.prototype, this); |
|
}; |
|
|
|
XMLRaw.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += this.value; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLRaw; |
|
|
|
})(XMLNode); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLNode":139,"lodash/object/create":118}],142:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLStringifier, |
|
bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
module.exports = XMLStringifier = (function() { |
|
function XMLStringifier(options) { |
|
this.assertLegalChar = bind(this.assertLegalChar, this); |
|
var key, ref, value; |
|
this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0; |
|
ref = (options != null ? options.stringify : void 0) || {}; |
|
for (key in ref) { |
|
if (!hasProp.call(ref, key)) continue; |
|
value = ref[key]; |
|
this[key] = value; |
|
} |
|
} |
|
|
|
XMLStringifier.prototype.eleName = function(val) { |
|
val = '' + val || ''; |
|
return this.assertLegalChar(val); |
|
}; |
|
|
|
XMLStringifier.prototype.eleText = function(val) { |
|
val = '' + val || ''; |
|
return this.assertLegalChar(this.elEscape(val)); |
|
}; |
|
|
|
XMLStringifier.prototype.cdata = function(val) { |
|
val = '' + val || ''; |
|
if (val.match(/]]>/)) { |
|
throw new Error("Invalid CDATA text: " + val); |
|
} |
|
return this.assertLegalChar(val); |
|
}; |
|
|
|
XMLStringifier.prototype.comment = function(val) { |
|
val = '' + val || ''; |
|
if (val.match(/--/)) { |
|
throw new Error("Comment text cannot contain double-hypen: " + val); |
|
} |
|
return this.assertLegalChar(val); |
|
}; |
|
|
|
XMLStringifier.prototype.raw = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.attName = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.attValue = function(val) { |
|
val = '' + val || ''; |
|
return this.attEscape(val); |
|
}; |
|
|
|
XMLStringifier.prototype.insTarget = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.insValue = function(val) { |
|
val = '' + val || ''; |
|
if (val.match(/\?>/)) { |
|
throw new Error("Invalid processing instruction value: " + val); |
|
} |
|
return val; |
|
}; |
|
|
|
XMLStringifier.prototype.xmlVersion = function(val) { |
|
val = '' + val || ''; |
|
if (!val.match(/1\.[0-9]+/)) { |
|
throw new Error("Invalid version number: " + val); |
|
} |
|
return val; |
|
}; |
|
|
|
XMLStringifier.prototype.xmlEncoding = function(val) { |
|
val = '' + val || ''; |
|
if (!val.match(/[A-Za-z](?:[A-Za-z0-9._-]|-)*/)) { |
|
throw new Error("Invalid encoding: " + val); |
|
} |
|
return val; |
|
}; |
|
|
|
XMLStringifier.prototype.xmlStandalone = function(val) { |
|
if (val) { |
|
return "yes"; |
|
} else { |
|
return "no"; |
|
} |
|
}; |
|
|
|
XMLStringifier.prototype.dtdPubID = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.dtdSysID = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.dtdElementValue = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.dtdAttType = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.dtdAttDefault = function(val) { |
|
if (val != null) { |
|
return '' + val || ''; |
|
} else { |
|
return val; |
|
} |
|
}; |
|
|
|
XMLStringifier.prototype.dtdEntityValue = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.dtdNData = function(val) { |
|
return '' + val || ''; |
|
}; |
|
|
|
XMLStringifier.prototype.convertAttKey = '@'; |
|
|
|
XMLStringifier.prototype.convertPIKey = '?'; |
|
|
|
XMLStringifier.prototype.convertTextKey = '#text'; |
|
|
|
XMLStringifier.prototype.convertCDataKey = '#cdata'; |
|
|
|
XMLStringifier.prototype.convertCommentKey = '#comment'; |
|
|
|
XMLStringifier.prototype.convertRawKey = '#raw'; |
|
|
|
XMLStringifier.prototype.convertListKey = '#list'; |
|
|
|
XMLStringifier.prototype.assertLegalChar = function(str) { |
|
var chars, chr; |
|
if (this.allowSurrogateChars) { |
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/; |
|
} else { |
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/; |
|
} |
|
chr = str.match(chars); |
|
if (chr) { |
|
throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index); |
|
} |
|
return str; |
|
}; |
|
|
|
XMLStringifier.prototype.elEscape = function(str) { |
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\r/g, '
'); |
|
}; |
|
|
|
XMLStringifier.prototype.attEscape = function(str) { |
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"').replace(/\t/g, '	').replace(/\n/g, '
').replace(/\r/g, '
'); |
|
}; |
|
|
|
return XMLStringifier; |
|
|
|
})(); |
|
|
|
}).call(this); |
|
|
|
},{}],143:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLNode, XMLText, create, |
|
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, |
|
hasProp = {}.hasOwnProperty; |
|
|
|
create = require('lodash/object/create'); |
|
|
|
XMLNode = require('./XMLNode'); |
|
|
|
module.exports = XMLText = (function(superClass) { |
|
extend(XMLText, superClass); |
|
|
|
function XMLText(parent, text) { |
|
XMLText.__super__.constructor.call(this, parent); |
|
if (text == null) { |
|
throw new Error("Missing element text"); |
|
} |
|
this.value = this.stringify.eleText(text); |
|
} |
|
|
|
XMLText.prototype.clone = function() { |
|
return create(XMLText.prototype, this); |
|
}; |
|
|
|
XMLText.prototype.toString = function(options, level) { |
|
var indent, newline, offset, pretty, r, ref, ref1, ref2, space; |
|
pretty = (options != null ? options.pretty : void 0) || false; |
|
indent = (ref = options != null ? options.indent : void 0) != null ? ref : ' '; |
|
offset = (ref1 = options != null ? options.offset : void 0) != null ? ref1 : 0; |
|
newline = (ref2 = options != null ? options.newline : void 0) != null ? ref2 : '\n'; |
|
level || (level = 0); |
|
space = new Array(level + offset + 1).join(indent); |
|
r = ''; |
|
if (pretty) { |
|
r += space; |
|
} |
|
r += this.value; |
|
if (pretty) { |
|
r += newline; |
|
} |
|
return r; |
|
}; |
|
|
|
return XMLText; |
|
|
|
})(XMLNode); |
|
|
|
}).call(this); |
|
|
|
},{"./XMLNode":139,"lodash/object/create":118}],144:[function(require,module,exports){ |
|
// Generated by CoffeeScript 1.9.1 |
|
(function() { |
|
var XMLBuilder, assign; |
|
|
|
assign = require('lodash/object/assign'); |
|
|
|
XMLBuilder = require('./XMLBuilder'); |
|
|
|
module.exports.create = function(name, xmldec, doctype, options) { |
|
options = assign({}, xmldec, doctype, options); |
|
return new XMLBuilder(name, options).root(); |
|
}; |
|
|
|
}).call(this); |
|
|
|
},{"./XMLBuilder":129,"lodash/object/assign":117}],145:[function(require,module,exports){ |
|
arguments[4][65][0].apply(exports,arguments) |
|
},{"dup":65}],146:[function(require,module,exports){ |
|
|
|
},{}],147:[function(require,module,exports){ |
|
arguments[4][66][0].apply(exports,arguments) |
|
},{"base64-js":145,"dup":66,"ieee754":149,"isarray":150}],148:[function(require,module,exports){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
function EventEmitter() { |
|
this._events = this._events || {}; |
|
this._maxListeners = this._maxListeners || undefined; |
|
} |
|
module.exports = EventEmitter; |
|
|
|
// Backwards-compat with node 0.10.x |
|
EventEmitter.EventEmitter = EventEmitter; |
|
|
|
EventEmitter.prototype._events = undefined; |
|
EventEmitter.prototype._maxListeners = undefined; |
|
|
|
// By default EventEmitters will print a warning if more than 10 listeners are |
|
// added to it. This is a useful default which helps finding memory leaks. |
|
EventEmitter.defaultMaxListeners = 10; |
|
|
|
// Obviously not all Emitters should be limited to 10. This function allows |
|
// that to be increased. Set to zero for unlimited. |
|
EventEmitter.prototype.setMaxListeners = function(n) { |
|
if (!isNumber(n) || n < 0 || isNaN(n)) |
|
throw TypeError('n must be a positive number'); |
|
this._maxListeners = n; |
|
return this; |
|
}; |
|
|
|
EventEmitter.prototype.emit = function(type) { |
|
var er, handler, len, args, i, listeners; |
|
|
|
if (!this._events) |
|
this._events = {}; |
|
|
|
// If there is no 'error' event listener then throw. |
|
if (type === 'error') { |
|
if (!this._events.error || |
|
(isObject(this._events.error) && !this._events.error.length)) { |
|
er = arguments[1]; |
|
if (er instanceof Error) { |
|
throw er; // Unhandled 'error' event |
|
} else { |
|
// At least give some kind of context to the user |
|
var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); |
|
err.context = er; |
|
throw err; |
|
} |
|
} |
|
} |
|
|
|
handler = this._events[type]; |
|
|
|
if (isUndefined(handler)) |
|
return false; |
|
|
|
if (isFunction(handler)) { |
|
switch (arguments.length) { |
|
// fast cases |
|
case 1: |
|
handler.call(this); |
|
break; |
|
case 2: |
|
handler.call(this, arguments[1]); |
|
break; |
|
case 3: |
|
handler.call(this, arguments[1], arguments[2]); |
|
break; |
|
// slower |
|
default: |
|
args = Array.prototype.slice.call(arguments, 1); |
|
handler.apply(this, args); |
|
} |
|
} else if (isObject(handler)) { |
|
args = Array.prototype.slice.call(arguments, 1); |
|
listeners = handler.slice(); |
|
len = listeners.length; |
|
for (i = 0; i < len; i++) |
|
listeners[i].apply(this, args); |
|
} |
|
|
|
return true; |
|
}; |
|
|
|
EventEmitter.prototype.addListener = function(type, listener) { |
|
var m; |
|
|
|
if (!isFunction(listener)) |
|
throw TypeError('listener must be a function'); |
|
|
|
if (!this._events) |
|
this._events = {}; |
|
|
|
// To avoid recursion in the case that type === "newListener"! Before |
|
// adding it to the listeners, first emit "newListener". |
|
if (this._events.newListener) |
|
this.emit('newListener', type, |
|
isFunction(listener.listener) ? |
|
listener.listener : listener); |
|
|
|
if (!this._events[type]) |
|
// Optimize the case of one listener. Don't need the extra array object. |
|
this._events[type] = listener; |
|
else if (isObject(this._events[type])) |
|
// If we've already got an array, just append. |
|
this._events[type].push(listener); |
|
else |
|
// Adding the second element, need to change to array. |
|
this._events[type] = [this._events[type], listener]; |
|
|
|
// Check for listener leak |
|
if (isObject(this._events[type]) && !this._events[type].warned) { |
|
if (!isUndefined(this._maxListeners)) { |
|
m = this._maxListeners; |
|
} else { |
|
m = EventEmitter.defaultMaxListeners; |
|
} |
|
|
|
if (m && m > 0 && this._events[type].length > m) { |
|
this._events[type].warned = true; |
|
console.error('(node) warning: possible EventEmitter memory ' + |
|
'leak detected. %d listeners added. ' + |
|
'Use emitter.setMaxListeners() to increase limit.', |
|
this._events[type].length); |
|
if (typeof console.trace === 'function') { |
|
// not supported in IE 10 |
|
console.trace(); |
|
} |
|
} |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
EventEmitter.prototype.on = EventEmitter.prototype.addListener; |
|
|
|
EventEmitter.prototype.once = function(type, listener) { |
|
if (!isFunction(listener)) |
|
throw TypeError('listener must be a function'); |
|
|
|
var fired = false; |
|
|
|
function g() { |
|
this.removeListener(type, g); |
|
|
|
if (!fired) { |
|
fired = true; |
|
listener.apply(this, arguments); |
|
} |
|
} |
|
|
|
g.listener = listener; |
|
this.on(type, g); |
|
|
|
return this; |
|
}; |
|
|
|
// emits a 'removeListener' event iff the listener was removed |
|
EventEmitter.prototype.removeListener = function(type, listener) { |
|
var list, position, length, i; |
|
|
|
if (!isFunction(listener)) |
|
throw TypeError('listener must be a function'); |
|
|
|
if (!this._events || !this._events[type]) |
|
return this; |
|
|
|
list = this._events[type]; |
|
length = list.length; |
|
position = -1; |
|
|
|
if (list === listener || |
|
(isFunction(list.listener) && list.listener === listener)) { |
|
delete this._events[type]; |
|
if (this._events.removeListener) |
|
this.emit('removeListener', type, listener); |
|
|
|
} else if (isObject(list)) { |
|
for (i = length; i-- > 0;) { |
|
if (list[i] === listener || |
|
(list[i].listener && list[i].listener === listener)) { |
|
position = i; |
|
break; |
|
} |
|
} |
|
|
|
if (position < 0) |
|
return this; |
|
|
|
if (list.length === 1) { |
|
list.length = 0; |
|
delete this._events[type]; |
|
} else { |
|
list.splice(position, 1); |
|
} |
|
|
|
if (this._events.removeListener) |
|
this.emit('removeListener', type, listener); |
|
} |
|
|
|
return this; |
|
}; |
|
|
|
EventEmitter.prototype.removeAllListeners = function(type) { |
|
var key, listeners; |
|
|
|
if (!this._events) |
|
return this; |
|
|
|
// not listening for removeListener, no need to emit |
|
if (!this._events.removeListener) { |
|
if (arguments.length === 0) |
|
this._events = {}; |
|
else if (this._events[type]) |
|
delete this._events[type]; |
|
return this; |
|
} |
|
|
|
// emit removeListener for all listeners on all events |
|
if (arguments.length === 0) { |
|
for (key in this._events) { |
|
if (key === 'removeListener') continue; |
|
this.removeAllListeners(key); |
|
} |
|
this.removeAllListeners('removeListener'); |
|
this._events = {}; |
|
return this; |
|
} |
|
|
|
listeners = this._events[type]; |
|
|
|
if (isFunction(listeners)) { |
|
this.removeListener(type, listeners); |
|
} else if (listeners) { |
|
// LIFO order |
|
while (listeners.length) |
|
this.removeListener(type, listeners[listeners.length - 1]); |
|
} |
|
delete this._events[type]; |
|
|
|
return this; |
|
}; |
|
|
|
EventEmitter.prototype.listeners = function(type) { |
|
var ret; |
|
if (!this._events || !this._events[type]) |
|
ret = []; |
|
else if (isFunction(this._events[type])) |
|
ret = [this._events[type]]; |
|
else |
|
ret = this._events[type].slice(); |
|
return ret; |
|
}; |
|
|
|
EventEmitter.prototype.listenerCount = function(type) { |
|
if (this._events) { |
|
var evlistener = this._events[type]; |
|
|
|
if (isFunction(evlistener)) |
|
return 1; |
|
else if (evlistener) |
|
return evlistener.length; |
|
} |
|
return 0; |
|
}; |
|
|
|
EventEmitter.listenerCount = function(emitter, type) { |
|
return emitter.listenerCount(type); |
|
}; |
|
|
|
function isFunction(arg) { |
|
return typeof arg === 'function'; |
|
} |
|
|
|
function isNumber(arg) { |
|
return typeof arg === 'number'; |
|
} |
|
|
|
function isObject(arg) { |
|
return typeof arg === 'object' && arg !== null; |
|
} |
|
|
|
function isUndefined(arg) { |
|
return arg === void 0; |
|
} |
|
|
|
},{}],149:[function(require,module,exports){ |
|
arguments[4][73][0].apply(exports,arguments) |
|
},{"dup":73}],150:[function(require,module,exports){ |
|
arguments[4][74][0].apply(exports,arguments) |
|
},{"dup":74}],151:[function(require,module,exports){ |
|
// shim for using process in browser |
|
var process = module.exports = {}; |
|
|
|
// cached from whatever global is present so that test runners that stub it |
|
// don't break things. But we need to wrap it in a try catch in case it is |
|
// wrapped in strict mode code which doesn't define any globals. It's inside a |
|
// function because try/catches deoptimize in certain engines. |
|
|
|
var cachedSetTimeout; |
|
var cachedClearTimeout; |
|
|
|
function defaultSetTimout() { |
|
throw new Error('setTimeout has not been defined'); |
|
} |
|
function defaultClearTimeout () { |
|
throw new Error('clearTimeout has not been defined'); |
|
} |
|
(function () { |
|
try { |
|
if (typeof setTimeout === 'function') { |
|
cachedSetTimeout = setTimeout; |
|
} else { |
|
cachedSetTimeout = defaultSetTimout; |
|
} |
|
} catch (e) { |
|
cachedSetTimeout = defaultSetTimout; |
|
} |
|
try { |
|
if (typeof clearTimeout === 'function') { |
|
cachedClearTimeout = clearTimeout; |
|
} else { |
|
cachedClearTimeout = defaultClearTimeout; |
|
} |
|
} catch (e) { |
|
cachedClearTimeout = defaultClearTimeout; |
|
} |
|
} ()) |
|
function runTimeout(fun) { |
|
if (cachedSetTimeout === setTimeout) { |
|
//normal enviroments in sane situations |
|
return setTimeout(fun, 0); |
|
} |
|
// if setTimeout wasn't available but was latter defined |
|
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { |
|
cachedSetTimeout = setTimeout; |
|
return setTimeout(fun, 0); |
|
} |
|
try { |
|
// when when somebody has screwed with setTimeout but no I.E. maddness |
|
return cachedSetTimeout(fun, 0); |
|
} catch(e){ |
|
try { |
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally |
|
return cachedSetTimeout.call(null, fun, 0); |
|
} catch(e){ |
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error |
|
return cachedSetTimeout.call(this, fun, 0); |
|
} |
|
} |
|
|
|
|
|
} |
|
function runClearTimeout(marker) { |
|
if (cachedClearTimeout === clearTimeout) { |
|
//normal enviroments in sane situations |
|
return clearTimeout(marker); |
|
} |
|
// if clearTimeout wasn't available but was latter defined |
|
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { |
|
cachedClearTimeout = clearTimeout; |
|
return clearTimeout(marker); |
|
} |
|
try { |
|
// when when somebody has screwed with setTimeout but no I.E. maddness |
|
return cachedClearTimeout(marker); |
|
} catch (e){ |
|
try { |
|
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally |
|
return cachedClearTimeout.call(null, marker); |
|
} catch (e){ |
|
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. |
|
// Some versions of I.E. have different rules for clearTimeout vs setTimeout |
|
return cachedClearTimeout.call(this, marker); |
|
} |
|
} |
|
|
|
|
|
|
|
} |
|
var queue = []; |
|
var draining = false; |
|
var currentQueue; |
|
var queueIndex = -1; |
|
|
|
function cleanUpNextTick() { |
|
if (!draining || !currentQueue) { |
|
return; |
|
} |
|
draining = false; |
|
if (currentQueue.length) { |
|
queue = currentQueue.concat(queue); |
|
} else { |
|
queueIndex = -1; |
|
} |
|
if (queue.length) { |
|
drainQueue(); |
|
} |
|
} |
|
|
|
function drainQueue() { |
|
if (draining) { |
|
return; |
|
} |
|
var timeout = runTimeout(cleanUpNextTick); |
|
draining = true; |
|
|
|
var len = queue.length; |
|
while(len) { |
|
currentQueue = queue; |
|
queue = []; |
|
while (++queueIndex < len) { |
|
if (currentQueue) { |
|
currentQueue[queueIndex].run(); |
|
} |
|
} |
|
queueIndex = -1; |
|
len = queue.length; |
|
} |
|
currentQueue = null; |
|
draining = false; |
|
runClearTimeout(timeout); |
|
} |
|
|
|
process.nextTick = function (fun) { |
|
var args = new Array(arguments.length - 1); |
|
if (arguments.length > 1) { |
|
for (var i = 1; i < arguments.length; i++) { |
|
args[i - 1] = arguments[i]; |
|
} |
|
} |
|
queue.push(new Item(fun, args)); |
|
if (queue.length === 1 && !draining) { |
|
runTimeout(drainQueue); |
|
} |
|
}; |
|
|
|
// v8 likes predictible objects |
|
function Item(fun, array) { |
|
this.fun = fun; |
|
this.array = array; |
|
} |
|
Item.prototype.run = function () { |
|
this.fun.apply(null, this.array); |
|
}; |
|
process.title = 'browser'; |
|
process.browser = true; |
|
process.env = {}; |
|
process.argv = []; |
|
process.version = ''; // empty string to avoid regexp issues |
|
process.versions = {}; |
|
|
|
function noop() {} |
|
|
|
process.on = noop; |
|
process.addListener = noop; |
|
process.once = noop; |
|
process.off = noop; |
|
process.removeListener = noop; |
|
process.removeAllListeners = noop; |
|
process.emit = noop; |
|
|
|
process.binding = function (name) { |
|
throw new Error('process.binding is not supported'); |
|
}; |
|
|
|
process.cwd = function () { return '/' }; |
|
process.chdir = function (dir) { |
|
throw new Error('process.chdir is not supported'); |
|
}; |
|
process.umask = function() { return 0; }; |
|
|
|
},{}],152:[function(require,module,exports){ |
|
(function (global){ |
|
/*! https://mths.be/punycode v1.4.1 by @mathias */ |
|
;(function(root) { |
|
|
|
/** Detect free variables */ |
|
var freeExports = typeof exports == 'object' && exports && |
|
!exports.nodeType && exports; |
|
var freeModule = typeof module == 'object' && module && |
|
!module.nodeType && module; |
|
var freeGlobal = typeof global == 'object' && global; |
|
if ( |
|
freeGlobal.global === freeGlobal || |
|
freeGlobal.window === freeGlobal || |
|
freeGlobal.self === freeGlobal |
|
) { |
|
root = freeGlobal; |
|
} |
|
|
|
/** |
|
* The `punycode` object. |
|
* @name punycode |
|
* @type Object |
|
*/ |
|
var punycode, |
|
|
|
/** Highest positive signed 32-bit float value */ |
|
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 |
|
|
|
/** Bootstring parameters */ |
|
base = 36, |
|
tMin = 1, |
|
tMax = 26, |
|
skew = 38, |
|
damp = 700, |
|
initialBias = 72, |
|
initialN = 128, // 0x80 |
|
delimiter = '-', // '\x2D' |
|
|
|
/** Regular expressions */ |
|
regexPunycode = /^xn--/, |
|
regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars |
|
regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators |
|
|
|
/** Error messages */ |
|
errors = { |
|
'overflow': 'Overflow: input needs wider integers to process', |
|
'not-basic': 'Illegal input >= 0x80 (not a basic code point)', |
|
'invalid-input': 'Invalid input' |
|
}, |
|
|
|
/** Convenience shortcuts */ |
|
baseMinusTMin = base - tMin, |
|
floor = Math.floor, |
|
stringFromCharCode = String.fromCharCode, |
|
|
|
/** Temporary variable */ |
|
key; |
|
|
|
/*--------------------------------------------------------------------------*/ |
|
|
|
/** |
|
* A generic error utility function. |
|
* @private |
|
* @param {String} type The error type. |
|
* @returns {Error} Throws a `RangeError` with the applicable error message. |
|
*/ |
|
function error(type) { |
|
throw new RangeError(errors[type]); |
|
} |
|
|
|
/** |
|
* A generic `Array#map` utility function. |
|
* @private |
|
* @param {Array} array The array to iterate over. |
|
* @param {Function} callback The function that gets called for every array |
|
* item. |
|
* @returns {Array} A new array of values returned by the callback function. |
|
*/ |
|
function map(array, fn) { |
|
var length = array.length; |
|
var result = []; |
|
while (length--) { |
|
result[length] = fn(array[length]); |
|
} |
|
return result; |
|
} |
|
|
|
/** |
|
* A simple `Array#map`-like wrapper to work with domain name strings or email |
|
* addresses. |
|
* @private |
|
* @param {String} domain The domain name or email address. |
|
* @param {Function} callback The function that gets called for every |
|
* character. |
|
* @returns {Array} A new string of characters returned by the callback |
|
* function. |
|
*/ |
|
function mapDomain(string, fn) { |
|
var parts = string.split('@'); |
|
var result = ''; |
|
if (parts.length > 1) { |
|
// In email addresses, only the domain name should be punycoded. Leave |
|
// the local part (i.e. everything up to `@`) intact. |
|
result = parts[0] + '@'; |
|
string = parts[1]; |
|
} |
|
// Avoid `split(regex)` for IE8 compatibility. See #17. |
|
string = string.replace(regexSeparators, '\x2E'); |
|
var labels = string.split('.'); |
|
var encoded = map(labels, fn).join('.'); |
|
return result + encoded; |
|
} |
|
|
|
/** |
|
* Creates an array containing the numeric code points of each Unicode |
|
* character in the string. While JavaScript uses UCS-2 internally, |
|
* this function will convert a pair of surrogate halves (each of which |
|
* UCS-2 exposes as separate characters) into a single code point, |
|
* matching UTF-16. |
|
* @see `punycode.ucs2.encode` |
|
* @see <https://mathiasbynens.be/notes/javascript-encoding> |
|
* @memberOf punycode.ucs2 |
|
* @name decode |
|
* @param {String} string The Unicode input string (UCS-2). |
|
* @returns {Array} The new array of code points. |
|
*/ |
|
function ucs2decode(string) { |
|
var output = [], |
|
counter = 0, |
|
length = string.length, |
|
value, |
|
extra; |
|
while (counter < length) { |
|
value = string.charCodeAt(counter++); |
|
if (value >= 0xD800 && value <= 0xDBFF && counter < length) { |
|
// high surrogate, and there is a next character |
|
extra = string.charCodeAt(counter++); |
|
if ((extra & 0xFC00) == 0xDC00) { // low surrogate |
|
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); |
|
} else { |
|
// unmatched surrogate; only append this code unit, in case the next |
|
// code unit is the high surrogate of a surrogate pair |
|
output.push(value); |
|
counter--; |
|
} |
|
} else { |
|
output.push(value); |
|
} |
|
} |
|
return output; |
|
} |
|
|
|
/** |
|
* Creates a string based on an array of numeric code points. |
|
* @see `punycode.ucs2.decode` |
|
* @memberOf punycode.ucs2 |
|
* @name encode |
|
* @param {Array} codePoints The array of numeric code points. |
|
* @returns {String} The new Unicode string (UCS-2). |
|
*/ |
|
function ucs2encode(array) { |
|
return map(array, function(value) { |
|
var output = ''; |
|
if (value > 0xFFFF) { |
|
value -= 0x10000; |
|
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); |
|
value = 0xDC00 | value & 0x3FF; |
|
} |
|
output += stringFromCharCode(value); |
|
return output; |
|
}).join(''); |
|
} |
|
|
|
/** |
|
* Converts a basic code point into a digit/integer. |
|
* @see `digitToBasic()` |
|
* @private |
|
* @param {Number} codePoint The basic numeric code point value. |
|
* @returns {Number} The numeric value of a basic code point (for use in |
|
* representing integers) in the range `0` to `base - 1`, or `base` if |
|
* the code point does not represent a value. |
|
*/ |
|
function basicToDigit(codePoint) { |
|
if (codePoint - 48 < 10) { |
|
return codePoint - 22; |
|
} |
|
if (codePoint - 65 < 26) { |
|
return codePoint - 65; |
|
} |
|
if (codePoint - 97 < 26) { |
|
return codePoint - 97; |
|
} |
|
return base; |
|
} |
|
|
|
/** |
|
* Converts a digit/integer into a basic code point. |
|
* @see `basicToDigit()` |
|
* @private |
|
* @param {Number} digit The numeric value of a basic code point. |
|
* @returns {Number} The basic code point whose value (when used for |
|
* representing integers) is `digit`, which needs to be in the range |
|
* `0` to `base - 1`. If `flag` is non-zero, the uppercase form is |
|
* used; else, the lowercase form is used. The behavior is undefined |
|
* if `flag` is non-zero and `digit` has no uppercase form. |
|
*/ |
|
function digitToBasic(digit, flag) { |
|
// 0..25 map to ASCII a..z or A..Z |
|
// 26..35 map to ASCII 0..9 |
|
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); |
|
} |
|
|
|
/** |
|
* Bias adaptation function as per section 3.4 of RFC 3492. |
|
* https://tools.ietf.org/html/rfc3492#section-3.4 |
|
* @private |
|
*/ |
|
function adapt(delta, numPoints, firstTime) { |
|
var k = 0; |
|
delta = firstTime ? floor(delta / damp) : delta >> 1; |
|
delta += floor(delta / numPoints); |
|
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { |
|
delta = floor(delta / baseMinusTMin); |
|
} |
|
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); |
|
} |
|
|
|
/** |
|
* Converts a Punycode string of ASCII-only symbols to a string of Unicode |
|
* symbols. |
|
* @memberOf punycode |
|
* @param {String} input The Punycode string of ASCII-only symbols. |
|
* @returns {String} The resulting string of Unicode symbols. |
|
*/ |
|
function decode(input) { |
|
// Don't use UCS-2 |
|
var output = [], |
|
inputLength = input.length, |
|
out, |
|
i = 0, |
|
n = initialN, |
|
bias = initialBias, |
|
basic, |
|
j, |
|
index, |
|
oldi, |
|
w, |
|
k, |
|
digit, |
|
t, |
|
/** Cached calculation results */ |
|
baseMinusT; |
|
|
|
// Handle the basic code points: let `basic` be the number of input code |
|
// points before the last delimiter, or `0` if there is none, then copy |
|
// the first basic code points to the output. |
|
|
|
basic = input.lastIndexOf(delimiter); |
|
if (basic < 0) { |
|
basic = 0; |
|
} |
|
|
|
for (j = 0; j < basic; ++j) { |
|
// if it's not a basic code point |
|
if (input.charCodeAt(j) >= 0x80) { |
|
error('not-basic'); |
|
} |
|
output.push(input.charCodeAt(j)); |
|
} |
|
|
|
// Main decoding loop: start just after the last delimiter if any basic code |
|
// points were copied; start at the beginning otherwise. |
|
|
|
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { |
|
|
|
// `index` is the index of the next character to be consumed. |
|
// Decode a generalized variable-length integer into `delta`, |
|
// which gets added to `i`. The overflow checking is easier |
|
// if we increase `i` as we go, then subtract off its starting |
|
// value at the end to obtain `delta`. |
|
for (oldi = i, w = 1, k = base; /* no condition */; k += base) { |
|
|
|
if (index >= inputLength) { |
|
error('invalid-input'); |
|
} |
|
|
|
digit = basicToDigit(input.charCodeAt(index++)); |
|
|
|
if (digit >= base || digit > floor((maxInt - i) / w)) { |
|
error('overflow'); |
|
} |
|
|
|
i += digit * w; |
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); |
|
|
|
if (digit < t) { |
|
break; |
|
} |
|
|
|
baseMinusT = base - t; |
|
if (w > floor(maxInt / baseMinusT)) { |
|
error('overflow'); |
|
} |
|
|
|
w *= baseMinusT; |
|
|
|
} |
|
|
|
out = output.length + 1; |
|
bias = adapt(i - oldi, out, oldi == 0); |
|
|
|
// `i` was supposed to wrap around from `out` to `0`, |
|
// incrementing `n` each time, so we'll fix that now: |
|
if (floor(i / out) > maxInt - n) { |
|
error('overflow'); |
|
} |
|
|
|
n += floor(i / out); |
|
i %= out; |
|
|
|
// Insert `n` at position `i` of the output |
|
output.splice(i++, 0, n); |
|
|
|
} |
|
|
|
return ucs2encode(output); |
|
} |
|
|
|
/** |
|
* Converts a string of Unicode symbols (e.g. a domain name label) to a |
|
* Punycode string of ASCII-only symbols. |
|
* @memberOf punycode |
|
* @param {String} input The string of Unicode symbols. |
|
* @returns {String} The resulting Punycode string of ASCII-only symbols. |
|
*/ |
|
function encode(input) { |
|
var n, |
|
delta, |
|
handledCPCount, |
|
basicLength, |
|
bias, |
|
j, |
|
m, |
|
q, |
|
k, |
|
t, |
|
currentValue, |
|
output = [], |
|
/** `inputLength` will hold the number of code points in `input`. */ |
|
inputLength, |
|
/** Cached calculation results */ |
|
handledCPCountPlusOne, |
|
baseMinusT, |
|
qMinusT; |
|
|
|
// Convert the input in UCS-2 to Unicode |
|
input = ucs2decode(input); |
|
|
|
// Cache the length |
|
inputLength = input.length; |
|
|
|
// Initialize the state |
|
n = initialN; |
|
delta = 0; |
|
bias = initialBias; |
|
|
|
// Handle the basic code points |
|
for (j = 0; j < inputLength; ++j) { |
|
currentValue = input[j]; |
|
if (currentValue < 0x80) { |
|
output.push(stringFromCharCode(currentValue)); |
|
} |
|
} |
|
|
|
handledCPCount = basicLength = output.length; |
|
|
|
// `handledCPCount` is the number of code points that have been handled; |
|
// `basicLength` is the number of basic code points. |
|
|
|
// Finish the basic string - if it is not empty - with a delimiter |
|
if (basicLength) { |
|
output.push(delimiter); |
|
} |
|
|
|
// Main encoding loop: |
|
while (handledCPCount < inputLength) { |
|
|
|
// All non-basic code points < n have been handled already. Find the next |
|
// larger one: |
|
for (m = maxInt, j = 0; j < inputLength; ++j) { |
|
currentValue = input[j]; |
|
if (currentValue >= n && currentValue < m) { |
|
m = currentValue; |
|
} |
|
} |
|
|
|
// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, |
|
// but guard against overflow |
|
handledCPCountPlusOne = handledCPCount + 1; |
|
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { |
|
error('overflow'); |
|
} |
|
|
|
delta += (m - n) * handledCPCountPlusOne; |
|
n = m; |
|
|
|
for (j = 0; j < inputLength; ++j) { |
|
currentValue = input[j]; |
|
|
|
if (currentValue < n && ++delta > maxInt) { |
|
error('overflow'); |
|
} |
|
|
|
if (currentValue == n) { |
|
// Represent delta as a generalized variable-length integer |
|
for (q = delta, k = base; /* no condition */; k += base) { |
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); |
|
if (q < t) { |
|
break; |
|
} |
|
qMinusT = q - t; |
|
baseMinusT = base - t; |
|
output.push( |
|
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) |
|
); |
|
q = floor(qMinusT / baseMinusT); |
|
} |
|
|
|
output.push(stringFromCharCode(digitToBasic(q, 0))); |
|
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); |
|
delta = 0; |
|
++handledCPCount; |
|
} |
|
} |
|
|
|
++delta; |
|
++n; |
|
|
|
} |
|
return output.join(''); |
|
} |
|
|
|
/** |
|
* Converts a Punycode string representing a domain name or an email address |
|
* to Unicode. Only the Punycoded parts of the input will be converted, i.e. |
|
* it doesn't matter if you call it on a string that has already been |
|
* converted to Unicode. |
|
* @memberOf punycode |
|
* @param {String} input The Punycoded domain name or email address to |
|
* convert to Unicode. |
|
* @returns {String} The Unicode representation of the given Punycode |
|
* string. |
|
*/ |
|
function toUnicode(input) { |
|
return mapDomain(input, function(string) { |
|
return regexPunycode.test(string) |
|
? decode(string.slice(4).toLowerCase()) |
|
: string; |
|
}); |
|
} |
|
|
|
/** |
|
* Converts a Unicode string representing a domain name or an email address to |
|
* Punycode. Only the non-ASCII parts of the domain name will be converted, |
|
* i.e. it doesn't matter if you call it with a domain that's already in |
|
* ASCII. |
|
* @memberOf punycode |
|
* @param {String} input The domain name or email address to convert, as a |
|
* Unicode string. |
|
* @returns {String} The Punycode representation of the given domain name or |
|
* email address. |
|
*/ |
|
function toASCII(input) { |
|
return mapDomain(input, function(string) { |
|
return regexNonASCII.test(string) |
|
? 'xn--' + encode(string) |
|
: string; |
|
}); |
|
} |
|
|
|
/*--------------------------------------------------------------------------*/ |
|
|
|
/** Define the public API */ |
|
punycode = { |
|
/** |
|
* A string representing the current Punycode.js version number. |
|
* @memberOf punycode |
|
* @type String |
|
*/ |
|
'version': '1.4.1', |
|
/** |
|
* An object of methods to convert from JavaScript's internal character |
|
* representation (UCS-2) to Unicode code points, and back. |
|
* @see <https://mathiasbynens.be/notes/javascript-encoding> |
|
* @memberOf punycode |
|
* @type Object |
|
*/ |
|
'ucs2': { |
|
'decode': ucs2decode, |
|
'encode': ucs2encode |
|
}, |
|
'decode': decode, |
|
'encode': encode, |
|
'toASCII': toASCII, |
|
'toUnicode': toUnicode |
|
}; |
|
|
|
/** Expose `punycode` */ |
|
// Some AMD build optimizers, like r.js, check for specific condition patterns |
|
// like the following: |
|
if ( |
|
typeof define == 'function' && |
|
typeof define.amd == 'object' && |
|
define.amd |
|
) { |
|
define('punycode', function() { |
|
return punycode; |
|
}); |
|
} else if (freeExports && freeModule) { |
|
if (module.exports == freeExports) { |
|
// in Node.js, io.js, or RingoJS v0.8.0+ |
|
freeModule.exports = punycode; |
|
} else { |
|
// in Narwhal or RingoJS v0.7.0- |
|
for (key in punycode) { |
|
punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); |
|
} |
|
} |
|
} else { |
|
// in Rhino or a web browser |
|
root.punycode = punycode; |
|
} |
|
|
|
}(this)); |
|
|
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{}],153:[function(require,module,exports){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
'use strict'; |
|
|
|
// If obj.hasOwnProperty has been overridden, then calling |
|
// obj.hasOwnProperty(prop) will break. |
|
// See: https://github.com/joyent/node/issues/1707 |
|
function hasOwnProperty(obj, prop) { |
|
return Object.prototype.hasOwnProperty.call(obj, prop); |
|
} |
|
|
|
module.exports = function(qs, sep, eq, options) { |
|
sep = sep || '&'; |
|
eq = eq || '='; |
|
var obj = {}; |
|
|
|
if (typeof qs !== 'string' || qs.length === 0) { |
|
return obj; |
|
} |
|
|
|
var regexp = /\+/g; |
|
qs = qs.split(sep); |
|
|
|
var maxKeys = 1000; |
|
if (options && typeof options.maxKeys === 'number') { |
|
maxKeys = options.maxKeys; |
|
} |
|
|
|
var len = qs.length; |
|
// maxKeys <= 0 means that we should not limit keys count |
|
if (maxKeys > 0 && len > maxKeys) { |
|
len = maxKeys; |
|
} |
|
|
|
for (var i = 0; i < len; ++i) { |
|
var x = qs[i].replace(regexp, '%20'), |
|
idx = x.indexOf(eq), |
|
kstr, vstr, k, v; |
|
|
|
if (idx >= 0) { |
|
kstr = x.substr(0, idx); |
|
vstr = x.substr(idx + 1); |
|
} else { |
|
kstr = x; |
|
vstr = ''; |
|
} |
|
|
|
k = decodeURIComponent(kstr); |
|
v = decodeURIComponent(vstr); |
|
|
|
if (!hasOwnProperty(obj, k)) { |
|
obj[k] = v; |
|
} else if (isArray(obj[k])) { |
|
obj[k].push(v); |
|
} else { |
|
obj[k] = [obj[k], v]; |
|
} |
|
} |
|
|
|
return obj; |
|
}; |
|
|
|
var isArray = Array.isArray || function (xs) { |
|
return Object.prototype.toString.call(xs) === '[object Array]'; |
|
}; |
|
|
|
},{}],154:[function(require,module,exports){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
'use strict'; |
|
|
|
var stringifyPrimitive = function(v) { |
|
switch (typeof v) { |
|
case 'string': |
|
return v; |
|
|
|
case 'boolean': |
|
return v ? 'true' : 'false'; |
|
|
|
case 'number': |
|
return isFinite(v) ? v : ''; |
|
|
|
default: |
|
return ''; |
|
} |
|
}; |
|
|
|
module.exports = function(obj, sep, eq, name) { |
|
sep = sep || '&'; |
|
eq = eq || '='; |
|
if (obj === null) { |
|
obj = undefined; |
|
} |
|
|
|
if (typeof obj === 'object') { |
|
return map(objectKeys(obj), function(k) { |
|
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; |
|
if (isArray(obj[k])) { |
|
return map(obj[k], function(v) { |
|
return ks + encodeURIComponent(stringifyPrimitive(v)); |
|
}).join(sep); |
|
} else { |
|
return ks + encodeURIComponent(stringifyPrimitive(obj[k])); |
|
} |
|
}).join(sep); |
|
|
|
} |
|
|
|
if (!name) return ''; |
|
return encodeURIComponent(stringifyPrimitive(name)) + eq + |
|
encodeURIComponent(stringifyPrimitive(obj)); |
|
}; |
|
|
|
var isArray = Array.isArray || function (xs) { |
|
return Object.prototype.toString.call(xs) === '[object Array]'; |
|
}; |
|
|
|
function map (xs, f) { |
|
if (xs.map) return xs.map(f); |
|
var res = []; |
|
for (var i = 0; i < xs.length; i++) { |
|
res.push(f(xs[i], i)); |
|
} |
|
return res; |
|
} |
|
|
|
var objectKeys = Object.keys || function (obj) { |
|
var res = []; |
|
for (var key in obj) { |
|
if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); |
|
} |
|
return res; |
|
}; |
|
|
|
},{}],155:[function(require,module,exports){ |
|
arguments[4][126][0].apply(exports,arguments) |
|
},{"./decode":153,"./encode":154,"dup":126}],156:[function(require,module,exports){ |
|
if (typeof Object.create === 'function') { |
|
// implementation from standard node.js 'util' module |
|
module.exports = function inherits(ctor, superCtor) { |
|
ctor.super_ = superCtor |
|
ctor.prototype = Object.create(superCtor.prototype, { |
|
constructor: { |
|
value: ctor, |
|
enumerable: false, |
|
writable: true, |
|
configurable: true |
|
} |
|
}); |
|
}; |
|
} else { |
|
// old school shim for old browsers |
|
module.exports = function inherits(ctor, superCtor) { |
|
ctor.super_ = superCtor |
|
var TempCtor = function () {} |
|
TempCtor.prototype = superCtor.prototype |
|
ctor.prototype = new TempCtor() |
|
ctor.prototype.constructor = ctor |
|
} |
|
} |
|
|
|
},{}],157:[function(require,module,exports){ |
|
module.exports = function isBuffer(arg) { |
|
return arg && typeof arg === 'object' |
|
&& typeof arg.copy === 'function' |
|
&& typeof arg.fill === 'function' |
|
&& typeof arg.readUInt8 === 'function'; |
|
} |
|
},{}],158:[function(require,module,exports){ |
|
(function (process,global){ |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
var formatRegExp = /%[sdj%]/g; |
|
exports.format = function(f) { |
|
if (!isString(f)) { |
|
var objects = []; |
|
for (var i = 0; i < arguments.length; i++) { |
|
objects.push(inspect(arguments[i])); |
|
} |
|
return objects.join(' '); |
|
} |
|
|
|
var i = 1; |
|
var args = arguments; |
|
var len = args.length; |
|
var str = String(f).replace(formatRegExp, function(x) { |
|
if (x === '%%') return '%'; |
|
if (i >= len) return x; |
|
switch (x) { |
|
case '%s': return String(args[i++]); |
|
case '%d': return Number(args[i++]); |
|
case '%j': |
|
try { |
|
return JSON.stringify(args[i++]); |
|
} catch (_) { |
|
return '[Circular]'; |
|
} |
|
default: |
|
return x; |
|
} |
|
}); |
|
for (var x = args[i]; i < len; x = args[++i]) { |
|
if (isNull(x) || !isObject(x)) { |
|
str += ' ' + x; |
|
} else { |
|
str += ' ' + inspect(x); |
|
} |
|
} |
|
return str; |
|
}; |
|
|
|
|
|
// Mark that a method should not be used. |
|
// Returns a modified function which warns once by default. |
|
// If --no-deprecation is set, then it is a no-op. |
|
exports.deprecate = function(fn, msg) { |
|
// Allow for deprecating things in the process of starting up. |
|
if (isUndefined(global.process)) { |
|
return function() { |
|
return exports.deprecate(fn, msg).apply(this, arguments); |
|
}; |
|
} |
|
|
|
if (process.noDeprecation === true) { |
|
return fn; |
|
} |
|
|
|
var warned = false; |
|
function deprecated() { |
|
if (!warned) { |
|
if (process.throwDeprecation) { |
|
throw new Error(msg); |
|
} else if (process.traceDeprecation) { |
|
console.trace(msg); |
|
} else { |
|
console.error(msg); |
|
} |
|
warned = true; |
|
} |
|
return fn.apply(this, arguments); |
|
} |
|
|
|
return deprecated; |
|
}; |
|
|
|
|
|
var debugs = {}; |
|
var debugEnviron; |
|
exports.debuglog = function(set) { |
|
if (isUndefined(debugEnviron)) |
|
debugEnviron = process.env.NODE_DEBUG || ''; |
|
set = set.toUpperCase(); |
|
if (!debugs[set]) { |
|
if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { |
|
var pid = process.pid; |
|
debugs[set] = function() { |
|
var msg = exports.format.apply(exports, arguments); |
|
console.error('%s %d: %s', set, pid, msg); |
|
}; |
|
} else { |
|
debugs[set] = function() {}; |
|
} |
|
} |
|
return debugs[set]; |
|
}; |
|
|
|
|
|
/** |
|
* Echos the value of a value. Trys to print the value out |
|
* in the best way possible given the different types. |
|
* |
|
* @param {Object} obj The object to print out. |
|
* @param {Object} opts Optional options object that alters the output. |
|
*/ |
|
/* legacy: obj, showHidden, depth, colors*/ |
|
function inspect(obj, opts) { |
|
// default options |
|
var ctx = { |
|
seen: [], |
|
stylize: stylizeNoColor |
|
}; |
|
// legacy... |
|
if (arguments.length >= 3) ctx.depth = arguments[2]; |
|
if (arguments.length >= 4) ctx.colors = arguments[3]; |
|
if (isBoolean(opts)) { |
|
// legacy... |
|
ctx.showHidden = opts; |
|
} else if (opts) { |
|
// got an "options" object |
|
exports._extend(ctx, opts); |
|
} |
|
// set default options |
|
if (isUndefined(ctx.showHidden)) ctx.showHidden = false; |
|
if (isUndefined(ctx.depth)) ctx.depth = 2; |
|
if (isUndefined(ctx.colors)) ctx.colors = false; |
|
if (isUndefined(ctx.customInspect)) ctx.customInspect = true; |
|
if (ctx.colors) ctx.stylize = stylizeWithColor; |
|
return formatValue(ctx, obj, ctx.depth); |
|
} |
|
exports.inspect = inspect; |
|
|
|
|
|
// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics |
|
inspect.colors = { |
|
'bold' : [1, 22], |
|
'italic' : [3, 23], |
|
'underline' : [4, 24], |
|
'inverse' : [7, 27], |
|
'white' : [37, 39], |
|
'grey' : [90, 39], |
|
'black' : [30, 39], |
|
'blue' : [34, 39], |
|
'cyan' : [36, 39], |
|
'green' : [32, 39], |
|
'magenta' : [35, 39], |
|
'red' : [31, 39], |
|
'yellow' : [33, 39] |
|
}; |
|
|
|
// Don't use 'blue' not visible on cmd.exe |
|
inspect.styles = { |
|
'special': 'cyan', |
|
'number': 'yellow', |
|
'boolean': 'yellow', |
|
'undefined': 'grey', |
|
'null': 'bold', |
|
'string': 'green', |
|
'date': 'magenta', |
|
// "name": intentionally not styling |
|
'regexp': 'red' |
|
}; |
|
|
|
|
|
function stylizeWithColor(str, styleType) { |
|
var style = inspect.styles[styleType]; |
|
|
|
if (style) { |
|
return '\u001b[' + inspect.colors[style][0] + 'm' + str + |
|
'\u001b[' + inspect.colors[style][1] + 'm'; |
|
} else { |
|
return str; |
|
} |
|
} |
|
|
|
|
|
function stylizeNoColor(str, styleType) { |
|
return str; |
|
} |
|
|
|
|
|
function arrayToHash(array) { |
|
var hash = {}; |
|
|
|
array.forEach(function(val, idx) { |
|
hash[val] = true; |
|
}); |
|
|
|
return hash; |
|
} |
|
|
|
|
|
function formatValue(ctx, value, recurseTimes) { |
|
// Provide a hook for user-specified inspect functions. |
|
// Check that value is an object with an inspect function on it |
|
if (ctx.customInspect && |
|
value && |
|
isFunction(value.inspect) && |
|
// Filter out the util module, it's inspect function is special |
|
value.inspect !== exports.inspect && |
|
// Also filter out any prototype objects using the circular check. |
|
!(value.constructor && value.constructor.prototype === value)) { |
|
var ret = value.inspect(recurseTimes, ctx); |
|
if (!isString(ret)) { |
|
ret = formatValue(ctx, ret, recurseTimes); |
|
} |
|
return ret; |
|
} |
|
|
|
// Primitive types cannot have properties |
|
var primitive = formatPrimitive(ctx, value); |
|
if (primitive) { |
|
return primitive; |
|
} |
|
|
|
// Look up the keys of the object. |
|
var keys = Object.keys(value); |
|
var visibleKeys = arrayToHash(keys); |
|
|
|
if (ctx.showHidden) { |
|
keys = Object.getOwnPropertyNames(value); |
|
} |
|
|
|
// IE doesn't make error fields non-enumerable |
|
// http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx |
|
if (isError(value) |
|
&& (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { |
|
return formatError(value); |
|
} |
|
|
|
// Some type of object without properties can be shortcutted. |
|
if (keys.length === 0) { |
|
if (isFunction(value)) { |
|
var name = value.name ? ': ' + value.name : ''; |
|
return ctx.stylize('[Function' + name + ']', 'special'); |
|
} |
|
if (isRegExp(value)) { |
|
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); |
|
} |
|
if (isDate(value)) { |
|
return ctx.stylize(Date.prototype.toString.call(value), 'date'); |
|
} |
|
if (isError(value)) { |
|
return formatError(value); |
|
} |
|
} |
|
|
|
var base = '', array = false, braces = ['{', '}']; |
|
|
|
// Make Array say that they are Array |
|
if (isArray(value)) { |
|
array = true; |
|
braces = ['[', ']']; |
|
} |
|
|
|
// Make functions say that they are functions |
|
if (isFunction(value)) { |
|
var n = value.name ? ': ' + value.name : ''; |
|
base = ' [Function' + n + ']'; |
|
} |
|
|
|
// Make RegExps say that they are RegExps |
|
if (isRegExp(value)) { |
|
base = ' ' + RegExp.prototype.toString.call(value); |
|
} |
|
|
|
// Make dates with properties first say the date |
|
if (isDate(value)) { |
|
base = ' ' + Date.prototype.toUTCString.call(value); |
|
} |
|
|
|
// Make error with message first say the error |
|
if (isError(value)) { |
|
base = ' ' + formatError(value); |
|
} |
|
|
|
if (keys.length === 0 && (!array || value.length == 0)) { |
|
return braces[0] + base + braces[1]; |
|
} |
|
|
|
if (recurseTimes < 0) { |
|
if (isRegExp(value)) { |
|
return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); |
|
} else { |
|
return ctx.stylize('[Object]', 'special'); |
|
} |
|
} |
|
|
|
ctx.seen.push(value); |
|
|
|
var output; |
|
if (array) { |
|
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); |
|
} else { |
|
output = keys.map(function(key) { |
|
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); |
|
}); |
|
} |
|
|
|
ctx.seen.pop(); |
|
|
|
return reduceToSingleString(output, base, braces); |
|
} |
|
|
|
|
|
function formatPrimitive(ctx, value) { |
|
if (isUndefined(value)) |
|
return ctx.stylize('undefined', 'undefined'); |
|
if (isString(value)) { |
|
var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') |
|
.replace(/'/g, "\\'") |
|
.replace(/\\"/g, '"') + '\''; |
|
return ctx.stylize(simple, 'string'); |
|
} |
|
if (isNumber(value)) |
|
return ctx.stylize('' + value, 'number'); |
|
if (isBoolean(value)) |
|
return ctx.stylize('' + value, 'boolean'); |
|
// For some reason typeof null is "object", so special case here. |
|
if (isNull(value)) |
|
return ctx.stylize('null', 'null'); |
|
} |
|
|
|
|
|
function formatError(value) { |
|
return '[' + Error.prototype.toString.call(value) + ']'; |
|
} |
|
|
|
|
|
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { |
|
var output = []; |
|
for (var i = 0, l = value.length; i < l; ++i) { |
|
if (hasOwnProperty(value, String(i))) { |
|
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, |
|
String(i), true)); |
|
} else { |
|
output.push(''); |
|
} |
|
} |
|
keys.forEach(function(key) { |
|
if (!key.match(/^\d+$/)) { |
|
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, |
|
key, true)); |
|
} |
|
}); |
|
return output; |
|
} |
|
|
|
|
|
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { |
|
var name, str, desc; |
|
desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; |
|
if (desc.get) { |
|
if (desc.set) { |
|
str = ctx.stylize('[Getter/Setter]', 'special'); |
|
} else { |
|
str = ctx.stylize('[Getter]', 'special'); |
|
} |
|
} else { |
|
if (desc.set) { |
|
str = ctx.stylize('[Setter]', 'special'); |
|
} |
|
} |
|
if (!hasOwnProperty(visibleKeys, key)) { |
|
name = '[' + key + ']'; |
|
} |
|
if (!str) { |
|
if (ctx.seen.indexOf(desc.value) < 0) { |
|
if (isNull(recurseTimes)) { |
|
str = formatValue(ctx, desc.value, null); |
|
} else { |
|
str = formatValue(ctx, desc.value, recurseTimes - 1); |
|
} |
|
if (str.indexOf('\n') > -1) { |
|
if (array) { |
|
str = str.split('\n').map(function(line) { |
|
return ' ' + line; |
|
}).join('\n').substr(2); |
|
} else { |
|
str = '\n' + str.split('\n').map(function(line) { |
|
return ' ' + line; |
|
}).join('\n'); |
|
} |
|
} |
|
} else { |
|
str = ctx.stylize('[Circular]', 'special'); |
|
} |
|
} |
|
if (isUndefined(name)) { |
|
if (array && key.match(/^\d+$/)) { |
|
return str; |
|
} |
|
name = JSON.stringify('' + key); |
|
if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { |
|
name = name.substr(1, name.length - 2); |
|
name = ctx.stylize(name, 'name'); |
|
} else { |
|
name = name.replace(/'/g, "\\'") |
|
.replace(/\\"/g, '"') |
|
.replace(/(^"|"$)/g, "'"); |
|
name = ctx.stylize(name, 'string'); |
|
} |
|
} |
|
|
|
return name + ': ' + str; |
|
} |
|
|
|
|
|
function reduceToSingleString(output, base, braces) { |
|
var numLinesEst = 0; |
|
var length = output.reduce(function(prev, cur) { |
|
numLinesEst++; |
|
if (cur.indexOf('\n') >= 0) numLinesEst++; |
|
return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; |
|
}, 0); |
|
|
|
if (length > 60) { |
|
return braces[0] + |
|
(base === '' ? '' : base + '\n ') + |
|
' ' + |
|
output.join(',\n ') + |
|
' ' + |
|
braces[1]; |
|
} |
|
|
|
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; |
|
} |
|
|
|
|
|
// NOTE: These type checking functions intentionally don't use `instanceof` |
|
// because it is fragile and can be easily faked with `Object.create()`. |
|
function isArray(ar) { |
|
return Array.isArray(ar); |
|
} |
|
exports.isArray = isArray; |
|
|
|
function isBoolean(arg) { |
|
return typeof arg === 'boolean'; |
|
} |
|
exports.isBoolean = isBoolean; |
|
|
|
function isNull(arg) { |
|
return arg === null; |
|
} |
|
exports.isNull = isNull; |
|
|
|
function isNullOrUndefined(arg) { |
|
return arg == null; |
|
} |
|
exports.isNullOrUndefined = isNullOrUndefined; |
|
|
|
function isNumber(arg) { |
|
return typeof arg === 'number'; |
|
} |
|
exports.isNumber = isNumber; |
|
|
|
function isString(arg) { |
|
return typeof arg === 'string'; |
|
} |
|
exports.isString = isString; |
|
|
|
function isSymbol(arg) { |
|
return typeof arg === 'symbol'; |
|
} |
|
exports.isSymbol = isSymbol; |
|
|
|
function isUndefined(arg) { |
|
return arg === void 0; |
|
} |
|
exports.isUndefined = isUndefined; |
|
|
|
function isRegExp(re) { |
|
return isObject(re) && objectToString(re) === '[object RegExp]'; |
|
} |
|
exports.isRegExp = isRegExp; |
|
|
|
function isObject(arg) { |
|
return typeof arg === 'object' && arg !== null; |
|
} |
|
exports.isObject = isObject; |
|
|
|
function isDate(d) { |
|
return isObject(d) && objectToString(d) === '[object Date]'; |
|
} |
|
exports.isDate = isDate; |
|
|
|
function isError(e) { |
|
return isObject(e) && |
|
(objectToString(e) === '[object Error]' || e instanceof Error); |
|
} |
|
exports.isError = isError; |
|
|
|
function isFunction(arg) { |
|
return typeof arg === 'function'; |
|
} |
|
exports.isFunction = isFunction; |
|
|
|
function isPrimitive(arg) { |
|
return arg === null || |
|
typeof arg === 'boolean' || |
|
typeof arg === 'number' || |
|
typeof arg === 'string' || |
|
typeof arg === 'symbol' || // ES6 symbol |
|
typeof arg === 'undefined'; |
|
} |
|
exports.isPrimitive = isPrimitive; |
|
|
|
exports.isBuffer = require('./support/isBuffer'); |
|
|
|
function objectToString(o) { |
|
return Object.prototype.toString.call(o); |
|
} |
|
|
|
|
|
function pad(n) { |
|
return n < 10 ? '0' + n.toString(10) : n.toString(10); |
|
} |
|
|
|
|
|
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', |
|
'Oct', 'Nov', 'Dec']; |
|
|
|
// 26 Feb 16:19:34 |
|
function timestamp() { |
|
var d = new Date(); |
|
var time = [pad(d.getHours()), |
|
pad(d.getMinutes()), |
|
pad(d.getSeconds())].join(':'); |
|
return [d.getDate(), months[d.getMonth()], time].join(' '); |
|
} |
|
|
|
|
|
// log is just a thin wrapper to console.log that prepends a timestamp |
|
exports.log = function() { |
|
console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); |
|
}; |
|
|
|
|
|
/** |
|
* Inherit the prototype methods from one constructor into another. |
|
* |
|
* The Function.prototype.inherits from lang.js rewritten as a standalone |
|
* function (not on Function.prototype). NOTE: If this file is to be loaded |
|
* during bootstrapping this function needs to be rewritten using some native |
|
* functions as prototype setup using normal JavaScript does not work as |
|
* expected during bootstrapping (see mirror.js in r114903). |
|
* |
|
* @param {function} ctor Constructor function which needs to inherit the |
|
* prototype. |
|
* @param {function} superCtor Constructor function to inherit prototype from. |
|
*/ |
|
exports.inherits = require('inherits'); |
|
|
|
exports._extend = function(origin, add) { |
|
// Don't do anything if add isn't an object |
|
if (!add || !isObject(add)) return origin; |
|
|
|
var keys = Object.keys(add); |
|
var i = keys.length; |
|
while (i--) { |
|
origin[keys[i]] = add[keys[i]]; |
|
} |
|
return origin; |
|
}; |
|
|
|
function hasOwnProperty(obj, prop) { |
|
return Object.prototype.hasOwnProperty.call(obj, prop); |
|
} |
|
|
|
}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) |
|
},{"./support/isBuffer":157,"_process":151,"inherits":156}]},{},[7]); |
|
|
|
|
|
// END aws .min.js |
|
|
|
return NS.AWS; |
|
}); |
It seems like some of the screenshots and samples are missing, any chance they can get corrected?