Add `socket.request()` as promise wrapper around callbacks
See original GitHub issueI noticed that in the 4.4.0 release, a timeout
flag was added:
socket.timeout(5000).emit("my-event", (err) => {
if (err) {
// the client did not acknowledge the event in the given delay
}
});
Interestingly I implemented similar logic in an application of mine by patching client-side sockets, but I combined it with promises as well. Something like
await socket.request('event', 'some data');
where the promise times out after a fixed amount of time if the server did not acknowledge.
As a result, I was wondering whether it would a nice feature to add to the library as well. The api would look something like
// Awaits indefinitely for a server response
await socket.request('event', 'some data');
// Times out after 5 seconds
await socket.timeout(5e3).request('event', 'some data');
This could be accompanied by a reply()
and replyAny()
method as well of course, which looks something like this and hence hides the callbacks from the user alltogether:
socket.reply('event', async (data) => {
return res.toJSON();
});
socket.reply('event', async (...data) => {
throw new Error('Something went wrong');
});
socket.replyAny(async (event, ...data) => {
return res.toJSON();
});
Additionally I think it might be useful to have a way of resurrecting errors as well, but I’m not sure how the api can look like. Perhaps something like
socket.errorBuilder(json => buildCustomErrorFromJSON(json));
or
io.errorBuilder(json => buildCustomErrorFromJSON(json));
where socket.errorBuilder
can be used to override for that socket.
As always, I’d be happy to create a PR for this should you decide that it is a feature that is desirable to have in the library. In my opinion it fits nicely in the trend that callbacks are more and more being replaced by promises.
Issue Analytics
- State:
- Created 2 years ago
- Reactions:5
- Comments:5 (4 by maintainers)
Top GitHub Comments
@sebamarynissen that makes sense 👍
Let’s keep this issue open, to see if other users want this functionality to be built-in.
I would like this functionality, and it also helps to write code and tests more readable using async await syntax.
But I’m not convinced by the name
request
, as I understand, the idea is to allow to change thecallback syntax
of acknowledgement for anawait async syntax
, so in this way, and without breaking changes and aligned with current naming convention this would be betteremitWithAck
and in the same way
reply
should beonWithAck
, although I still see a lot of use for this one, so I appreciate if someone would like to show me an example where it would be useful to use await async when registering event handlersFor example this: https://github.com/socketio/socket.io/blob/3b7ced7af7e0a2a66392577f94af1ee5ed190ab1/examples/basic-crud-application/server/test/todo-management/todo.tests.ts#L165-L200
to something like this;
Is there any plan to implement it?
Thank you.