import type { CommandMethods, CommandResponse } from '../types/command.ts' import type { Reason } from '../types/reason.ts' import { ReasonCodes } from '../types/reason.ts' export class BlipError extends Error { constructor( public readonly uri: string, public readonly cause: Reason, public commandResponse?: CommandResponse, ) { super(`Blip command for ${uri} failed (${cause.code}): ${cause.description}`) } public get code(): number { return this.cause.code } public static isFailedCommandResponse( maybeCommandResponse: unknown, ): maybeCommandResponse is CommandResponse { return ( typeof maybeCommandResponse === 'object' && maybeCommandResponse !== null && 'status' in maybeCommandResponse && maybeCommandResponse.status === 'failure' ) } public static commandResponseToBlipError( uri: string, commandResponse: CommandResponse, ): BlipError { return new BlipError(uri, commandResponse.reason, commandResponse) } static retryableBlipErrors = [ ReasonCodes.PipelineTimeout, ReasonCodes.MaxThroughputExceeded, ReasonCodes.GeneralError, ReasonCodes.FailedToSendEnvelopeViaHTTP, ReasonCodes.PendingRequest, ReasonCodes.CommandProcessingError, ] }