fix(events): wrap events in promise
feat(hooks): add hooks