Skip to content

Instantly share code, notes, and snippets.

@ibolmo
Last active October 6, 2016 01:44
Show Gist options
  • Save ibolmo/54ea103ba7f99d6cdad656294dba6a20 to your computer and use it in GitHub Desktop.
Save ibolmo/54ea103ba7f99d6cdad656294dba6a20 to your computer and use it in GitHub Desktop.
This is portion of the https://github.com/ibolmo/github-spy main index.js file. Refactored, and documented for edification.
var pagesEnroute = {};
var keensEnroute = {};
var uid = 0;
USERS.forEach(function(user){
var handleEvents = function(err, events){
if (err) throw new Error(err);
debug('found ' + events.length + ' events');
// loop from ealiest first
events.reverse().forEach(function(activity){
// ensure we are progressing in time
// the db looks like an object with { username: timestamp }
// noticed that GitHub activity events' ids are naturally ascending
if (Number(activity.id) > Number(db[user] || 0)) {
// update last seen timestamp
db[user] = activity.id;
var payload = {
user: user,
keen: { timestamp: new Date(activity.created_at).toISOString() },
actor: activity.actor.login,
repo: activity.repo.name
};
debug(user + ' (' + activity.type + ') ' + JSON.stringify(payload, null, ' '));
var i = uid++;
// set flag that keen is trying to post a tracking event
keensEnroute[i] = true;
keen.recordEvent(activity.type, payload, function(){
// thanks to function scope we can delete the flag.. regardless of success
delete keensEnroute[i];
// if there are no keen tasks posting a tracking event we are done
// this assumes that recordEvent is slower than a process tick
if (!Object.keys(keensEnroute).length){
debug('all events tracked');
process.exit();
}
});
}
});
// the response (events) is in descending order. this gets last item (earliest activity)
var earliest = events.slice(-1)[0];
var needsToFetchMore = earliest && (Number(earliest.id) > Number(db[user]));
debug(user + (needsToFetchMore ? ' needs to fetch more' : ' has no more events'));
if (github.hasNextPage(events) && needsToFetchMore){
debug('Getting next page: ' + events.link);
github.getNextPage(events, handleEvents);
} else {
debug('Done. Last event: ' + db[user]);
fs.writeFileSync(DB_FILE, JSON.stringify(db, null, ' '));
delete pagesEnroute[user];
if (!Object.keys(pagesEnroute).length){
debug('all pages requested');
}
}
};
// set flag that we're getting the events for the user via the github api
pagesEnroute[user] = true;
github.activity.getEventsForUser({ user: user, per_page: 100 }, handleEvents);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment