opusdev/vector-similarity-api
1
1/*!2 * statuses3 * Copyright(c) 2014 Jonathan Ong4 * Copyright(c) 2016 Douglas Christopher Wilson5 * MIT Licensed6 */7 8'use strict'9 10/**11 * Module dependencies.12 * @private13 */14 15var codes = require('./codes.json')16 17/**18 * Module exports.19 * @public20 */21 22module.exports = status23 24// status code to message map25status.message = codes26 27// status message (lower-case) to code map28status.code = createMessageToStatusCodeMap(codes)29 30// array of status codes31status.codes = createStatusCodeList(codes)32 33// status codes for redirects34status.redirect = {35 300: true,36 301: true,37 302: true,38 303: true,39 305: true,40 307: true,41 308: true42}43 44// status codes for empty bodies45status.empty = {46 204: true,47 205: true,48 304: true49}50 51// status codes for when you should retry the request52status.retry = {53 502: true,54 503: true,55 504: true56}57 58/**59 * Create a map of message to status code.60 * @private61 */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 map71 map[message.toLowerCase()] = status72 })73 74 return map75}76 77/**78 * Create a list of all status codes.79 * @private80 */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 * @private91 */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 * @private106 */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 status120 * code, otherwise the code will be returned. Given a string,121 * the string will be parsed for a number and return the code122 * if valid, otherwise will lookup the code assuming this is123 * the status message.124 *125 * @param {string|number} code126 * @returns {number}127 * @public128 */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}147 