public static Frame from(int streamId, FrameType type, Payload payload, int flags) { final ByteBuf metadata = payload.hasMetadata() ? payload.sliceMetadata() : null; final ByteBuf data = payload.sliceData(); return from(streamId, type, metadata, data, flags); }
@Override public Mono<Void> fireAndForget(Payload payload) { payload.release(); return Mono.error(new UnsupportedOperationException("Fire and forget not implemented.")); }
public void assertDataAndMetadata(Payload p, String dataVal, String metadataVal) { assertThat("Unexpected data.", p.getDataUtf8(), equalTo(dataVal)); if (metadataVal == null) { assertThat("Non-null metadata", p.hasMetadata(), equalTo(false)); } else { assertThat("Null metadata", p.hasMetadata(), equalTo(true)); assertThat("Unexpected metadata.", p.getMetadataUtf8(), equalTo(metadataVal)); } }
@Override protected Payload unwrap(Payload payload) { try { ByteBuf data = payload.sliceData(); ByteBuf metadata = payload.sliceMetadata(); ByteBuf unwrappedMetadata = Metadata.getMetadata(metadata); return ByteBufPayload.create(data.retain(), unwrappedMetadata.retain()); } finally { payload.release(); } }
@Override public ClientMessage decode(Payload encodedMessage) { return decode(encodedMessage.sliceData(), encodedMessage.sliceMetadata()); }
default String getMetadataUtf8() { return sliceMetadata().toString(StandardCharsets.UTF_8); }
default String getDataUtf8() { return sliceData().toString(StandardCharsets.UTF_8); } }
private void handleRequestResponse(int streamId, Mono<Payload> response) { response .doOnSubscribe(subscription -> sendingSubscriptions.put(streamId, subscription)) .map( payload -> { int flags = FLAGS_C; if (payload.hasMetadata()) { flags = Frame.setFlag(flags, FLAGS_M); } final Frame frame = Frame.PayloadFrame.from(streamId, FrameType.NEXT_COMPLETE, payload, flags); payload.release(); return frame; }) .switchIfEmpty( Mono.fromCallable(() -> Frame.PayloadFrame.from(streamId, FrameType.COMPLETE))) .doFinally(signalType -> sendingSubscriptions.remove(streamId)) .subscribe(sendProcessor::onNext, t -> handleError(streamId, t)); }
@Override public Flux<Payload> requestStream(Payload payload) { return map.get(payload.getDataUtf8()); } };
public static Frame from(int streamId, FrameType type, Payload payload) { return from(streamId, type, payload, payload.hasMetadata() ? FLAGS_M : 0); }
@Override public Mono<Void> fireAndForget(Payload payload) { return Mono.defer( () -> { Payload transformedPayload = payloadTransformer.apply(payload); if (transformedPayload != null && payload.refCnt() > 0) { quietRelease(payload); } return rSocketSupplier.get().fireAndForget(transformedPayload); }); }
@Override protected Payload unwrap(Payload payload) { try { ByteBuf data = payload.sliceData(); ByteBuf metadata = payload.sliceMetadata(); ByteBuf unwrappedMetadata = Metadata.getMetadata(metadata); return ByteBufPayload.create(data.retain(), unwrappedMetadata.retain()); } finally { payload.release(); } }
private ServiceMessage toMessage(Payload payload) { return messageCodec.decode(payload.sliceData(), payload.sliceMetadata()); }
default ByteBuffer getMetadata() { return sliceMetadata().nioBuffer(); }
default ByteBuffer getData() { return sliceData().nioBuffer(); }
private void handleRequestResponse(int streamId, Mono<Payload> response) { response .doOnSubscribe(subscription -> sendingSubscriptions.put(streamId, subscription)) .map( payload -> { int flags = FLAGS_C; if (payload.hasMetadata()) { flags = Frame.setFlag(flags, FLAGS_M); } final Frame frame = Frame.PayloadFrame.from(streamId, FrameType.NEXT_COMPLETE, payload, flags); payload.release(); return frame; }) .switchIfEmpty( Mono.fromCallable(() -> Frame.PayloadFrame.from(streamId, FrameType.COMPLETE))) .doFinally(signalType -> sendingSubscriptions.remove(streamId)) .subscribe(sendProcessor::onNext, t -> handleError(streamId, t)); }
@Override public Flux<Payload> requestChannel(Publisher<Payload> payloads) { return Flux.from(payloads) .map( p -> { String data = p.getDataUtf8(); if (!data.equals("foo")) { throw new IllegalStateException("Channel Server Bad message: " + data); } return DefaultPayload.create("bar"); }); }
@Test public void testEncodingWithNullMetadata() { int encoded = RequestFrameFlyweight.encode( byteBuf, 1, 0, FrameType.REQUEST_STREAM, 1, null, Unpooled.copiedBuffer("d", StandardCharsets.UTF_8)); assertEquals("00000b0000000118000000000164", ByteBufUtil.hexDump(byteBuf, 0, encoded)); Payload payload = DefaultPayload.create(Frame.from(stringToBuf("00000b0000000118000000000164"))); assertFalse(payload.hasMetadata()); }
@Override public Mono<Void> fireAndForget(Payload payload) { return Mono.defer( () -> { Payload transformedPayload = payloadTransformer.apply(payload); if (transformedPayload != null && payload.refCnt() > 0) { quietRelease(payload); } return rSocketSupplier.get().fireAndForget(transformedPayload); }); }