Если я правильно понял, то нужно чтобы клиент мог с помощью сокета сделать запрос и дождаться ответа. Обычно схема такая: клиент придумывает некий уникальный 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} и в обработчике сообщения вызвать нужное