protected void extendIncoming(ServerMessage.Mutable message, Promise<Boolean> promise) { AsyncFoldLeft.run(_extensions, true, (result, extension, loop) -> { if (result) { try { extension.incoming(this, message, Promise.from(loop::proceed, failure -> { _logger.info("Exception reported by extension " + extension, failure); loop.proceed(true); })); } catch (Throwable x) { _logger.info("Exception thrown by extension " + extension, x); loop.proceed(true); } } else { loop.leave(result); } }, promise); }
protected void extendOutgoing(ServerMessage.Mutable message, Promise<ServerMessage.Mutable> promise) { List<Extension> extensions = new ArrayList<>(_extensions); Collections.reverse(extensions); AsyncFoldLeft.run(extensions, message, (result, extension, loop) -> { try { extension.outgoing(this, result, Promise.from(m -> { if (m != null) { loop.proceed(m); } else { loop.leave(null); } }, failure -> { _logger.info("Exception reported by extension " + extension, failure); loop.proceed(result); })); } catch (Exception x) { _logger.info("Exception thrown by extension " + extension, x); loop.proceed(result); } }, promise); }
/** * <p>Callback method invoked every time a message is outgoing.</p> * * @param session the session receiving the message * @param message the outgoing message * @param promise the promise to notify with the message to send or null to not send the message */ default void outgoing(ServerSession session, ServerMessage.Mutable message, Promise<ServerMessage.Mutable> promise) { if (message.isMeta()) { promise.succeed(sendMeta(session, message) ? message : null); } else { ServerMessage result = send(session, message); if (result instanceof ServerMessage.Mutable) { promise.succeed((ServerMessage.Mutable)result); } else if (result == null) { promise.succeed(null); } else { promise.fail(new IllegalArgumentException()); } } }
/** * <p>Callback method invoked every time a message is incoming.</p> * * @param session the session that sent the message * @param message the incoming message * @param promise the promise to notify whether message processing should continue */ default void incoming(ServerSession session, ServerMessage.Mutable message, Promise<Boolean> promise) { promise.succeed(message.isMeta() ? rcvMeta(session, message) : rcv(session, message)); }