UNPKG

2.61 kBJavaScriptView Raw
1/*!
2 * statuses
3 * Copyright(c) 2014 Jonathan Ong
4 * Copyright(c) 2016 Douglas Christopher Wilson
5 * MIT Licensed
6 */
7
8'use strict'
9
10/**
11 * Module dependencies.
12 * @private
13 */
14
15var codes = require('./codes.json')
16
17/**
18 * Module exports.
19 * @public
20 */
21
22module.exports = status
23
24// status code to message map
25status.message = codes
26
27// status message (lower-case) to code map
28status.code = createMessageToStatusCodeMap(codes)
29
30// array of status codes
31status.codes = createStatusCodeList(codes)
32
33// status codes for redirects
34status.redirect = {
35 300: true,
36 301: true,
37 302: true,
38 303: true,
39 305: true,
40 307: true,
41 308: true
42}
43
44// status codes for empty bodies
45status.empty = {
46 204: true,
47 205: true,
48 304: true
49}
50
51// status codes for when you should retry the request
52status.retry = {
53 502: true,
54 503: true,
55 504: true
56}
57
58/**
59 * Create a map of message to status code.
60 * @private
61 */
62
63function createMessageToStatusCodeMap (codes) {
64 var map = {}
65
66 Object.keys(codes).forEach(function forEachCode (code) {
67 var message = codes[code]
68 var status = Number(code)
69
70 // populate map
71 map[message.toLowerCase()] = status
72 })
73
74 return map
75}
76
77/**
78 * Create a list of all status codes.
79 * @private
80 */
81
82function createStatusCodeList (codes) {
83 return Object.keys(codes).map(function mapCode (code) {
84 return Number(code)
85 })
86}
87
88/**
89 * Get the status code for given message.
90 * @private
91 */
92
93function getStatusCode (message) {
94 var msg = message.toLowerCase()
95
96 if (!Object.prototype.hasOwnProperty.call(status.code, msg)) {
97 throw new Error('invalid status message: "' + message + '"')
98 }
99
100 return status.code[msg]
101}
102
103/**
104 * Get the status message for given code.
105 * @private
106 */
107
108function getStatusMessage (code) {
109 if (!Object.prototype.hasOwnProperty.call(status.message, code)) {
110 throw new Error('invalid status code: ' + code)
111 }
112
113 return status.message[code]
114}
115
116/**
117 * Get the status code.
118 *
119 * Given a number, this will throw if it is not a known status
120 * code, otherwise the code will be returned. Given a string,
121 * the string will be parsed for a number and return the code
122 * if valid, otherwise will lookup the code assuming this is
123 * the status message.
124 *
125 * @param {string|number} code
126 * @returns {number}
127 * @public
128 */
129
130function status (code) {
131 if (typeof code === 'number') {
132 return getStatusMessage(code)
133 }
134
135 if (typeof code !== 'string') {
136 throw new TypeError('code must be a number or string')
137 }
138
139 // '403'
140 var n = parseInt(code, 10)
141 if (!isNaN(n)) {
142 return getStatusMessage(n)
143 }
144
145 return getStatusCode(code)
146}