UNPKG

alpha-one

Version:

ideas about recurring tasks in Web- and Backend-Application building

277 lines (245 loc) 8.71 kB
// Generated by CoffeeScript 1.7.1 (function() { var OPTIONS, TRM, TYPES, alert, app_info, badge, debug, echo, express, help, info, log, njs_path, rpr, warn, whisper; njs_path = require('path'); OPTIONS = require('coffeenode-options'); TYPES = require('coffeenode-types'); TRM = require('coffeenode-trm'); rpr = TRM.rpr.bind(TRM); badge = 'α1/main'; log = TRM.get_logger('plain', badge); info = TRM.get_logger('info', badge); whisper = TRM.get_logger('whisper', badge); alert = TRM.get_logger('alert', badge); debug = TRM.get_logger('debug', badge); warn = TRM.get_logger('warn', badge); help = TRM.get_logger('help', badge); echo = TRM.echo.bind(TRM); express = require('express'); this.HTTP = require('./http'); app_info = OPTIONS.get_app_info(); /* Name used to store info on the `request` object: */ this.get_request_counter = function() { var request_count; request_count = 0; return (function(_this) { return function(request, response, next) { request['count'] = (request_count += 1); return next(); }; })(this); }; this.show_debug_info = function() { return (function(_this) { return function(request, response, next) { var session_cookie, _ref; log(TRM.blue('show_debug_info')); debug('session ID:', request['sessionID']); debug('cookies:', request['cookies']); if ((session_cookie = (_ref = request['session']) != null ? _ref['cookie'] : void 0) != null) { debug('session cookie:', session_cookie); } else { whisper('no session or no cookie in session'); } info(request['body']); return next(); }; })(this); }; this.show_sid = function(secret) { var prefix, signature; if (secret == null) { throw new Error("middleware `show_sid` must be called with the secret session key"); } signature = require('cookie-signature'); prefix = 's:'; return (function(_this) { return function(request, response, next) { var sid; debug('©38z', request['cookies']); sid = request['cookies']['connect.sid']; if (sid != null) { info("client has SID", rpr(signature.unsign(sid.replace(prefix, ''), secret))); } else { info("client has no SID"); } return next(); }; })(this); }; this.add_request_options = function() { /* This middleware adds a plain old dictionary to the request object as `request[ 'alpha-one' ]`; other middleware methods may use it to store values and add methods. */ return (function(_this) { return function(request, response, next) { if (request['A1'] != null) { throw new Error("app key 'A1' already present on request"); } request['A1'] = {}; _this.HTTP._add_options(request, response); return next(); }; })(this); }; this.page_modifier = function() { return (function(_this) { return function(request, response, next) { var mark, marks, matcher, method_name, _fn, _i, _len; request.on('page ready', function() { return debug("page ready"); }); marks = ['head-top', 'head-bottom', 'body-top', 'body-bottom']; _fn = function(mark, matcher, method_name) { var method; method = function(text) { var replacement; replacement = /-top$/.test(method_name) ? matcher.concat(text) : text.concat(matcher); return this['A1']['page'] = this['A1']['page'].replace(matcher, replacement); }; return request['A1'][method_name] = method.bind(request); }; for (_i = 0, _len = marks.length; _i < _len; _i++) { mark = marks[_i]; matcher = '<!--#'.concat(mark, '-->'); method_name = 'add-to-'.concat(mark); _fn(mark, matcher, method_name); } return next(); }; })(this); }; this.flash_notifications = (function(_this) { return function() { var flash_messages; flash_messages = []; return function(request, response, next) { request.on('page ready', function() { response.cookie('flash-messages', JSON.stringify(flash_messages), { path: '*' }); return flash_messages.length = 0; }); request['A1']['flash-messages'] = flash_messages; request['A1']['flash'] = function(title, text) { var message; message = [title, text]; return flash_messages.push(message); }; return next(); }; }; })(this); this.get_view_for = function(templates) { return (function(_this) { return function(name, options) { var remember_location, _ref; if (options == null) { options = {}; } remember_location = (_ref = options['remember-location']) != null ? _ref : true; return function(request, response) { var content, content_already_done, content_done, error, on_error, page_already_done, page_done; content_already_done = false; page_already_done = false; /* TAINT code duplication; also used by @HTTP.bounce */ if (remember_location) { response.cookie('comes-from', request['url'], { path: '*' }); } on_error = function(error) { alert(error.stack); /* TAINT should use dedicated method or static page */ if (response.headerSent == null) { _this.HTTP.server_error(request, response); } response.write("an error has occurred"); return response.end(); }; content_done = function(content) { var page; log(TRM.blue('content_done')); if (content_already_done) { throw new Error("content already finished; cannot call `done()` anymore"); } content_already_done = true; if (content != null) { if (TYPES.isa_jserror(content)) { return on_error(content); } page = templates.layout(request, response, content, page_done); if (page != null) { TYPES.validate_isa_text(page); page_done(page); } } else { page_done(); } return null; }; page_done = function(page) { log(TRM.blue('page_done')); if (page_already_done) { throw new Error("page already finished; cannot call `done()` anymore"); } page_already_done = true; if ((request.listeners('page ready')).length > 0) { request['A1']['page'] = page; request.emit('page ready'); page = request['A1']['page']; } if (TYPES.isa_jserror(page)) { return on_error(page); } _this.HTTP.write_header(request, response); if (page != null) { response.write(page); } response.end(); return null; }; try { content = templates[name](request, response, content_done); if (content != null) { TYPES.validate_isa_text(content); content_done(content); } } catch (_error) { error = _error; on_error(error); } return null; }; }; })(this); }; this.get_restrict_view_for = function(templates) { return (function(_this) { return function(condition, name) { var view_method; if (condition !== 'user') { throw new Error("argument 'condition' not yet supported"); } view_method = (_this.get_view_for(templates))(name); return function(request, response, done) { var session; if ((session = request['session']) != null) { if (session['user'] != null) { log(TRM.blue('restrict_view: ok')); return view_method(request, response, done); } else { session['error'] = "Access denied!"; } } log(TRM.blue('restrict_view: not ok')); _this.HTTP.bounce(request, response, "/login"); _this.HTTP.write_header(request, response); debug('©23a', response.headerSent); response.end(); return null; }; }; })(this); }; }).call(this);