1) Prevents repeatedly wrapping ssrRender by checking if it's already been wrapped. Added a __IS_VUE_APOLLO_WRAPPED boolean to track this. I verified that this was actually happening by throwing an error if it was already wrapped, and I observed the error.
2) this.$options.ssrRender doesn't always exist, but this.$apollo does. When the new wrapped ssrRender was called, it would throw, which prevented the destroy.call(this) line from running. The fix here was to not create a wrapped ssrRender if there isn't an original one.
❓ I don't know why a cleanup function like destroy is called inside of a render function. Usually I'd expect to see that happen from a conventional lifecycle hook, like unmounted. Maybe this wrapped ssrRender should not happen at all?
Fixes https://github.com/vuejs/apollo/issues/1550
Two leaks were fixed:
1) Prevents repeatedly wrapping
ssrRender
by checking if it's already been wrapped. Added a__IS_VUE_APOLLO_WRAPPED
boolean to track this. I verified that this was actually happening by throwing an error if it was already wrapped, and I observed the error.2)
this.$options.ssrRender
doesn't always exist, but this.$apollo does. When the new wrappedssrRender
was called, it would throw, which prevented thedestroy.call(this)
line from running. The fix here was to not create a wrappedssrRender
if there isn't an original one.❓ I don't know why a cleanup function like
destroy
is called inside of a render function. Usually I'd expect to see that happen from a conventional lifecycle hook, likeunmounted
. Maybe this wrappedssrRender
should not happen at all?