blockstack
Version:
The Blockstack Javascript library for authentication, identity, and storage.
320 lines (283 loc) • 7.81 kB
text/typescript
/**
* @ignore
*/
export const ERROR_CODES = {
MISSING_PARAMETER: 'missing_parameter',
REMOTE_SERVICE_ERROR: 'remote_service_error',
INVALID_STATE: 'invalid_state',
NO_SESSION_DATA: 'no_session_data',
DOES_NOT_EXIST: 'does_not_exist',
FAILED_DECRYPTION_ERROR: 'failed_decryption_error',
INVALID_DID_ERROR: 'invalid_did_error',
NOT_ENOUGH_FUNDS_ERROR: 'not_enough_error',
INVALID_AMOUNT_ERROR: 'invalid_amount_error',
LOGIN_FAILED_ERROR: 'login_failed',
SIGNATURE_VERIFICATION_ERROR: 'signature_verification_failure',
CONFLICT_ERROR: 'conflict_error',
NOT_ENOUGH_PROOF_ERROR: 'not_enough_proof_error',
BAD_PATH_ERROR: 'bad_path_error',
VALIDATION_ERROR: 'validation_error',
PAYLOAD_TOO_LARGE_ERROR: 'payload_too_large_error',
PRECONDITION_FAILED_ERROR: 'precondition_failed_error',
UNKNOWN: 'unknown'
}
Object.freeze(ERROR_CODES)
/**
* @ignore
*/
type ErrorData = {
code: string,
parameter?: string,
message: string
}
/**
* @ignore
*/
export class BlockstackError extends Error {
message: string
code: string
parameter?: string
constructor(error: ErrorData) {
super()
let message = error.message
let bugDetails = `Error Code: ${error.code}`
let stack = this.stack
if (!stack) {
try {
throw new Error()
} catch (e) {
stack = e.stack
}
} else {
bugDetails += `Stack Trace:\n${stack}`
}
message += `\nIf you believe this exception is caused by a bug in blockstack.js,
please file a bug report: https://github.com/blockstack/blockstack.js/issues\n\n${bugDetails}`
this.message = message
this.code = error.code
this.parameter = error.parameter ? error.parameter : null
}
toString() {
return `${super.toString()}
code: ${this.code} param: ${this.parameter ? this.parameter : 'n/a'}`
}
}
/**
* @ignore
*/
export class InvalidParameterError extends BlockstackError {
constructor(parameter: string, message: string = '') {
super({ code: ERROR_CODES.MISSING_PARAMETER, message, parameter: '' })
this.name = 'MissingParametersError'
}
}
/**
* @ignore
*/
export class MissingParameterError extends BlockstackError {
constructor(parameter: string, message: string = '') {
super({ code: ERROR_CODES.MISSING_PARAMETER, message, parameter })
this.name = 'MissingParametersError'
}
}
/**
* @ignore
*/
export class RemoteServiceError extends BlockstackError {
response: Response
constructor(response: Response, message: string = '') {
super({ code: ERROR_CODES.REMOTE_SERVICE_ERROR, message })
this.response = response
}
}
/**
* @ignore
*/
export class InvalidDIDError extends BlockstackError {
constructor(message: string = '') {
super({ code: ERROR_CODES.INVALID_DID_ERROR, message })
this.name = 'InvalidDIDError'
}
}
/**
* @ignore
*/
export class NotEnoughFundsError extends BlockstackError {
leftToFund: number
constructor(leftToFund: number) {
const message = `Not enough UTXOs to fund. Left to fund: ${leftToFund}`
super({ code: ERROR_CODES.NOT_ENOUGH_FUNDS_ERROR, message })
this.leftToFund = leftToFund
this.name = 'NotEnoughFundsError'
this.message = message
}
}
/**
* @ignore
*/
export class InvalidAmountError extends BlockstackError {
fees: number
specifiedAmount: number
constructor(fees: number, specifiedAmount: number) {
const message = `Not enough coin to fund fees transaction fees. Fees would be ${fees},`
+ ` specified spend is ${specifiedAmount}`
super({ code: ERROR_CODES.INVALID_AMOUNT_ERROR, message })
this.specifiedAmount = specifiedAmount
this.fees = fees
this.name = 'InvalidAmountError'
this.message = message
}
}
/**
* @ignore
*/
export class LoginFailedError extends BlockstackError {
constructor(reason: string) {
const message = `Failed to login: ${reason}`
super({ code: ERROR_CODES.LOGIN_FAILED_ERROR, message })
this.message = message
this.name = 'LoginFailedError'
}
}
/**
* @ignore
*/
export class SignatureVerificationError extends BlockstackError {
constructor(reason: string) {
const message = `Failed to verify signature: ${reason}`
super({ code: ERROR_CODES.SIGNATURE_VERIFICATION_ERROR, message })
this.message = message
this.name = 'SignatureVerificationError'
}
}
/**
* @ignore
*/
export class FailedDecryptionError extends BlockstackError {
constructor(message: string = 'Unable to decrypt cipher object.') {
super({ code: ERROR_CODES.FAILED_DECRYPTION_ERROR, message })
this.message = message
this.name = 'FailedDecryptionError'
}
}
/**
* @ignore
*/
export class InvalidStateError extends BlockstackError {
constructor(message: string) {
super({ code: ERROR_CODES.INVALID_STATE, message })
this.message = message
this.name = 'InvalidStateError'
}
}
/**
* @ignore
*/
export class NoSessionDataError extends BlockstackError {
constructor(message: string) {
super({ code: ERROR_CODES.INVALID_STATE, message })
this.message = message
this.name = 'NoSessionDataError'
}
}
/**
* @ignore
*/
export interface GaiaHubErrorResponse {
status: number,
statusText: string,
body?: string | any
}
export interface HubErrorDetails {
message?: string
statusCode: number
statusText: string
[prop: string]: any
}
/**
* @ignore
*/
export class GaiaHubError extends BlockstackError {
hubError: HubErrorDetails
constructor(error: ErrorData, response: GaiaHubErrorResponse) {
super(error)
if (response) {
this.hubError = {
statusCode: response.status,
statusText: response.statusText
}
if (typeof response.body === 'string') {
this.hubError.message = response.body
} else if (typeof response.body === 'object') {
Object.assign(this.hubError, response.body)
}
}
}
}
/**
* @ignore
*/
export class DoesNotExist extends GaiaHubError {
constructor(message: string, response: GaiaHubErrorResponse) {
super({ message, code: ERROR_CODES.DOES_NOT_EXIST }, response)
this.name = 'DoesNotExist'
}
}
/**
* @ignore
*/
export class ConflictError extends GaiaHubError {
constructor(message: string, response: GaiaHubErrorResponse) {
super({ message, code: ERROR_CODES.CONFLICT_ERROR }, response)
this.name = 'ConflictError'
}
}
/**
* @ignore
*/
export class NotEnoughProofError extends GaiaHubError {
constructor(message: string, response: GaiaHubErrorResponse) {
super({ message, code: ERROR_CODES.NOT_ENOUGH_PROOF_ERROR }, response)
this.name = 'NotEnoughProofError'
}
}
/**
* @ignore
*/
export class BadPathError extends GaiaHubError {
constructor(message: string, response: GaiaHubErrorResponse) {
super({ message, code: ERROR_CODES.BAD_PATH_ERROR }, response)
this.name = 'BadPathError'
}
}
/**
* @ignore
*/
export class ValidationError extends GaiaHubError {
constructor(message: string, response: GaiaHubErrorResponse) {
super({ message, code: ERROR_CODES.VALIDATION_ERROR }, response)
this.name = 'ValidationError'
}
}
/**
* @ignore
*/
export class PayloadTooLargeError extends GaiaHubError {
/** Can be `null` when an oversized payload is detected client-side. */
hubError: HubErrorDetails
maxUploadByteSize: number;
constructor(message: string, response: GaiaHubErrorResponse, maxUploadByteSize: number) {
super({ message, code: ERROR_CODES.PAYLOAD_TOO_LARGE_ERROR }, response)
this.name = 'PayloadTooLargeError'
this.maxUploadByteSize = maxUploadByteSize
}
}
/**
* @ignore
*/
export class PreconditionFailedError extends GaiaHubError {
constructor(message: string, response: GaiaHubErrorResponse) {
super({ message, code: ERROR_CODES.PRECONDITION_FAILED_ERROR }, response)
this.name = 'PreconditionFailedError'
}
}