From aeba9ece778fb24953816fd3517858ff80de958f Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Sun, 19 Jul 2026 08:02:09 +0900 Subject: [PATCH 1/3] fix(sse): emit retry feild when retry is `0` (#5135) --- src/helper/streaming/sse.test.tsx | 22 ++++++++++++++++++++++ src/helper/streaming/sse.ts | 7 ++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/helper/streaming/sse.test.tsx b/src/helper/streaming/sse.test.tsx index 8da7e81f31..75b2bd4319 100644 --- a/src/helper/streaming/sse.test.tsx +++ b/src/helper/streaming/sse.test.tsx @@ -132,6 +132,28 @@ describe('SSE Streaming helper', () => { expect(decodedValue).toContain(expectedRetryValue) }) + it('Should accept retry: 0 and not skip it', async () => { + const res = streamSSE(c, async (stream) => { + await stream.writeSSE({ + data: 'This is a test message', + retry: 0, + }) + }) + + expect(res).not.toBeNull() + expect(res.status).toBe(200) + + if (!res.body) { + throw new Error('Body is null') + } + const reader = res.body.getReader() + const decoder = new TextDecoder() + const { value } = await reader.read() + const decodedValue = decoder.decode(value) + + expect(decodedValue).toContain('retry: 0\n\n') + }) + it('Check stream Response if error occurred', async () => { const onError = vi.fn() const res = streamSSE( diff --git a/src/helper/streaming/sse.ts b/src/helper/streaming/sse.ts index 6edd93d564..2b161912fd 100644 --- a/src/helper/streaming/sse.ts +++ b/src/helper/streaming/sse.ts @@ -24,8 +24,9 @@ export class SSEStreamingApi extends StreamingApi { }) .join('\n') - for (const key of ['event', 'id', 'retry'] as (keyof SSEMessage)[]) { - if (message[key] && /[\r\n]/.test(message[key] as string)) { + for (const key of ['event', 'id'] as const) { + const value = message[key] + if (value && /[\r\n]/.test(value)) { throw new Error(`${key} must not contain "\\r" or "\\n"`) } } @@ -35,7 +36,7 @@ export class SSEStreamingApi extends StreamingApi { message.event && `event: ${message.event}`, dataLines, message.id && `id: ${message.id}`, - message.retry && `retry: ${message.retry}`, + message.retry !== undefined && `retry: ${message.retry}`, ] .filter(Boolean) .join('\n') + '\n\n' From 64c613ab0f15526b0c0edb25ad0c2989eace2ea1 Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Sun, 19 Jul 2026 08:10:28 +0900 Subject: [PATCH 2/3] test(validator): fix misspelled identifier in transform type test (#5136) --- src/validator/validator.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/validator/validator.test.ts b/src/validator/validator.test.ts index 5d467cbb35..16db114ac0 100644 --- a/src/validator/validator.test.ts +++ b/src/validator/validator.test.ts @@ -1357,15 +1357,15 @@ describe('Transform', () => { } as { page: number orderBy: 'asc' | 'desc' - ordreByWithdefault?: 'asc' | 'desc' | undefined + orderByWithdefault?: 'asc' | 'desc' | undefined } }), (c) => { - const { page, orderBy, ordreByWithdefault } = c.req.valid('query') + const { page, orderBy, orderByWithdefault } = c.req.valid('query') expectTypeOf(page).toEqualTypeOf() expectTypeOf(orderBy).toEqualTypeOf<'asc' | 'desc'>() - expectTypeOf(ordreByWithdefault).toEqualTypeOf<'asc' | 'desc' | undefined>() - return c.json({ page, orderBy, ordreByWithdefault }) + expectTypeOf(orderByWithdefault).toEqualTypeOf<'asc' | 'desc' | undefined>() + return c.json({ page, orderBy, orderByWithdefault }) } ) @@ -1376,13 +1376,13 @@ describe('Transform', () => { query: { page: string | string[] orderBy: 'asc' | 'desc' - ordreByWithdefault?: 'asc' | 'desc' | undefined + orderByWithdefault?: 'asc' | 'desc' | undefined } } output: { page: number orderBy: 'asc' | 'desc' - ordreByWithdefault: 'asc' | 'desc' | undefined + orderByWithdefault: 'asc' | 'desc' | undefined } outputFormat: 'json' status: ContentfulStatusCode From cadff88bba34153646c9b35f24d7cc0cb61be913 Mon Sep 17 00:00:00 2001 From: Yusuke Wada Date: Sun, 19 Jul 2026 08:15:00 +0900 Subject: [PATCH 3/3] 4.12.31 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 606f2db336..95df31ac58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hono", - "version": "4.12.30", + "version": "4.12.31", "description": "Web framework built on Web Standards", "main": "dist/cjs/index.js", "type": "module",