Description
After reading through the codebase, my understanding of the subscription implementation is as follow :
- initial call
subscribe()
when a subscription operation hits the server, subscribe()
returns anAsyncIterator
- This
AsyncIterator
contains a stream of results of subsequent calls toexecute()
Again, if my understanding is correct, contextValue
is passed to subscribe
on the initial subscription operation and then passed down to execute
whenever an event triggers a reexecution.
In short, contextValue
is set once a subscription operation happens and will remain the same until the client unsubscribes.
A common graphql-js implementation is to use DataLoader as a batching/caching library. For queries and mutations, a set of fresh dataloader instances is usually bound to contextValue
on a per request basis. When the query/mutation is done, those DataLoader instances are left for garbage collection.
Now, subscription context has a much longer life span, making DataLoader caching behaviour unwarranted in most cases.
Ideally, I guess providing a way to set contextValue
per execute()
call would allow a behaviour that matches what one could except when setting contextValue
on a per request basis for queries and mutations.
Is there any way to do so in current implementation ? Is this a behaviour that could be implemented in graphql-js or should I settle for one context per subscription operation and work my way around that ?