@Override
public void handshake(Map<String, Object> template, ClientSession.MessageListener callback) {
if (_session != null) {
throw new IllegalStateException();
}
ServerSessionImpl session = new ServerSessionImpl(_bayeux, this, _idHint);
ServerMessage.Mutable hsMessage = newMessage();
if (template != null) {
hsMessage.putAll(template);
}
String messageId = newMessageId();
hsMessage.setId(messageId);
hsMessage.setChannel(Channel.META_HANDSHAKE);
registerCallback(messageId, callback);
doSend(session, hsMessage, Promise.from(hsReply -> {
if (hsReply != null && hsReply.isSuccessful()) {
_session = session;
ServerMessage.Mutable cnMessage = newMessage();
cnMessage.setId(newMessageId());
cnMessage.setChannel(Channel.META_CONNECT);
cnMessage.getAdvice(true).put(Message.INTERVAL_FIELD, -1L);
cnMessage.setClientId(session.getId());
doSend(session, cnMessage, Promise.from(cnReply -> {
}, failure -> messageFailure(cnMessage, failure)));
}
}, failure -> messageFailure(hsMessage, failure)));
}