-
-
Notifications
You must be signed in to change notification settings - Fork 479
fix: gracefully terminate connections when closing http server #5786
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
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
1454eba
Gracefully terminate connections when closing http server
nflaig 7a1e435
Log unexpected errors when shutting down server
nflaig 485a996
Fix code references in comments
nflaig 654bf05
More gracefully close eventstream api
nflaig 31450a4
Misc updates
nflaig a0c170b
Close idle connections on server
nflaig ff70972
Update ts-expect-error comments
nflaig File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,53 @@ | ||
| import {ErrorAborted, TimeoutError} from "./errors.js"; | ||
|
|
||
| export type WaitForOpts = { | ||
| /** Time in milliseconds between checking condition */ | ||
| interval?: number; | ||
| /** Time in milliseconds to wait before throwing TimeoutError */ | ||
| timeout?: number; | ||
| /** Abort signal to stop waiting for condition by throwing ErrorAborted */ | ||
| signal?: AbortSignal; | ||
| }; | ||
|
|
||
| /** | ||
| * Wait for a condition to be true | ||
| */ | ||
| export function waitFor(condition: () => boolean, opts: WaitForOpts = {}): Promise<void> { | ||
| return new Promise((resolve, reject) => { | ||
| const {interval = 10, timeout = Infinity, signal} = opts; | ||
|
|
||
| if (signal?.aborted) { | ||
| return reject(new ErrorAborted()); | ||
| } | ||
|
|
||
| if (condition()) { | ||
| return resolve(); | ||
| } | ||
|
|
||
| let onDone: () => void = () => {}; | ||
|
|
||
| const timeoutId = setTimeout(() => { | ||
| onDone(); | ||
| reject(new TimeoutError()); | ||
| }, timeout); | ||
|
|
||
| const intervalId = setInterval(() => { | ||
| if (condition()) { | ||
| onDone(); | ||
| resolve(); | ||
| } | ||
| }, interval); | ||
|
|
||
| const onAbort = (): void => { | ||
| onDone(); | ||
| reject(new ErrorAborted()); | ||
| }; | ||
| if (signal) signal.addEventListener("abort", onAbort); | ||
|
|
||
| onDone = () => { | ||
| clearTimeout(timeoutId); | ||
| clearInterval(intervalId); | ||
| if (signal) signal.removeEventListener("abort", onAbort); | ||
| }; | ||
| }); | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| import "../setup.js"; | ||
| import {expect} from "chai"; | ||
| import {waitFor} from "../../src/waitFor.js"; | ||
| import {ErrorAborted, TimeoutError} from "../../src/errors.js"; | ||
|
|
||
| describe("waitFor", () => { | ||
| const interval = 10; | ||
| const timeout = 20; | ||
|
|
||
| it("Should resolve if condition is already true", async () => { | ||
| await expect(waitFor(() => true, {interval, timeout})).to.be.fulfilled; | ||
| }); | ||
|
|
||
| it("Should resolve if condition becomes true within timeout", async () => { | ||
| let condition = false; | ||
| setTimeout(() => { | ||
| condition = true; | ||
| }, interval); | ||
| await waitFor(() => condition, {interval, timeout}); | ||
| }); | ||
|
|
||
| it("Should reject with TimeoutError if condition does not become true within timeout", async () => { | ||
| await expect(waitFor(() => false, {interval, timeout})).to.be.rejectedWith(TimeoutError); | ||
| }); | ||
|
|
||
| it("Should reject with ErrorAborted if aborted before condition becomes true", async () => { | ||
| const controller = new AbortController(); | ||
| setTimeout(() => controller.abort(), interval); | ||
| await expect(waitFor(() => false, {interval, timeout, signal: controller.signal})).to.be.rejectedWith(ErrorAborted); | ||
| }); | ||
|
|
||
| it("Should reject with ErrorAborted if signal is already aborted", async () => { | ||
| const controller = new AbortController(); | ||
| controller.abort(); | ||
| await expect(waitFor(() => true, {interval, timeout, signal: controller.signal})).to.be.rejectedWith(ErrorAborted); | ||
| }); | ||
| }); |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
I added this in #5330 to avoid noisy errors on shutdown, however eventstream aborts are now properly handled and no more error are logged on shutdown.
Since we attempt to gracefully close connections now, it is highly unlikely to log any errors on shutdown since we should only get
ErrorAbortedwhich is already checked and not logged. Any error that is not caught here is unexpected and should be logged.