I would avoid the complexity of a rprototype and just 

    return { 
      push: ...
      pull: ...
      cancel: function() { push.cancel(); .....

Seems simpler