Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Añade la dependencia a tu `pom.xml`:
<dependency>
<groupId>com.flamingo</groupId>
<artifactId>llp-protocol</artifactId>
<version>3.0.0</version>
<version>3.0.1</version>
</dependency>

```
Expand Down Expand Up @@ -324,7 +324,7 @@ Las nuevas capas de protocolo se implementan como módulos de Maven independient
<dependency>
<groupId>com.flamingo</groupId>
<artifactId>llp-protocol</artifactId>
<version>3.0.0</version>
<version>3.0.1</version>
</dependency>

```
Expand Down Expand Up @@ -454,17 +454,17 @@ if (deepest instanceof FinalNode final) {

## 🔄 Migración desde v2.x

La versión 3.0 introduce un nuevo modelo de tramas en capas y una API pública rediseñada. La API de la v2 ha sido eliminada.

| v2.x | v3.0 |
| --- | --- |
| `LLP.newParser()` | `LLP.incrementalParser().build()` |
| `parser.processByte(b)` | `parser.feed(b)` + `parser.pollFrames()` |
| `parser.addListener(...)` | Maneja los resultados desde `pollFrames()` / `pollErrors()` |
| `LLP.buildData(type, payload)` | `LLP.frameBuilder().build()` + `.build(payload)` |
| `LLPFrame.getType()` | Eliminado — el tipo de mensaje es ahora un asunto de la capa |
| `LLPFrame.getId()` | Eliminado — el ID de transacción es ahora un asunto de la capa |
| `LLPMessageType` | Eliminado — define los tipos de mensajes en tu capa |
La versión 3 introduce un nuevo modelo de tramas en capas y una API pública rediseñada. La API de la v2 ha sido eliminada.

| v2.x | v3.x |
| --- |-----------------------------------------------------------------------|
| `LLP.newParser()` | `LLP.incrementalParser().build()` |
| `parser.processByte(b)` | `parser.feed(b)` + `parser.pollFrames()` |
| `parser.addListener(...)` | Maneja los resultados desde `pollFrames()` / `pollErrors()` |
| `LLP.buildData(type, payload)` | `LLP.frameBuilder().build()` + `.build(payload)` |
| `LLPFrame.getType()` | Eliminado — el tipo de mensaje es ahora un asunto de la capa |
| `LLPFrame.getId()` | Eliminado — el ID de transacción es ahora un asunto de la capa |
| `LLPMessageType` | Eliminado — define los tipos de mensajes en tu capa |
| Formato de trama única | Modelo de cebolla en capas (layered onion model) con capas opcionales |

El formato de la trama cambió significativamente en la v3 para soportar el modelo de capas. Las tramas v2 y v3 **no son compatibles a nivel de red (wire-compatible)**.
Expand Down Expand Up @@ -528,8 +528,8 @@ Creado por **EnzoLeonel**

---

**Versión:** 3.0.0
**Versión:** 3.0.1

**Última actualización:** 2026-05-08
**Última actualización:** 2026-05-13

**Objetivo Java:** 21+
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

<groupId>com.flamingo</groupId>
<artifactId>llp-core</artifactId>
<version>3.0.0</version>
<version>3.0.1</version>
<packaging>jar</packaging>

<name>LLP Core</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ public LLPRawFrame processByte(byte b) {
if (b == MAGIC_1) {
state = State.WAIT_MAGIC2;
}
lastByteTime = System.currentTimeMillis();
return null;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,35 @@ void testTimeoutResetsParser() throws InterruptedException {
assertTrue(deframer.getStatistics().getTimeouts() > 0);
}

@Test
void testTimeoutThenResyncDoesNotCascadeTimeout() throws InterruptedException {
byte[] payload = new byte[]{0x00};
byte[] fullFrame = buildFrame(payload);

deframer.processByte(fullFrame[0]);
deframer.processByte(fullFrame[1]);

Thread.sleep(2100);

deframer.processByte((byte) 0xAA);

LLPRawFrame result = null;
for (int i = 1; i < fullFrame.length; i++) {
LLPRawFrame f = deframer.processByte(fullFrame[i]);
if (f != null) result = f;
}

assertNotNull(result,
"Frame must complete after timeout+resync");
ByteBuffer buf = result.payload();
byte[] extracted = new byte[buf.remaining()];
buf.get(extracted);
assertArrayEquals(payload, extracted);

assertEquals(1, deframer.getStatistics().getTimeouts(),
"Exactly 1 timeout — no cascading");
}

@Test
void testPayloadExceedsMaximum() {
byte[] payload = new byte[1025]; // max is 1024
Expand Down
Loading