rsocket-js icon indicating copy to clipboard operation
rsocket-js copied to clipboard

Error type is missing the source property

Open AndyOGo opened this issue 4 years ago • 5 comments

RSocket error frames are turning into standard Error() objects, and expanded by a source property. The Error type does not reflect that fact.

Expected Behavior

All errors should be of a custom error type, if applicable. And type guards could be useful too.

interface RSocketErrorSource {
  code: number;
  explanation: string;
  message: string;
}

interface RSocketError extends Error {
  source: RSocketErrorSource;
}
function isRSocketError(value: any): value is RSocketError {
  return Object.prototype.toString.call(value) === "[object Error]" && isRSocketErrorSource(value.source);
}

function isRSocketErrorSource(value: any): value is RSocketErrorSource {
  return source && source?.code && source?.explanation && source?.message;
}

Actual Behavior

Insufficient Error type is used, this prohibits auto-completion and discovery.

Affected code examples:

  • https://github.com/rsocket/rsocket-js/blob/04bbb8e3f14cc4712950906add16b963c87eb066/packages/rsocket-core/src/RSocketFrame.js#L189-L206

Possible Solution

Please see expected above, it shows an interface.

Your Environment

  • RSocket version(s) used: 0.0.25

AndyOGo avatar Jun 09 '21 17:06 AndyOGo

TS types would also need an update, like: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/rsocket-types

AndyOGo avatar Jun 10 '21 21:06 AndyOGo

Hey, @AndyOGo! Could you elaborate on what the desired change is? While createErrorFromFrame creates an error that has a type that can be described as RSocketError, the other references types, e.g. Flowable.js can accept any error, not necessarily an error having the source property.

SerCeMan avatar Jun 16 '21 05:06 SerCeMan

Hi @SerCeMan ! Thank you for your reply.

That is my point, createErrorFromFrame returns type Error. This typing is wrong, what it really returns is an extended error object, therefore the type should be RSocketError https://github.com/rsocket/rsocket-js/blob/04bbb8e3f14cc4712950906add16b963c87eb066/packages/rsocket-core/src/RSocketFrame.js#L189

It should change to:

export function createErrorFromFrame(frame: ErrorFrame): RSocketError { 

You are right, other refs can accept any error.

For these cases a type guard would be great, like:

function isRSocketError(value: any): value is RSocketError {
  return Object.prototype.toString.call(value) === "[object Error]" && isRSocketErrorSource(value.source);
}

function isRSocketErrorSource(value: any): value is RSocketErrorSource {
  return source && source?.code && source?.explanation && source?.message;
}

AndyOGo avatar Jun 16 '21 06:06 AndyOGo

Hey @AndyOGo , @SerCeMan,

Is my understanding correct that this mostly causes issues with developer experience related to code completion and IDE functionality? If so, I would propose that this is like a "won't fix", since we are primarily focused on #158, which will aim to provide better TypeScript support. Please let me know if I am misunderstanding.

viglucci avatar Mar 06 '22 15:03 viglucci

@viglucci Our use case was mainly for error reporting and is production critical.

Anyway you are right too, it also enhances code completion. #158 sounds great.

AndyOGo avatar Mar 07 '22 20:03 AndyOGo