region_config.js
 1  var util = require('./util');
 2  var regionConfig = require('./region_config_data.json');
 3  
 4  function generateRegionPrefix(region) {
 5    if (!region) return null;
 6  
 7    var parts = region.split('-');
 8    if (parts.length < 3) return null;
 9    return parts.slice(0, parts.length - 2).join('-') + '-*';
10  }
11  
12  function derivedKeys(service) {
13    var region = service.config.region;
14    var regionPrefix = generateRegionPrefix(region);
15    var endpointPrefix = service.api.endpointPrefix;
16  
17    return [
18      [region, endpointPrefix],
19      [regionPrefix, endpointPrefix],
20      [region, '*'],
21      [regionPrefix, '*'],
22      ['*', endpointPrefix],
23      ['*', '*']
24    ].map(function(item) {
25      return item[0] && item[1] ? item.join('/') : null;
26    });
27  }
28  
29  function applyConfig(service, config) {
30    util.each(config, function(key, value) {
31      if (key === 'globalEndpoint') return;
32      if (service.config[key] === undefined || service.config[key] === null) {
33        service.config[key] = value;
34      }
35    });
36  }
37  
38  function configureEndpoint(service) {
39    var keys = derivedKeys(service);
40    for (var i = 0; i < keys.length; i++) {
41      var key = keys[i];
42      if (!key) continue;
43  
44      if (Object.prototype.hasOwnProperty.call(regionConfig.rules, key)) {
45        var config = regionConfig.rules[key];
46        if (typeof config === 'string') {
47          config = regionConfig.patterns[config];
48        }
49  
50        // set dualstack endpoint
51        if (service.config.useDualstack && util.isDualstackAvailable(service)) {
52          config = util.copy(config);
53          config.endpoint = config.endpoint.replace(
54            /{service}\.({region}\.)?/,
55            '{service}.dualstack.{region}.'
56          );
57        }
58  
59        // set global endpoint
60        service.isGlobalEndpoint = !!config.globalEndpoint;
61        if (config.signingRegion) {
62          service.signingRegion = config.signingRegion;
63        }
64  
65        // signature version
66        if (!config.signatureVersion) config.signatureVersion = 'v4';
67  
68        // merge config
69        applyConfig(service, config);
70        return;
71      }
72    }
73  }
74  
75  function getEndpointSuffix(region) {
76    var regionRegexes = {
77      '^(us|eu|ap|sa|ca|me)\\-\\w+\\-\\d+$': 'amazonaws.com',
78      '^cn\\-\\w+\\-\\d+$': 'amazonaws.com.cn',
79      '^us\\-gov\\-\\w+\\-\\d+$': 'amazonaws.com',
80      '^us\\-iso\\-\\w+\\-\\d+$': 'c2s.ic.gov',
81      '^us\\-isob\\-\\w+\\-\\d+$': 'sc2s.sgov.gov'
82    };
83    var defaultSuffix = 'amazonaws.com';
84    var regexes = Object.keys(regionRegexes);
85    for (var i = 0; i < regexes.length; i++) {
86      var regionPattern = RegExp(regexes[i]);
87      var dnsSuffix = regionRegexes[regexes[i]];
88      if (regionPattern.test(region)) return dnsSuffix;
89    }
90    return defaultSuffix;
91  }
92  
93  /**
94   * @api private
95   */
96  module.exports = {
97    configureEndpoint: configureEndpoint,
98    getEndpointSuffix: getEndpointSuffix
99  };