UNPKG

rested

Version:

{REST}ed; {REST}ful Enterprise Data-as-a-Service (DaaS)

74 lines (62 loc) 2.07 kB
// __Dependencies__ const through = require('through2'); const Api = require('./Api'); const Controller = require('./Controller'); const Model = require('./Model'); const Query = require('./Query'); const HttpError = require('http-errors'); const Accept = require('./Accept'); let instance; const parsers = {}; const formatters = {}; // __Module Definition__ const rested = module.exports = () => rested.empty(); // __Public Members__ rested.rest = model => { if (!instance) instance = Api(); return instance.rest(model); }; rested.empty = () => { let previous = instance; instance = Api(); return previous; }; rested.formatters = (response, callback) => { if (response._headerSent) return callback(null, () => through.obj( function (ctx, enc, cb) { console.trace(ctx); this.emit('data', ctx); cb() }, function () { this.emit('end') } )); let handlers = { default: () => callback(HttpError.NotAcceptable()) }; Object.keys(formatters).map(mime => handlers[mime] = formatters[mime](callback)); response.format(handlers); }; // Adds a formatter for the given mime type. Needs a function that returns a stream. rested.setFormatter = (mime, f) => { formatters[mime] = callback => () => callback(null, f); return rested; }; rested.parser = mime => { // Default to JSON when no MIME type is provided. mime = mime || 'application/json'; // Not interested in any additional parameters at this point. mime = mime.split(';')[0].trim(); let handler = parsers[mime]; return handler ? handler() : undefined; }; // Adds a parser for the given mime type. Needs a function that returns a stream. rested.setParser = (mime, f) => { parsers[mime] = f; return rested; }; // __Expose Modules__ rested.Api = Api; rested.Model = Model; rested.Error = HttpError; rested.Controller = Controller; Api.container(rested); Controller.container(rested); Model.container(rested); Accept.apply(rested); // __Plugins__ require('baucis-links').apply(rested);