1 - Equipamento A manda uma mensagem para minha aplicação. Eu recebo essa mensagem,
2 - Deserializo (operação síncrona)
3 - Caso tenha algum problema com a mensagem, mando um NACK para o equipamento (operação assíncrona)
1 - que vai me mandar a mensagem novamente (operação assíncrona, na verdade, ele pode voltar pro começo) - volta pra 1 de novo
4 - Seguimos em frente, a mensagem que eu recebi estava OK eu salvo ela no banco de dados (operação assíncrona)
5 - e faço uma consulta para saber se existe algum comando para enviar para o equipamento. (operação assíncrona)
6 - Existe, eu trago esse comando da base, (operação assíncrona)
7 - serializo, (operação síncrona)
8 - mando para o equipamento (operação assíncrona) e
9 - aguardo o retorno (operação assíncrona), - VOLTA PRA 1
10 - esse retorno vou salvar no banco de dados (operação assíncrona)
11 - e pronto, terminei de interagir com esse equipamento por hora.
Exemplificado em pseudo código:
//1
socket.on('data', function(data) {
//2
var mensagem = deserializar(data);
if (!isOk(mensagem)) {
//3
socket.write('NACK');
} else {
if (mensagem.tipo == 'RETORNO_COMANDO') {
// 9 - Recebi retorno do último comando
// 10 - salva retorno (assíncrona)
banco.save(mensagem, function(result) {
//11 - manda resposta
socket.write('OK');
});
} else {
// 4 , essa chamada é assíncrona
banco.save(mensagem, function(result) {
// 5 - novamente assíncrona
banco.trazerComando(mensagem.id_equipamento, function(comando) {
if (comando != null) {
//7
var dataToSend = serializar(comando)
// 8 - Assincrono de novo
socket.write(dataToSend);
} else {
//11 - manda resposta
socket.write('OK');
}
});
}
}
}
});