UNPKG

@resourcefulhumans/rheactor-aws-lambda

Version:
78 lines (67 loc) 2.64 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.header = header; exports.checkContentType = checkContentType; exports.getOptionalToken = getOptionalToken; var _jsonwebtoken = require('jsonwebtoken'); var _jsonwebtoken2 = _interopRequireDefault(_jsonwebtoken); var _rheactorModels = require('rheactor-models'); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _tcomb = require('tcomb'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @param {Array<String>} headers * @param {String} header * @returns {String} */ function header(headers, header) { if (!headers || headers === null) return false; var lowerCaseHeaders = {}; for (var k in headers) { lowerCaseHeaders[k.toLowerCase()] = headers[k]; } return lowerCaseHeaders[header.toLowerCase()]; } /** * @param {{headers: {Object}, path: {String}, httpMethod: {String}, body: {String}}} event * @param {String} expectedContentType * @returns {boolean} */ function checkContentType(event, expectedContentType) { (0, _tcomb.String)(expectedContentType, ['checkContentType', 'expectedContentType:String']); var ctype = header(event.headers, 'Content-Type'); if (!ctype) { throw new Error('Must provide Content-Type.'); } var splitted = ctype.split(';', 2); var type = splitted[0]; if (type.toLowerCase() !== expectedContentType.toLowerCase()) { throw new Error('Unsupported content type: "' + type + '".'); } if (splitted.length > 1) { var match = splitted[1].match(/charset=([^ ]+)/); if (match[1] && match[1].toLowerCase() !== 'utf-8') throw new Error('Unsupported encoding: "' + match[1] + '", only UTF-8 is supported.'); } return true; } /** * @param {{headers: {Object}, path: {String}, httpMethod: {String}, body: {String}}} event * @param {String} secretOrPrivateKey * @returns {boolean} */ function getOptionalToken(event, secretOrPrivateKey) { (0, _tcomb.String)(secretOrPrivateKey, ['getOptionalToken', 'secretOrPrivateKey:String']); var authorization = header(event.headers, 'Authorization'); if (!authorization) return _bluebird2.default.resolve(); if (!/^Bearer /.test(authorization)) throw new Error('Must provide bearer authorization!'); var token = authorization.match(/^Bearer (.+)/)[1]; return new _bluebird2.default(function (resolve, reject) { return _jsonwebtoken2.default.verify(token, secretOrPrivateKey, function (error) { if (error) return reject(error); return resolve(new _rheactorModels.JsonWebToken(token)); }); }); }