I'd like to figure out how to run some commands for a specific user when they disconnect. Is there something like a state that is stored to be able to reference within the onDisconnect hook?
The same webSocket instance is passed to all of the on* callbacks. You could use that to track custom state in a Map() or possibly on the webSocket itself.
Yeah I noticed that, I was wondering if I could stick some data in there, was thinking it would probably be just easiest to do it that way. Is there a reason I'd use one or the other?
Also how might I add data to the websocket? Any articles/ reference code you might be able to point me to?
Thanks so much!
Using an external Map() would ensure that you don't accidentally overwrite any state on the webSocket instance. Basic pattern would be:
onConnect(connectionParams, webSocket) {
clients.set(webSocket, {custom: 'data'});
}
onDisconnect(webSocket) {
const data = clients.get(webSocket);
// use data as needed
}
To add to this, I think it would be valuable if the context properties which are returned from onConnect() would be passed to onDisconnect() just like they are passed to the resolvers. This way, there would be one consistent way of tracking users/connections.
Here's a relevant thread on Apollo's Spectrum that has a code snippet on accessing onConnect()'s context in onDisconnect(). Appears to work for me!
Here's a simple version of what's shown in @mwood23's link.
subscriptions: {
onConnect: connectionParams => {
const apiKey = connectionParams['x-api-key'];
ensureApiKey(apiKey);
const user = Users.findOne({apiKey}) || {name: 'guest'};
log.info(`<ws> ${user.name} connected.`);
return {
user
};
},
onDisconnect: async (_, context) => {
const initialContext = await context.initPromise;
log.info(`<ws> ${initialContext.user.name} disconnected.`);
}
}
Most helpful comment
Here's a simple version of what's shown in @mwood23's link.