UNPKG

content-type-router

Version:

This is a strictly structured router module designed for internal use only. It assumes all incoming request are either json, text or file/blob via POST method. It doesn't parse flexible parameter in path either.

97 lines (96 loc) 3.42 kB
'use strict'; async function init(req, res, env, map) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); res.setHeader('Access-Control-Allow-Credentials', false); res.setHeader('Access-Control-Max-Age', '3600'); res.setHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization'); if (map[req.url]) { switch (req.method) { case 'OPTIONS': res.statusCode = 200; res.end(); break; case 'GET': map[req.url](req, res, env); break; case 'POST': switch (req.headers['content-type']) { case 'application/json': { let json = await processJson(req, res); await map[req.url](req, res, env, json); break; } case 'undefined': case 'null': case '': case undefined: case null: res.statusCode = 406; res.statusMessage = "The provided content MIME type is not acceptable"; res.end(); break; default: { let file = await processFile(req, res); await map[req.url](req, res, env, file); break; } } break; default: res.statusCode = 406; res.statusMessage = "The provided method is not acceptable"; res.end(); } } else { res.statusCode = 404; res.statusMessage = "Service does not exist"; res.end(); } } async function processJson(req, res) { return new Promise(function(resolve, reject) { try { let text = ''; let json = {}; req.on('data', (chunk) => { text += chunk; }); req.on('end', () => { json = JSON.parse(text) || {}; resolve(json); }); } catch (e) { res.statusCode = 406; res.statusMessage = "The incoming JSON string is invalid"; res.end(); reject(e); } }); } async function processFile(req, res) { return new Promise(function(resolve, reject) { try { let buffer = Buffer.alloc(0); req.on('data', (chunk) => { buffer = Buffer.concat([buffer, chunk]); }); req.on('end', () => { let file = { buffer: buffer, contentType: req.headers['content-type'], contentCategory: req.headers['content-type'].split('/')[0] }; resolve(file); }); } catch (e) { res.statusCode = 500; res.statusMessage = "Something goes wrong while parsing FILE"; res.end(); reject(e); } }); } exports.init = init;