Skip to content

Commit af2e7e8

Browse files
authored
Merge pull request #4 from flamicomm/fix/deframer
Fix/deframer
2 parents fdec3a5 + 01cee8e commit af2e7e8

4 files changed

Lines changed: 46 additions & 16 deletions

File tree

README.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Añade la dependencia a tu `pom.xml`:
3737
<dependency>
3838
<groupId>com.flamingo</groupId>
3939
<artifactId>llp-protocol</artifactId>
40-
<version>3.0.0</version>
40+
<version>3.0.1</version>
4141
</dependency>
4242

4343
```
@@ -324,7 +324,7 @@ Las nuevas capas de protocolo se implementan como módulos de Maven independient
324324
<dependency>
325325
<groupId>com.flamingo</groupId>
326326
<artifactId>llp-protocol</artifactId>
327-
<version>3.0.0</version>
327+
<version>3.0.1</version>
328328
</dependency>
329329

330330
```
@@ -454,17 +454,17 @@ if (deepest instanceof FinalNode final) {
454454

455455
## 🔄 Migración desde v2.x
456456

457-
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.
458-
459-
| v2.x | v3.0 |
460-
| --- | --- |
461-
| `LLP.newParser()` | `LLP.incrementalParser().build()` |
462-
| `parser.processByte(b)` | `parser.feed(b)` + `parser.pollFrames()` |
463-
| `parser.addListener(...)` | Maneja los resultados desde `pollFrames()` / `pollErrors()` |
464-
| `LLP.buildData(type, payload)` | `LLP.frameBuilder().build()` + `.build(payload)` |
465-
| `LLPFrame.getType()` | Eliminado — el tipo de mensaje es ahora un asunto de la capa |
466-
| `LLPFrame.getId()` | Eliminado — el ID de transacción es ahora un asunto de la capa |
467-
| `LLPMessageType` | Eliminado — define los tipos de mensajes en tu capa |
457+
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.
458+
459+
| v2.x | v3.x |
460+
| --- |-----------------------------------------------------------------------|
461+
| `LLP.newParser()` | `LLP.incrementalParser().build()` |
462+
| `parser.processByte(b)` | `parser.feed(b)` + `parser.pollFrames()` |
463+
| `parser.addListener(...)` | Maneja los resultados desde `pollFrames()` / `pollErrors()` |
464+
| `LLP.buildData(type, payload)` | `LLP.frameBuilder().build()` + `.build(payload)` |
465+
| `LLPFrame.getType()` | Eliminado — el tipo de mensaje es ahora un asunto de la capa |
466+
| `LLPFrame.getId()` | Eliminado — el ID de transacción es ahora un asunto de la capa |
467+
| `LLPMessageType` | Eliminado — define los tipos de mensajes en tu capa |
468468
| Formato de trama única | Modelo de cebolla en capas (layered onion model) con capas opcionales |
469469

470470
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)**.
@@ -528,8 +528,8 @@ Creado por **EnzoLeonel**
528528

529529
---
530530

531-
**Versión:** 3.0.0
531+
**Versión:** 3.0.1
532532

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

535535
**Objetivo Java:** 21+

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
<groupId>com.flamingo</groupId>
99
<artifactId>llp-core</artifactId>
10-
<version>3.0.0</version>
10+
<version>3.0.1</version>
1111
<packaging>jar</packaging>
1212

1313
<name>LLP Core</name>

src/main/java/com/flamingo/comm/llp/core/LLPTransportDeframer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ public LLPRawFrame processByte(byte b) {
108108
if (b == MAGIC_1) {
109109
state = State.WAIT_MAGIC2;
110110
}
111+
lastByteTime = System.currentTimeMillis();
111112
return null;
112113
}
113114
}

src/test/java/com/flamingo/comm/llp/core/LLPTransportDeframerTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,35 @@ void testTimeoutResetsParser() throws InterruptedException {
143143
assertTrue(deframer.getStatistics().getTimeouts() > 0);
144144
}
145145

146+
@Test
147+
void testTimeoutThenResyncDoesNotCascadeTimeout() throws InterruptedException {
148+
byte[] payload = new byte[]{0x00};
149+
byte[] fullFrame = buildFrame(payload);
150+
151+
deframer.processByte(fullFrame[0]);
152+
deframer.processByte(fullFrame[1]);
153+
154+
Thread.sleep(2100);
155+
156+
deframer.processByte((byte) 0xAA);
157+
158+
LLPRawFrame result = null;
159+
for (int i = 1; i < fullFrame.length; i++) {
160+
LLPRawFrame f = deframer.processByte(fullFrame[i]);
161+
if (f != null) result = f;
162+
}
163+
164+
assertNotNull(result,
165+
"Frame must complete after timeout+resync");
166+
ByteBuffer buf = result.payload();
167+
byte[] extracted = new byte[buf.remaining()];
168+
buf.get(extracted);
169+
assertArrayEquals(payload, extracted);
170+
171+
assertEquals(1, deframer.getStatistics().getTimeouts(),
172+
"Exactly 1 timeout — no cascading");
173+
}
174+
146175
@Test
147176
void testPayloadExceedsMaximum() {
148177
byte[] payload = new byte[1025]; // max is 1024

0 commit comments

Comments
 (0)