-
-
Notifications
You must be signed in to change notification settings - Fork 634
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(streaming): call stream.abort() explicitly when request is aborted #3042
Conversation
20b94bc
to
9f5a78c
Compare
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #3042 +/- ##
==========================================
+ Coverage 95.84% 95.87% +0.03%
==========================================
Files 137 137
Lines 13428 13460 +32
Branches 2294 2282 -12
==========================================
+ Hits 12870 12905 +35
+ Misses 558 555 -3 ☔ View full report in Codecov by Sentry. |
@yusukebe Would you please review? |
Hey @usualoma I may not completely understand the correct behavior, but I think it does not work well in Bun with this PR. Bun (does not work): node.mp4Node.js (works): node.mp4Btw, it has the same behavior as Node.js on Deno. |
Is the |
Ah, we can use this script: import { Hono } from 'hono'
import { streamSSE } from 'hono/streaming'
import { serve } from '@hono/node-server'
const app = new Hono()
app.get('t', (c) => {
return streamSSE(c, async (stream) => {
stream.onAbort(() => {
console.log('aborted')
stream.close()
})
for (;;) {
try {
await stream.writeSSE({
data: `It is ${new Date().toISOString()}`,
event: 'message',
})
await stream.sleep(1000)
} catch (e) {
console.error(e)
break
}
}
})
})
app.get('/', (c) => {
return c.html(`
<html>
<body>
<script>
const controller = new AbortController();
const signal = controller.signal;
const eventSource = new EventSource('/t', { signal: signal });
eventSource.onmessage = function(event) {
console.log('Message:', event.data);
};
eventSource.onerror = function(error) {
console.log('Error:', error);
eventSource.close();
};
setTimeout(() => {
console.log('Aborting connection');
eventSource.close();
}, 5000);
</script>
</body>
</html>
`)
})
export default app
//serve(app) But the behaviors are the same. |
@yusukebe Sorry, I think the |
…, so hold it until the end of streaming
@yusukebe In a bun, the destruction of |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
Hi @usualoma ! Thanks for the investigation and implementation. it works well. Merging now. |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [hono](https://hono.dev/) ([source](https://togithub.com/honojs/hono)) | [`4.4.7` -> `4.5.1`](https://renovatebot.com/diffs/npm/hono/4.4.7/4.5.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/hono/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/hono/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/hono/4.4.7/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/hono/4.4.7/4.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>honojs/hono (hono)</summary> ### [`v4.5.1`](https://togithub.com/honojs/hono/releases/tag/v4.5.1) [Compare Source](https://togithub.com/honojs/hono/compare/v4.5.0...v4.5.1) #### What's Changed - chore: remove rimraf and use bun shell by [@​nakasyou](https://togithub.com/nakasyou) in [https://github.com/honojs/hono/pull/3146](https://togithub.com/honojs/hono/pull/3146) - chore: moving the setup file of vitest by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3157](https://togithub.com/honojs/hono/pull/3157) - fix(middleware/jwt): Changed the jwt-secret type to SignatureKey by [@​JulesVerner](https://togithub.com/JulesVerner) in [https://github.com/honojs/hono/pull/3167](https://togithub.com/honojs/hono/pull/3167) - feat(bearer-auth): Allow empty bearer-auth middleware prefixes by [@​prevostc](https://togithub.com/prevostc) in [https://github.com/honojs/hono/pull/3161](https://togithub.com/honojs/hono/pull/3161) - chore(factory): remove `@experimental` from `createApp` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3164](https://togithub.com/honojs/hono/pull/3164) - fix(client): support array values for `query` in `ws` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3169](https://togithub.com/honojs/hono/pull/3169) - fix(validator): ignore content-type mismatches by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3165](https://togithub.com/honojs/hono/pull/3165) #### New Contributors - [@​JulesVerner](https://togithub.com/JulesVerner) made their first contribution in [https://github.com/honojs/hono/pull/3167](https://togithub.com/honojs/hono/pull/3167) - [@​prevostc](https://togithub.com/prevostc) made their first contribution in [https://github.com/honojs/hono/pull/3161](https://togithub.com/honojs/hono/pull/3161) **Full Changelog**: honojs/hono@v4.5.0...v4.5.1 ### [`v4.5.0`](https://togithub.com/honojs/hono/compare/v4.4.13...v4.5.0) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.13...v4.5.0) ### [`v4.4.13`](https://togithub.com/honojs/hono/releases/tag/v4.4.13) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.12...v4.4.13) ##### What's Changed - chore: update benchmark by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3102](https://togithub.com/honojs/hono/pull/3102) - chore: replace tsx with Bun by [@​nakasyou](https://togithub.com/nakasyou) in [https://github.com/honojs/hono/pull/3103](https://togithub.com/honojs/hono/pull/3103) - refactor(http-status): remove unnecessary line of types and use common types by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3110](https://togithub.com/honojs/hono/pull/3110) - fix(jsx): redefine scope attribute as enum type by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3118](https://togithub.com/honojs/hono/pull/3118) - fix(types): allow `string[] | File[]` for RPC form value by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3117](https://togithub.com/honojs/hono/pull/3117) - fix(validator-types): type Alignment with Web Standards by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3120](https://togithub.com/honojs/hono/pull/3120) - fix(types): `app.use(path, mw)` return correct schema type by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3128](https://togithub.com/honojs/hono/pull/3128) **Full Changelog**: honojs/hono@v4.4.12...v4.4.13 ### [`v4.4.12`](https://togithub.com/honojs/hono/releases/tag/v4.4.12) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.11...v4.4.12) #### What's Changed - fix(aws-lambda): set cookies with comma is bugged by [@​NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/3084](https://togithub.com/honojs/hono/pull/3084) - fix(types): infer `path` when chaining after `use` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3087](https://togithub.com/honojs/hono/pull/3087) - chore: update outdated links in JSDoc by [@​ryuapp](https://togithub.com/ryuapp) in [https://github.com/honojs/hono/pull/3089](https://togithub.com/honojs/hono/pull/3089) - fix(jsx): changes behavior when `download` attribute is set to a boolean value. by [@​oon00b](https://togithub.com/oon00b) in [https://github.com/honojs/hono/pull/3094](https://togithub.com/honojs/hono/pull/3094) - chore: add the triage label by [@​mvares](https://togithub.com/mvares) in [https://github.com/honojs/hono/pull/3092](https://togithub.com/honojs/hono/pull/3092) - feat(types): improve JSONParsed by [@​m-shaka](https://togithub.com/m-shaka) in [https://github.com/honojs/hono/pull/3074](https://togithub.com/honojs/hono/pull/3074) - fix(helper/streaming): remove slow types by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3100](https://togithub.com/honojs/hono/pull/3100) - chore(utils/jwt): add `@module` docs by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3101](https://togithub.com/honojs/hono/pull/3101) #### New Contributors - [@​oon00b](https://togithub.com/oon00b) made their first contribution in [https://github.com/honojs/hono/pull/3094](https://togithub.com/honojs/hono/pull/3094) **Full Changelog**: honojs/hono@v4.4.11...v4.4.12 ### [`v4.4.11`](https://togithub.com/honojs/hono/releases/tag/v4.4.11) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.10...v4.4.11) #### What's Changed - refactor: remove unnecessary async keyword from router tests by [@​K-tecchan](https://togithub.com/K-tecchan) in [https://github.com/honojs/hono/pull/3061](https://togithub.com/honojs/hono/pull/3061) - fix(validator): don't return a FormData if formData is cached by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3067](https://togithub.com/honojs/hono/pull/3067) - fix(client): Add Query Parameter Support to WebSocket Client in `hono/client` by [@​naporin0624](https://togithub.com/naporin0624) in [https://github.com/honojs/hono/pull/3066](https://togithub.com/honojs/hono/pull/3066) - refactor(types): move `HandlerInterface`'s `(path, handler)`s overloads down by [@​NamesMT](https://togithub.com/NamesMT) in [https://github.com/honojs/hono/pull/3072](https://togithub.com/honojs/hono/pull/3072) - test(helper/dev): fix typo of test case name by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3073](https://togithub.com/honojs/hono/pull/3073) - fix(stream): Fixed a problem that onAbort() is called even if request is normally closed in deno by [@​usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/3079](https://togithub.com/honojs/hono/pull/3079) #### New Contributors - [@​K-tecchan](https://togithub.com/K-tecchan) made their first contribution in [https://github.com/honojs/hono/pull/3061](https://togithub.com/honojs/hono/pull/3061) **Full Changelog**: honojs/hono@v4.4.10...v4.4.11 ### [`v4.4.10`](https://togithub.com/honojs/hono/releases/tag/v4.4.10) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.9...v4.4.10) #### What's Changed - chore(jsr): export JWT utils by [@​ryuapp](https://togithub.com/ryuapp) in [https://github.com/honojs/hono/pull/3056](https://togithub.com/honojs/hono/pull/3056) - fix(streaming): call stream.abort() explicitly when request is aborted by [@​usualoma](https://togithub.com/usualoma) in [https://github.com/honojs/hono/pull/3042](https://togithub.com/honojs/hono/pull/3042) - fix(client): set Path as the default of Original by [@​m-shaka](https://togithub.com/m-shaka) in [https://github.com/honojs/hono/pull/3058](https://togithub.com/honojs/hono/pull/3058) #### New Contributors - [@​m-shaka](https://togithub.com/m-shaka) made their first contribution in [https://github.com/honojs/hono/pull/3058](https://togithub.com/honojs/hono/pull/3058) **Full Changelog**: honojs/hono@v4.4.9...v4.4.10 ### [`v4.4.9`](https://togithub.com/honojs/hono/releases/tag/v4.4.9) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.8...v4.4.9) #### What's Changed - perf(context): improve initializing `Context` by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3046](https://togithub.com/honojs/hono/pull/3046) - fix(types): correct inferring env when routes channing by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3051](https://togithub.com/honojs/hono/pull/3051) - docs: update the description of `package.json` and README by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3052](https://togithub.com/honojs/hono/pull/3052) - fix(timing): prevent duplicate applications by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3054](https://togithub.com/honojs/hono/pull/3054) **Full Changelog**: honojs/hono@v4.4.8...v4.4.9 ### [`v4.4.8`](https://togithub.com/honojs/hono/releases/tag/v4.4.8) [Compare Source](https://togithub.com/honojs/hono/compare/v4.4.7...v4.4.8) #### What's Changed - fix(jsx): add an explicit type by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3007](https://togithub.com/honojs/hono/pull/3007) - ci: use `env` for codecov GitHub Actions by [@​yusukebe](https://togithub.com/yusukebe) in [https://github.com/honojs/hono/pull/3010](https://togithub.com/honojs/hono/pull/3010) - chore: Fix typos in JSDoc by [@​NicoPlyley](https://togithub.com/NicoPlyley) in [https://github.com/honojs/hono/pull/3002](https://togithub.com/honojs/hono/pull/3002) - fix: change to allow use of websocket options by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/2999](https://togithub.com/honojs/hono/pull/2999) - perf: parseAccept without spread operator by [@​Jayllyz](https://togithub.com/Jayllyz) in [https://github.com/honojs/hono/pull/3003](https://togithub.com/honojs/hono/pull/3003) - test: add tests for buffer.ts by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3004](https://togithub.com/honojs/hono/pull/3004) - chore: upload bun test coverage to CodeCov by [@​exoego](https://togithub.com/exoego) in [https://github.com/honojs/hono/pull/3022](https://togithub.com/honojs/hono/pull/3022) - refactor: remove unneeded import statements by [@​EdamAme-x](https://togithub.com/EdamAme-x) in [https://github.com/honojs/hono/pull/3014](https://togithub.com/honojs/hono/pull/3014) - perf(utils/buffer): use promise all for better performance by [@​yasuaki640](https://togithub.com/yasuaki640) in [https://github.com/honojs/hono/pull/3031](https://togithub.com/honojs/hono/pull/3031) **Full Changelog**: honojs/hono@v4.4.7...v4.4.8 </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 4am on Monday" in timezone America/Chicago, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View the [repository job log](https://developer.mend.io/github/autoblocksai/cli). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
fixes #3032
What is needed in bun?
In bun, when a
ReadableStream
is returned in the response, cancel() is not called if the connection is disconnected, so the hono needs to listen for the connection to be disconnected.The following workaround is a strange piece of code, but I think it is acceptable because it would not work without it in bun.
https://github.com/honojs/hono/pull/3042/files#diff-b5c92850aac10e22281695a83a3d6d7a23f5455df59a11c597113914ef427774R14-R18
flaky test
Even stranger still, testing requests with
Bun.serve()
sometimes fails; I tried a number of patterns, including interspersing setTimeout, but I just couldn't get it to stabilise. The instability seems to occur only in unit tests, so if it succeeds on retry, it is considered OK.0b15369
The author should do the following, if applicable
bun run format:fix && bun run lint:fix
to format the code