Last active
October 6, 2016 01:44
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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