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/arunoda_streams.js
2016-04-29 16:32:48 +02:00

274 lines
29 KiB
JavaScript

(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var _ = Package.underscore._;
/* Package-scope variables */
var EV;
(function(){
///////////////////////////////////////////////////////////////////////
// //
// packages/arunoda_streams/packages/arunoda_streams.js //
// //
///////////////////////////////////////////////////////////////////////
//
(function () { // 1
// 2
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/arunoda:streams/lib/ev.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
function _EV() { // 1
var self = this; // 2
var handlers = {}; // 3
// 4
self.emit = function emit(event) { // 5
var args = Array.prototype.slice.call(arguments, 1); // 6
// 7
if(handlers[event]) { // 8
for(var lc=0; lc<handlers[event].length; lc++) { // 9
var handler = handlers[event][lc]; // 10
handler.apply(this, args); // 11
} // 12
} // 13
}; // 14
// 15
self.on = function on(event, callback) { // 16
if(!handlers[event]) { // 17
handlers[event] = []; // 18
} // 19
handlers[event].push(callback); // 20
}; // 21
// 22
self.once = function once(event, callback) { // 23
self.on(event, function onetimeCallback() { // 24
callback.apply(this, arguments); // 25
self.removeListener(event, onetimeCallback); // 26
}); // 27
}; // 28
// 29
self.removeListener = function removeListener(event, callback) { // 30
if(handlers[event]) { // 31
var index = handlers[event].indexOf(callback); // 32
handlers[event].splice(index, 1); // 33
} // 34
}; // 35
// 36
self.removeAllListeners = function removeAllListeners(event) { // 37
handlers[event] = undefined; // 38
}; // 39
} // 40
// 41
EV = _EV; // 42
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 52
}).call(this); // 53
// 54
// 55
// 56
// 57
// 58
// 59
(function () { // 60
// 61
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/arunoda:streams/lib/server.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
var EventEmitter = Npm.require('events').EventEmitter; // 1
var util = Npm.require('util'); // 2
var Fibers = Npm.require('fibers'); // 3
// 4
Meteor.Stream = function Stream(name) { // 5
EV.call(this); // 6
// 7
var self = this; // 8
var streamName = 'stream-' + name; // 9
var allowFunction; // 10
var allowResultCache = true; // 11
var allowResults = {}; // 12
var filters = []; // 13
// 14
self.name = name; // 15
// 16
var events = new EventEmitter(); // 17
events.setMaxListeners(0); // 18
// 19
var disconnectEvents = new EV(); // 20
// 21
self._emit = self.emit; // 22
self.emit = function emit() { // 23
self.emitToSubscriptions(arguments, null, null); // 24
}; // 25
// 26
var defaultResult = (typeof(Package) == 'object' && Package.insecure)? true: Meteor.Collection.insecure === true; // 27
self.permissions = new Meteor.Stream.Permission(defaultResult, true); // 28
// 29
self.addFilter = function addFilter(callback) { // 30
filters.push(callback); // 31
}; // 32
// 33
self.emitToSubscriptions = function emitToSubscriptions(args, subscriptionId, userId) { // 34
events.emit('item', {args: args, userId: userId, subscriptionId: subscriptionId}); // 35
}; // 36
// 37
Meteor.publish(streamName, function() { // 38
check(arguments, Match.Any); // 39
var subscriptionId = Random.id(); // 40
var publication = this; // 41
// 42
//send subscription id as the first document // 43
publication.added(streamName, subscriptionId, {type: 'subscriptionId'}); // 44
publication.ready(); // 45
events.on('item', onItem); // 46
// 47
function onItem(item) { // 48
Fibers(function() { // 49
var id = Random.id(); // 50
if(self.permissions.checkPermission('read', subscriptionId, publication.userId, item.args)) { // 51
//do not send again this to the sender // 52
if(subscriptionId != item.subscriptionId) { // 53
publication.added(streamName, id, item); // 54
publication.removed(streamName, id); // 55
} // 56
} // 57
}).run(); // 58
} // 59
// 60
publication.onStop(function() { // 61
//trigger related onDisconnect handlers if exists // 62
Fibers(function() { // 63
disconnectEvents.emit(subscriptionId); // 64
disconnectEvents.removeAllListeners(subscriptionId); // 65
}).run(); // 66
events.removeListener('item', onItem); // 67
}); // 68
}); // 69
// 70
var methods = {}; // 71
methods[streamName] = function(subscriptionId, args) { // 72
check(arguments, Match.Any); // 73
//in order to send this to the server callback // 74
var userId = this.userId; // 75
Fibers(function() { // 76
var methodContext = {}; // 77
methodContext.userId = userId; // 78
methodContext.subscriptionId = subscriptionId; // 79
// 80
//in order to send this to the serve callback // 81
methodContext.allowed = self.permissions.checkPermission('write', subscriptionId, methodContext.userId, args); // 82
if(methodContext.allowed) { // 83
//apply filters // 84
args = applyFilters(args, methodContext); // 85
self.emitToSubscriptions(args, subscriptionId, methodContext.userId); // 86
//send to firehose if exists // 87
if(self.firehose) { // 88
self.firehose(args, subscriptionId, methodContext.userId); // 89
} // 90
} // 91
//need to send this to server always // 92
self._emit.apply(methodContext, args); // 93
// 94
//register onDisconnect handlers if provided // 95
if(typeof(methodContext.onDisconnect) == 'function') { // 96
disconnectEvents.on(subscriptionId, methodContext.onDisconnect) // 97
} // 98
// 99
}).run(); // 100
}; // 101
Meteor.methods(methods); // 102
// 103
function applyFilters(args, context) { // 104
var eventName = args.shift(); // 105
filters.forEach(function(filter) { // 106
args = filter.call(context, eventName, args); // 107
}); // 108
args.unshift(eventName); // 109
return args; // 110
} // 111
}; // 112
// 113
util.inherits(Meteor.Stream, EV); // 114
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 183
}).call(this); // 184
// 185
// 186
// 187
// 188
// 189
// 190
(function () { // 191
// 192
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/arunoda:streams/lib/stream_permission.js //
// //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
Meteor.Stream.Permission = function (acceptAll, cacheAll) { // 1
var options = { // 2
"read": { // 3
results: {} // 4
}, // 5
"write": { // 6
results: {} // 7
} // 8
}; // 9
// 10
this.read = function(func, cache) { // 11
options['read']['func'] = func; // 12
options['read']['doCache'] = (cache === undefined)? cacheAll: cache; // 13
}; // 14
// 15
this.write = function(func, cache) { // 16
options['write']['func'] = func; // 17
options['write']['doCache'] = (cache === undefined)? cacheAll: cache; // 18
}; // 19
// 20
this.checkPermission = function(type, subscriptionId, userId, args) { // 21
var eventName = args[0]; // 22
var namespace = subscriptionId + '-' + eventName; // 23
var result = options[type].results[namespace]; // 24
// 25
if(result === undefined) { // 26
var func = options[type].func; // 27
if(func) { // 28
var context = {subscriptionId: subscriptionId, userId: userId}; // 29
result = func.apply(context, args); // 30
if(options[type].doCache) { // 31
options[type].results[namespace] = result; // 32
} // 33
return result; // 34
} else { // 35
return acceptAll; // 36
} // 37
} else { // 38
return result; // 39
} // 40
}; // 41
} // 42
// 43
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 243
}).call(this); // 244
// 245
///////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package['arunoda:streams'] = {};
})();
//# sourceMappingURL=arunoda_streams.js.map