Projekt

Obecné

Profil

Stáhnout (3.27 KB) Statistiky
| Větev: | Revize:
1
/*!
2
 * negotiator
3
 * Copyright(c) 2012 Federico Romero
4
 * Copyright(c) 2012-2014 Isaac Z. Schlueter
5
 * Copyright(c) 2015 Douglas Christopher Wilson
6
 * MIT Licensed
7
 */
8

    
9
'use strict';
10

    
11
/**
12
 * Cached loaded submodules.
13
 * @private
14
 */
15

    
16
var modules = Object.create(null);
17

    
18
/**
19
 * Module exports.
20
 * @public
21
 */
22

    
23
module.exports = Negotiator;
24
module.exports.Negotiator = Negotiator;
25

    
26
/**
27
 * Create a Negotiator instance from a request.
28
 * @param {object} request
29
 * @public
30
 */
31

    
32
function Negotiator(request) {
33
  if (!(this instanceof Negotiator)) {
34
    return new Negotiator(request);
35
  }
36

    
37
  this.request = request;
38
}
39

    
40
Negotiator.prototype.charset = function charset(available) {
41
  var set = this.charsets(available);
42
  return set && set[0];
43
};
44

    
45
Negotiator.prototype.charsets = function charsets(available) {
46
  var preferredCharsets = loadModule('charset').preferredCharsets;
47
  return preferredCharsets(this.request.headers['accept-charset'], available);
48
};
49

    
50
Negotiator.prototype.encoding = function encoding(available) {
51
  var set = this.encodings(available);
52
  return set && set[0];
53
};
54

    
55
Negotiator.prototype.encodings = function encodings(available) {
56
  var preferredEncodings = loadModule('encoding').preferredEncodings;
57
  return preferredEncodings(this.request.headers['accept-encoding'], available);
58
};
59

    
60
Negotiator.prototype.language = function language(available) {
61
  var set = this.languages(available);
62
  return set && set[0];
63
};
64

    
65
Negotiator.prototype.languages = function languages(available) {
66
  var preferredLanguages = loadModule('language').preferredLanguages;
67
  return preferredLanguages(this.request.headers['accept-language'], available);
68
};
69

    
70
Negotiator.prototype.mediaType = function mediaType(available) {
71
  var set = this.mediaTypes(available);
72
  return set && set[0];
73
};
74

    
75
Negotiator.prototype.mediaTypes = function mediaTypes(available) {
76
  var preferredMediaTypes = loadModule('mediaType').preferredMediaTypes;
77
  return preferredMediaTypes(this.request.headers.accept, available);
78
};
79

    
80
// Backwards compatibility
81
Negotiator.prototype.preferredCharset = Negotiator.prototype.charset;
82
Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets;
83
Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding;
84
Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings;
85
Negotiator.prototype.preferredLanguage = Negotiator.prototype.language;
86
Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages;
87
Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType;
88
Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes;
89

    
90
/**
91
 * Load the given module.
92
 * @private
93
 */
94

    
95
function loadModule(moduleName) {
96
  var module = modules[moduleName];
97

    
98
  if (module !== undefined) {
99
    return module;
100
  }
101

    
102
  // This uses a switch for static require analysis
103
  switch (moduleName) {
104
    case 'charset':
105
      module = require('./lib/charset');
106
      break;
107
    case 'encoding':
108
      module = require('./lib/encoding');
109
      break;
110
    case 'language':
111
      module = require('./lib/language');
112
      break;
113
    case 'mediaType':
114
      module = require('./lib/mediaType');
115
      break;
116
    default:
117
      throw new Error('Cannot find module \'' + moduleName + '\'');
118
  }
119

    
120
  // Store to prevent invoking require()
121
  modules[moduleName] = module;
122

    
123
  return module;
124
}
(4-4/5)