@Override public boolean rcvMeta(ServerSession from, Mutable message) { Map<String, Object> ext = message.getExt(false); if (ext != null) { Map<String, Object> sync = (Map<String, Object>)ext.get("timesync"); if (sync != null) { sync.put("ts", System.currentTimeMillis()); Number lag = (Number)sync.get("l"); if (lag != null && from != null) { from.setAttribute(LAG_ATTRIBUTE, lag); } } } return true; }
@Override public boolean sendMeta(ServerSession to, Mutable message) { String channel = message.getChannel(); Map<String, Object> ext = message.getExt(true); if (channel.equals(Channel.META_HANDSHAKE)) { if (_session.isAllowMessageDeliveryDuringHandshake()) { long batch = closeBatch(message); Map<String, Object> ack = new HashMap<>(3); ack.put("enabled", true); ack.put("batch", batch); ext.put("ack", ack); if (_logger.isDebugEnabled()) { _logger.debug("Sending batch {} for {}", batch, _session); } } else { ext.put("ack", Boolean.TRUE); } } else if (channel.equals(Channel.META_CONNECT)) { long batch = closeBatch(message); ext.put("ack", batch); if (_logger.isDebugEnabled()) { _logger.debug("Sending batch {} for {}", batch, _session); } } return true; }
@Override public ServerMessage send(ServerSession session, ServerMessage message) { Object data = message.getData(); if (data instanceof BinaryData) { ServerMessage.Mutable result = bayeuxServer.newMessage(); result.putAll(message); BinaryData binaryData = (BinaryData)data; Object binary = binaryData.get(BinaryData.DATA); String encoded; if (binary instanceof byte[]) { encoded = Z85.encoder.encodeBytes(binaryData.asBytes()); } else if (binary instanceof ByteBuffer) { encoded = Z85.encoder.encodeByteBuffer(binaryData.asByteBuffer()); } else { throw new IllegalArgumentException("Cannot Z85 encode " + binary); } Map<String, Object> newData = new HashMap<>(binaryData); newData.put(BinaryData.DATA, encoded); result.setData(newData); Map<String, Object> ext = result.getExt(true); ext.put(BinaryData.EXT_NAME, new HashMap<>(0)); return result; } else { return message; } } }
@Override public boolean send(ServerSession from, ServerSession to, ServerMessage.Mutable message) { Object data = message.getData(); if (data instanceof BinaryData) { BinaryData binaryData = (BinaryData)data; Object binary = binaryData.get(BinaryData.DATA); String encoded; if (binary instanceof byte[]) { encoded = Z85.encoder.encodeBytes(binaryData.asBytes()); } else if (binary instanceof ByteBuffer) { encoded = Z85.encoder.encodeByteBuffer(binaryData.asByteBuffer()); } else { throw new IllegalArgumentException("Cannot Z85 encode " + binary); } Map<String, Object> newData = new HashMap<>(binaryData); newData.put(BinaryData.DATA, encoded); message.setData(newData); Map<String, Object> ext = message.getExt(true); ext.put(BinaryData.EXT_NAME, new HashMap<>(0)); } return true; } }
@Override public boolean rcvMeta(ServerSession remote, Mutable message) { if (Channel.META_HANDSHAKE.equals(message.getChannel())) { Map<String, Object> rcvExt = message.getExt(); boolean clientRequestedAcks = rcvExt != null && rcvExt.get("ack") == Boolean.TRUE; if (clientRequestedAcks && remote != null) { if (_logger.isDebugEnabled()) { _logger.debug("Enabled message acknowledgement for session {}", remote); } AcknowledgedMessagesSessionExtension extension = new AcknowledgedMessagesSessionExtension(remote); // Make sure that adding the extension and importing the queue is atomic. ServerSessionImpl session = (ServerSessionImpl)remote; synchronized (session.getLock()) { session.addExtension(extension); extension.importMessages(session); } } } return true; } }
@Override public boolean rcv(ServerSession session, ServerMessage.Mutable message) { Map<String, Object> ext = message.getExt(); if (ext != null) { if (ext.remove(BinaryData.EXT_NAME) != null) { Map<String, Object> data = message.getDataAsMap(); BinaryData newData = new BinaryData(data); message.setData(newData); String encoded = (String)data.get(BinaryData.DATA); Object decoded = decodeToByteBuffer ? Z85.decoder.decodeByteBuffer(encoded) : Z85.decoder.decodeBytes(encoded); newData.put(BinaryData.DATA, decoded); } } return true; }
@Override public boolean rcv(ServerSession from, ServerMessage.Mutable message) { Map<String, Object> ext = message.getExt(); if (ext != null) { if (ext.remove(BinaryData.EXT_NAME) != null) { Map<String, Object> data = message.getDataAsMap(); BinaryData newData = new BinaryData(data); message.setData(newData); String encoded = (String)data.get(BinaryData.DATA); Object decoded = decodeToByteBuffer ? Z85.decoder.decodeByteBuffer(encoded) : Z85.decoder.decodeBytes(encoded); newData.put(BinaryData.DATA, decoded); } } return true; }
@Override public boolean rcvMeta(ServerSession session, Mutable message) { if (Channel.META_CONNECT.equals(message.getChannel())) { Map<String, Object> ext = message.getExt(false); if (ext != null) { Number batchValue = (Number)ext.get("ack"); if (batchValue != null) { processBatch(batchValue.longValue()); updateAdvice(message); } } } return true; }