import dev.caskeleton.adapter.outbound.persistence.api.query.CursorPayloadCodec; import dev.caskeleton.adapter.outbound.persistence.api.query.SignedJsonCursorCodec; import java.nio.charset.StandardCharsets; public class JpaCursorBoundaryProbe { static SignedJsonCursorCodec codecFor(int payloadBytes) { return new SignedJsonCursorCodec<>(new CursorPayloadCodec<>() { public String toJson(String cursor) { return "x".repeat(payloadBytes); } public String fromJson(String json) { return json; } }, "k".repeat(32).getBytes(StandardCharsets.UTF_8)); } public static void main(String[] args) { for (int size : new int[]{2045, 2046, 2047, 2048, 2049}) { var codec = codecFor(size); try { String token = codec.encode("ignored"); try { String decoded = codec.decode(token); System.out.printf("size=%d tokenChars=%d encode=OK decode=OK decodedBytes=%d%n", size, token.length(), decoded.getBytes(StandardCharsets.UTF_8).length); } catch (RuntimeException ex) { System.out.printf("size=%d tokenChars=%d encode=OK decode=%s:%s%n", size, token.length(), ex.getClass().getSimpleName(), ex.getMessage()); } } catch (RuntimeException ex) { System.out.printf("size=%d encode=%s:%s%n", size, ex.getClass().getSimpleName(), ex.getMessage()); } } } }