alpha-one
Version:
ideas about recurring tasks in Web- and Backend-Application building
277 lines (245 loc) • 8.71 kB
JavaScript
// 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);