UNPKG

rbxjs-plus

Version:

A system allowing access to roblox functions.

86 lines (80 loc) 1.96 kB
// Dependencies var events = require('events'); // Includes var settings = require('../../settings.json'); // Args exports.required = ['getLatest', 'delay']; exports.optional = ['timeout']; // Define exports.func = function (args) { var latest = args.getLatest; var delay = args.delay; delay = typeof delay === 'string' || delay instanceof String ? settings.event[delay] : delay; var retries = 0; var max = settings.event.maxRetries; var timeout = args.timeout || settings.event.timeout; var stop = false; var current; var evt = new events.EventEmitter(); var run; run = function (value) { if (stop) { return; } var promise = latest(value, evt); if (timeout > 0) { promise = promise.timeout(timeout); } return promise.then(function (response) { if (stop) { return; } if (value === -1) { current = response.latest; } retries = 0; var data = response.data; if (data.length > 0 && (value !== -1 || current === -2)) { current = response.latest; for (var i = 0; i < data.length; i++) { evt.emit('data', data[i]); } } if (response.repeat) { run(current); } else { setTimeout(run, delay, current); } return response; }) .catch(function (err) { if (stop) { return; } evt.emit('error', err); retries++; if (retries > max) { evt.emit('close', new Error('Max retries reached')); } else { setTimeout(run, delay, current); } }); }; run(-1) .then(function (response) { if (stop) { return; } evt.emit('connect', response.latest); }) .catch(function (err) { evt.emit('close', new Error('Initialization failed: ' + err.message)); }); evt.on('close', function (err) { stop = true; if (err) { evt.emit('error', err); } }); return evt; };