feat(web-api): add support for AbortSignal#2403
Conversation
|
Thanks for the contribution! Before we can merge this, we need @LinusU to sign the Salesforce Inc. Contributor License Agreement. |
|
@salesforce-cla signed ✅ |
|
Hey @LinusU! 👋 Thanks so much for sending this contribution in 👾 ✨ At the moment we're exploring another approach of a custom fetch attribute as an option to the I don't have more to share for node-slack-sdk/packages/webhook/README.md Lines 95 to 133 in 56a6183 Let's keep this open while that's explored, but I'm curious if the |
|
Hey @zimeg, thanks for taking a look at this! 👋
I would love for this package to be based on fetch instead of Aaxios, and I took special care when writing this to not expose any Axios-specific behaviour (e.g. that is why I do the little dance to throw the correct error, instead of the Axios-specific cancelled error). So this should pair up great together with the fetch move! With that said, I do not think that being able to pass in a custom fetch-function would solve the problem here. We are using AbortSignals across large parts of our app, not just as a tool to set a specific timeout on http requests. I need to be able to pass Side note: the example you linked will cancel every single request made 400 milliseconds after the |
|
ping @zimeg, have you had a chance to read my last comment? 🙏 |
|
ping @zimeg, have you had a chance to look at this? 🙏 |
zimeg
left a comment
There was a problem hiding this comment.
@LinusU Thank you for keeping these changes alive and relevant 💌
I haven't had a good chance to test this yet but I do now understand it's a separate change from what I suggest earlier and think your approach of adding another argument is most solid:
public async apiCall(
method: string,
options: Record<string, unknown> = {},
+ config?: { signal?: AbortSignal },
): Promise<WebAPICallResult> {Leaving a few comments from code review which is looking great! I do notice a merge conflict appeared and I left a few questions for this meantime 🚢
| if (e.name === 'CanceledError' && options?.signal?.reason) { | ||
| throw new pRetry.AbortError(options.signal.reason); | ||
| } |
There was a problem hiding this comment.
🔬 question: Is CanceledError the most common error code here? I understand we can catch related errors in following changes, but I notice separate codes on MDN docs:
- AbortError
- TimeoutError
And it's not obvious to me if that's exhaustive or if it's missing CanceledError and more! 🤓
There was a problem hiding this comment.
CanceledError here is from axios, so it will always be CanceledError on every platform, since it's an error constructed in "user space" code.
As long as axios is used, this will work. And as I said earlier, this intentionally does not expose CancelError, so that a switch to fetch would be seamless! 🚀
| const e = error as any; | ||
| this.logger.warn('http request failed', e.message); | ||
| if (e.name === 'CanceledError' && options?.signal?.reason) { | ||
| throw new pRetry.AbortError(options.signal.reason); |
There was a problem hiding this comment.
🎁 thought: We throw new AbortError above and I'm uncertain if we want to use new here or continue referencing the pRetry package? The tests above do show this is caught as expected which is great.
There was a problem hiding this comment.
I've removed the pRetry. part now, to make it match the rest of the code. However, it's the same class, just exposed in two different places, so no runtime difference
🦋 Changeset detectedLatest commit: 83afbff The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Sorry for the super late reply 🙈 I totally missed that you answered me the same day! I've rebased on latest Tests are still passing locally for me, and I would still love to see this merged! 🙏 |
Summary
This adds support for aborting in-flight requests, using the standardized
AbortSignalFixes #1761
I've designed this as an additional parameter instead of mixing it with the body of the specific endpoint. I believe that this is a sounder approach as there will never be any conflicts, and it also avoids the current problem of
tokenalso being present in the request body as well as in the header when specified this way.Requirements (place an
xin each[ ])