Errors thrown by getPluginApiToken.

A plugin checks which error happened with instanceof:

try {
await getPluginApiToken(clientId);
} catch (e) {
if (e instanceof NotAuthenticatedError) {
// ask the user to sign in
}
}

For instanceof to work, the thrown error and the class the plugin compares against must be the same class object. These classes are defined here in the SDK core package — the same module the plugin imports getPluginApiToken from — so that condition holds.

The catch: the host integration (@urth/metatell-sdk-internal) is bundled separately and has its own copy of these classes. If it threw an error across the boundary, that error would belong to its copy, and e instanceof NotAuthenticatedError would be false in the plugin even for the "same" error. (This is the well-known problem that instanceof does not work across separate bundles.)

To avoid it, the host side never throws across the boundary. It returns a plain value describing the failure as a string code, and core translates that code into the matching class below before throwing (see errorForCode in ./index.ts). The error a plugin catches is therefore always an instance of the class it imported.

Hierarchy

  • Error
    • InvalidClientIdError

Constructors

Properties

cause?: unknown
clientId: string
message: string
name: string
stack?: string
stackTraceLimit: number

The Error.stackTraceLimit property specifies the number of stack frames collected by a stack trace (whether generated by new Error().stack or Error.captureStackTrace(obj)).

The default value is 10 but may be set to any valid JavaScript number. Changes will affect any stack trace captured after the value has been changed.

If set to a non-number value, or set to a negative number, stack traces will not capture any frames.

Methods

  • Creates a .stack property on targetObject, which when accessed returns a string representing the location in the code at which Error.captureStackTrace() was called.

    const myObject = {};
    Error.captureStackTrace(myObject);
    myObject.stack; // Similar to `new Error().stack`

    The first line of the trace will be prefixed with ${myObject.name}: ${myObject.message}.

    The optional constructorOpt argument accepts a function. If given, all frames above constructorOpt, including constructorOpt, will be omitted from the generated stack trace.

    The constructorOpt argument is useful for hiding implementation details of error generation from the user. For instance:

    function a() {
    b();
    }

    function b() {
    c();
    }

    function c() {
    // Create an error without stack trace to avoid calculating the stack trace twice.
    const { stackTraceLimit } = Error;
    Error.stackTraceLimit = 0;
    const error = new Error();
    Error.stackTraceLimit = stackTraceLimit;

    // Capture the stack trace above function b
    Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace
    throw error;
    }

    a();

    Parameters

    • targetObject: object
    • Optional constructorOpt: Function

    Returns void