Хорошо, как я и обещал, я нашел половину своего идеального решения.В идеале я хочу прокси все события назад и вперед и прослушивать только несколько ключевых событий, но я еще не понял эту часть.Если кто-то может помочь мне в этом начинании, я был бы всегда благодарен.
Вместо этого я просто отображаю все события, которые излучает каждый конец сокета, и хороню их в подключенных вызовах.
Вот гайки и болты о том, как я сделал то, что хотел - вы создаете server
как обычно, а при его соединении вы затем инициируете соединение client
из вызова .on('connection', () => {});
.Оказавшись в этой области, вы можете быть относительно уверены, что оба соединения открыты, и начинать передавать события туда и обратно.В идеале вы будете проверять наличие активного соединения, но если ваш сервер и / или клиент оборудованы для обработки разорванного соединения, вы, вероятно, в порядке.
В моем простом примере ниже вы увидите, как я передаю событиятуда и обратно, и он выполняет свою работу.Как я уже сказал, если кто-то может помочь мне с подходом с подстановочными знаками (который я не смог получить по какой-то причине), пожалуйста, дайте мне знать!
// GLOBAL CONFIGS
const serverConfig = {}; // Feel free to add your desired options here
// Some of these options pertain more to me than they will to you; don't feel like
// you have to copy these configs
const clientConfig = {
// We don't want to pre-emptivly try to connect to data-api,
// because we need our client to give us data first.
autoConnect: false,
multiplex: false,
// Disables/bypasses long polling which causes the connection to
// be severed then re-connected (for my api at least)
transports: ["websocket"]
};
const PORT = 3000;
const PROXY_HOST = '<api-endpoint-goes-here>'
const NAMESPACE = '<the name of your namespace, if applicable>';
// SERVER STUFF - this will connect to your client
const app = require('express')();
const server = require('http').Server(app);
const cors = require('cors');
const io = require('socket.io')(server, serverConfig);
const nsp = io.of(`/${NAMESPACE}`);
// CLIENT STUFF - this will connect to your api server as a client
const client = require('socket.io-client');
const ioClient = client(`${PROXY_HOST}/${NAMESPACE}`, clientConfig);
// Self explanatory I hope
app.use(cors());
// I am going to call this a root socket - meaning no namespace. Not entirely useful for now unless
// we want to inspect transitions in and out of our namespace, but just putting it here FYI
io.on('connection', socket => {
console.log(`A connection to the root socket made ${socket.handshake.headers.origin}`);
socket.on('disconnect', () => {
console.log(`A client disconnected from the root socket.`);
});
});
// Serve up a basic html file so that we can interact with our socket.io instance in the
// console. This index.html has a similar setup with a socket connection to both the data
// api and this test server, so I can ping events via console and test how this is working
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname + '/index.html'));
});
// Run the server
server.listen(PORT, () => console.log('Test data server is running'));
// Here's where the real solution reveals itself for me :)
// Listen for connections to the namespace we are looking for - this is the meat & potatoes of our app
nsp.on('connection', socket => {
console.log(`the ${NAMESPACE} namespace was connected`);
// Time to initiate a connection to the ioClient because we need it for the app now
ioClient.connect();
// Now check to make sure ioCLient is connected. Once we get inside here, we can be
// reasonably sure that we have a connection to both the client, and the data-api
ioClient.on('connect', () => {
// Acknowledge we have connected to the data-api
console.log('Connected to data-api via socket.io');
// Events sent from data-api
ioClient.on('<your event>', data => {
socket.emit('<your event>', data);
});
ioClient.on('<your event with two params>', (data1, data2) => {
socket.emit('<your event with two params>', data1, data2);
});
// ... etc
// Other event catchers for ioClient
ioClient.on('disconnect', () => {
console.log('Disconnected from the data-api');
});
ioClient.on('error', err => {
console.error('Error with the data-api connection: ', err);
});
// Events sent from the app client
socket.on('<your event>', data => {
ioClient.emit('<your event>', data);
});
socket.on('<your event with two params>', (data1, data2) => {
ioClient.emit('<your event with two params>', data1, data2);
});
// ... etc
});
});