Skip to content
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

Merged
merged 12 commits into from
Jun 28, 2024

Conversation

usualoma
Copy link
Member

@usualoma usualoma commented Jun 25, 2024

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

  • Add tests
  • Run tests
  • bun run format:fix && bun run lint:fix to format the code
  • Add TSDoc/JSDoc to document the code

@usualoma usualoma force-pushed the feat/streaming-abort-bun branch from 20b94bc to 9f5a78c Compare June 25, 2024 23:47
Copy link

codecov bot commented Jun 25, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 95.87%. Comparing base (a6ad42d) to head (49b770b).

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.
📢 Have feedback on the report? Share it here.

@usualoma usualoma marked this pull request as ready for review June 28, 2024 00:08
@usualoma
Copy link
Member Author

@yusukebe Would you please review?

@yusukebe
Copy link
Member

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.mp4

Node.js (works):

node.mp4

Btw, it has the same behavior as Node.js on Deno.

@yusukebe
Copy link
Member

@usualoma

Is the abort fired when closing the browser?

@yusukebe
Copy link
Member

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.

@usualoma
Copy link
Member Author

@yusukebe Sorry, I think the stream() one is working, but the streamSSE() one was not. Please wait a bit while I fix it.

@usualoma
Copy link
Member Author

@yusukebe
I finally understood what we needed.

In a bun, the destruction of c would start when the response was returned, so we needed to suppress that. In 55b6c8c, I made it so that c is held until a readableStream is destroyed, which solved the problem. This change also made flaky tests more stable.

Copy link
Member

@yusukebe yusukebe left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@yusukebe
Copy link
Member

Hi @usualoma !

Thanks for the investigation and implementation. it works well. Merging now.

@yusukebe yusukebe merged commit 2d3bc55 into honojs:main Jun 28, 2024
14 checks passed
@usualoma usualoma deleted the feat/streaming-abort-bun branch July 2, 2024 00:10
adamnolte referenced this pull request in autoblocksai/cli Jul 24, 2024
[![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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;yusukebe](https://togithub.com/yusukebe) in
[https://github.com/honojs/hono/pull/3165](https://togithub.com/honojs/hono/pull/3165)

#### New Contributors

- [@&#8203;JulesVerner](https://togithub.com/JulesVerner) made their
first contribution in
[https://github.com/honojs/hono/pull/3167](https://togithub.com/honojs/hono/pull/3167)
- [@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;yusukebe](https://togithub.com/yusukebe) in
[https://github.com/honojs/hono/pull/3101](https://togithub.com/honojs/hono/pull/3101)

#### New Contributors

- [@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;usualoma](https://togithub.com/usualoma) in
[https://github.com/honojs/hono/pull/3079](https://togithub.com/honojs/hono/pull/3079)

#### New Contributors

- [@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;m-shaka](https://togithub.com/m-shaka) in
[https://github.com/honojs/hono/pull/3058](https://togithub.com/honojs/hono/pull/3058)

#### New Contributors

- [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Abort does not work with bun
2 participants