-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
121 lines (98 loc) · 3.56 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
'use strict';
var _ = require('underscore');
var ua = require('./lib/ua');
var deepval = require('deepval');
var path = require('path');
var version = require('./package').version;
var rind = {
name: 'rind-hapi',
version: version,
attributes: {
pkg: require('./package.json')
},
register: function(plugin, options, next) {
var conf = _.extend({}, options.conf);
if (conf.redact) {
// remove any sensitive app config values from those potentially sent to client
conf.redact.forEach(function(r) {
deepval(conf, r, null, true);
});
deepval(conf, 'redact', null, true);
}
var locale = require('rind-locale')({
locales: options.locales
});
var i18n = require('rind-i18n')({
cwd: path.join(path.dirname(module.parent.filename), 'lang')
});
var assets = require('./lib/assets')({
assets: options.assets
});
plugin.ext('onRequest', function(request, extNext) {
request.headers = request.headers || {};
request.query = request.query || {};
request.pre.locale = locale(request.query.locale || request.headers['accept-language']);
request.pre.lang = request.pre.locale.substring(0, 2);
request.pre.i18n = i18n[request.pre.locale];
request.pre.ua = ua(request.headers['user-agent']);
request.pre.assets = assets(request.url);
extNext();
});
plugin.ext('onPreResponse', function(request, extNext) {
var response = request.response;
if (response.variety === 'view' || response.isBoom) {
var context;
if (response.isBoom) {
// boom objects do not have a source.context
// so attach context info directly
context = response.context = {};
} else {
context = response.source.context;
}
// create the rind object
context.rind = context.rind || {};
context.rind.context = context.rind.context || {};
context.rind.config = context.rind.config || {};
// populate dump
context.dump = context.dump || {};
// attach app conf values
context.rind.config = _.extend(conf);
// attach locale details
context.rind.context.locale = request.pre.locale || {};
// add i18n functions to top level scope
context.i18n = request.pre.i18n || {};
// attach useragent info
context.rind.context.ua = request.pre.ua || {};
// attach assets to serve
context.rind.context.assets = request.pre.assets || {};
// add the assets hash (allows production asset mapping) to top level scope
context.hash = options.hash;
// add each individual cookie to the context under the key "cookie"
context.cookie = {};
_.each(request.state, function(cookie, key) {
context.cookie[key] = cookie;
});
// parse rind debug cookie
if (context.cookie.rind) {
var rindCookie = {};
try {
context.cookie.rind.split('|').forEach(function(kvp) {
kvp = kvp.split(':');
var key = kvp[0];
var value = kvp[1] || true;
rindCookie[key] = value;
});
} catch (e) {}
context.cookie.rind = rindCookie;
}
// make pathname available
context.rind.context.pathname = request.path;
// add url to the context
context.rind.context.url = context.rind.context.url || request.server.info.protocol + '://' + request.info.host + request.path;
}
extNext();
});
next();
}
};
module.exports = rind;