-
Notifications
You must be signed in to change notification settings - Fork 814
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
chore: fix lint errors on opentelemetry-context-async-hooks #2338
Conversation
|
}); | ||
// patch methods that remove a listener | ||
if (typeof ee.removeListener === 'function') { | ||
ee.removeListener = this._patchRemoveListener(ee, ee.removeListener); | ||
const { removeListener, off, removeAllListeners } = ee |
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.
Until we bump to TS 4.4, we'll need to do it.
https://devblogs.microsoft.com/typescript/announcing-typescript-4-4-beta/#cfa-aliased-conditions
@@ -18,6 +18,11 @@ import { ContextManager, Context } from '@opentelemetry/api'; | |||
import { EventEmitter } from 'events'; | |||
|
|||
type Func<T> = (...args: unknown[]) => T; | |||
type UnknownFunc = Func<unknown>; |
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.
Does this type really save us anything?
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.
It's just to avoid writing Func<unknown>
on lines 24 and 76, and I think it's easier to read.
But I could remove this type if you prefer.
@@ -62,13 +67,13 @@ export abstract class AbstractAsyncHooksContextManager | |||
return this._bindEventEmitter(context, target); | |||
} | |||
|
|||
if (typeof target === 'function') { | |||
if (isUnknownFunc(target)) { |
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.
This fixes the lint error technically but doesn't actually fix the problem the lint is trying to point out. This will still return true for constructors so doesn't provide any additional safety. IMO it would be better to use a comment to disable the lint warning as a much more obvious solution.
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.
There are some workarounds to check if something is a constructor: https://stackoverflow.com/questions/40922531/how-to-check-if-a-javascript-function-is-a-constructor
Perhaps it would better also checking in inUnknownFunc
/isGenericFunc
if the argument is a constructor and, if yes, returns false
?
I would like to avoid a comment ignoring the lint error.
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.
A comment ignoring the lint error clearly shows "i know this is dangerous and I accept it." A type which obfuscates the danger can come back to bite you later. If a constructor is passed to bind, there really isn't much we can or should do about it but let it fail.
edit: i suppose we could just skip and not bind it... @vmarchaud @obecny what do you think?
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.
As far as I know NodeJs uses internally checks like typeof(arg) === 'function'
and they don't care about constructors. Technically it's possible to create a function which can act as constructor and as normal function.
Therefore I don't think we should add a lot complexity here trying to fix a problem which is on caller side.
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 agree with @Flarna here, i don't think we had the issue with any instrumentation so adding this much complexity for a problem that we don't have seems pointless right now. I would prefer to wait for an user having this issue to try to fix it
if (ee[methodName] === undefined) return; | ||
ee[methodName] = this._patchAddListener(ee, ee[methodName], context); | ||
const method = ee[methodName]; | ||
if (isGenericFunc(method)) { |
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.
Same issue here, your type guard doesn't actually differentiate between this function and any other type of function.
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.
Answered above.
Codecov Report
@@ Coverage Diff @@
## main #2338 +/- ##
=======================================
Coverage 92.77% 92.77%
=======================================
Files 145 145
Lines 5216 5220 +4
Branches 1068 1068
=======================================
+ Hits 4839 4843 +4
Misses 377 377
|
type UnknownFuncReturns<T extends (...args: unknown[]) => unknown> = (...args: unknown[]) => ReturnType<T>; | ||
|
||
const isUnknownFunc = (fn: unknown): fn is UnknownFunc => typeof fn === 'function'; | ||
const isGenericFunc = <T>(fn: (...args: never[]) => T): fn is Func<T> => typeof fn === 'function'; |
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 don't see why we should differenciate between both, i think the second typeguard is fine to use everywhere no ?
IMO this PR is doing more than just fixing lint errors. Adding function call overhead to such critical functions seems an unnecessary performance penalty to me just to remove lint errors. |
This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 14 days. |
This PR was closed because it has been stale for 14 days with no activity. |
Which problem is this PR solving?
Short description of the changes
Fix the following lint errors: