Если я правильно понял, то нужно чтобы клиент мог с помощью сокета сделать запрос и дождаться ответа. Обычно схема такая: клиент придумывает некий уникальный id, сохраняет свой колбэк в некую карту
mapCallbacks[id] = (data) => {...}
id передается серверу вместе с другими параметрами запроса.
сервер, получив данные, отсылает их вместе с этим id
клиент, поймав такое сообщение, берет из него id и вызывает mapCallbacks[id](response), после чего удаляет mapCallbacks[id]
чтобы вернуть именно промис, можно сделать так:
return new Promise((resp, rej) => {
mapCallbacks[id] = (error, data) => {
if (error) {
rej(error);
} else {
resp(data);
}
};
});
либо, как вариант, внутри промиса сделать
mapCallbacks[id] = {resp, rej} и в обработчике сообщения вызвать нужное