1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/rocketchat_ynh.git synced 2024-09-03 20:16:25 +02:00
rocketchat_ynh/sources/programs/server/packages/meteorhacks_inject-data.js
2016-04-29 16:32:48 +02:00

144 lines
7.6 KiB
JavaScript

(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var EJSON = Package.ejson.EJSON;
var _ = Package.underscore._;
/* Package-scope variables */
var InjectData;
(function(){
///////////////////////////////////////////////////////////////////////
// //
// packages/meteorhacks_inject-data/lib/namespace.js //
// //
///////////////////////////////////////////////////////////////////////
//
InjectData = {}; // 1
///////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
///////////////////////////////////////////////////////////////////////
// //
// packages/meteorhacks_inject-data/lib/utils.js //
// //
///////////////////////////////////////////////////////////////////////
//
InjectData._encode = function(ejson) { // 1
var ejsonString = EJSON.stringify(ejson); // 2
return encodeURIComponent(ejsonString); // 3
}; // 4
// 5
InjectData._decode = function(encodedEjson) { // 6
var decodedEjsonString = decodeURIComponent(encodedEjson); // 7
if(!decodedEjsonString) return null; // 8
// 9
return EJSON.parse(decodedEjsonString); // 10
}; // 11
// 12
///////////////////////////////////////////////////////////////////////
}).call(this);
(function(){
///////////////////////////////////////////////////////////////////////
// //
// packages/meteorhacks_inject-data/lib/server.js //
// //
///////////////////////////////////////////////////////////////////////
//
var http = Npm.require('http'); // 1
// 2
var templateText = Assets.getText('lib/inject.html'); // 3
var injectDataTemplate = _.template(templateText); // 4
// 5
// custome API // 6
InjectData.pushData = function pushData(res, key, value) { // 7
if(!res._injectPayload) { // 8
res._injectPayload = {}; // 9
} // 10
// 11
res._injectPayload[key] = value; // 12
InjectData._hijackWriteIfNeeded(res); // 13
}; // 14
// 15
InjectData.getData = function getData(res, key) { // 16
if(res._injectPayload) { // 17
return _.clone(res._injectPayload[key]); // 18
} else { // 19
return null; // 20
} // 21
}; // 22
// 23
InjectData._hijackWriteIfNeeded = function(res) { // 24
if(res._writeHijacked) { // 25
return; // 26
} // 27
res._writeHijacked = true; // 28
// 29
var originalWrite = res.write; // 30
res.write = function(chunk, encoding) { // 31
var condition = // 32
res._injectPayload && !res._injected && // 33
encoding === undefined && // 34
/<!DOCTYPE html>/.test(chunk); // 35
// 36
if(condition) { // 37
// if cors headers included if may cause some security holes // 38
// so we simply turn off injecting if we detect an cors header
// read more: http://goo.gl/eGwb4e // 40
if(res._headers['access-control-allow-origin']) { // 41
var warnMessage = // 42
'warn: injecting data turned off due to CORS headers. ' + // 43
'read more: http://goo.gl/eGwb4e'; // 44
// 45
console.warn(warnMessage); // 46
originalWrite.call(res, chunk, encoding); // 47
return; // 48
} // 49
// 50
// inject data // 51
var data = InjectData._encode(res._injectPayload); // 52
var injectHtml = injectDataTemplate({data: data}); // 53
// 54
// if this is a buffer, convert it to string // 55
chunk = chunk.toString(); // 56
chunk = chunk.replace('<script', injectHtml + '<script'); // 57
// 58
res._injected = true; // 59
} // 60
// 61
originalWrite.call(res, chunk, encoding); // 62
}; // 63
}; // 64
// 65
///////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package['meteorhacks:inject-data'] = {
InjectData: InjectData
};
})();
//# sourceMappingURL=meteorhacks_inject-data.js.map