UNPKG

n8n-bookstack-agent-tool

Version:

Comprehensive BookStack API integration tool for n8n AI Agent with MCP framework compatibility

104 lines 4.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ErrorHandler = exports.BookStackError = exports.BookStackErrorType = void 0; var BookStackErrorType; (function (BookStackErrorType) { BookStackErrorType["AUTHENTICATION"] = "AUTHENTICATION"; BookStackErrorType["AUTHORIZATION"] = "AUTHORIZATION"; BookStackErrorType["NOT_FOUND"] = "NOT_FOUND"; BookStackErrorType["VALIDATION"] = "VALIDATION"; BookStackErrorType["RATE_LIMIT"] = "RATE_LIMIT"; BookStackErrorType["SERVER_ERROR"] = "SERVER_ERROR"; BookStackErrorType["NETWORK_ERROR"] = "NETWORK_ERROR"; BookStackErrorType["TIMEOUT"] = "TIMEOUT"; BookStackErrorType["CONFIGURATION"] = "CONFIGURATION"; })(BookStackErrorType || (exports.BookStackErrorType = BookStackErrorType = {})); class BookStackError extends Error { constructor(type, message, statusCode, details) { super(message); this.name = 'BookStackError'; this.type = type; this.statusCode = statusCode; this.details = details; this.timestamp = new Date(); } toJSON() { return { name: this.name, type: this.type, message: this.message, statusCode: this.statusCode, details: this.details, timestamp: this.timestamp.toISOString(), stack: this.stack }; } } exports.BookStackError = BookStackError; class ErrorHandler { static handleApiError(error) { if (error instanceof BookStackError) { return error; } if (error.response) { const status = error.response.status; const data = error.response.data; const message = data?.message || data?.error || error.response.statusText; switch (status) { case 401: return new BookStackError(BookStackErrorType.AUTHENTICATION, `Authentication failed: ${message}`, status, data); case 403: return new BookStackError(BookStackErrorType.AUTHORIZATION, `Access forbidden: ${message}`, status, data); case 404: return new BookStackError(BookStackErrorType.NOT_FOUND, `Resource not found: ${message}`, status, data); case 422: return new BookStackError(BookStackErrorType.VALIDATION, `Validation error: ${message}`, status, data); case 429: return new BookStackError(BookStackErrorType.RATE_LIMIT, `Rate limit exceeded: ${message}`, status, data); case 500: case 502: case 503: case 504: return new BookStackError(BookStackErrorType.SERVER_ERROR, `Server error: ${message}`, status, data); default: return new BookStackError(BookStackErrorType.SERVER_ERROR, `HTTP error (${status}): ${message}`, status, data); } } else if (error.request) { return new BookStackError(BookStackErrorType.NETWORK_ERROR, 'Network error: No response received from BookStack API', undefined, { request: error.request }); } else if (error.code === 'ECONNABORTED') { return new BookStackError(BookStackErrorType.TIMEOUT, 'Request timeout: BookStack API did not respond in time', undefined, { timeout: true }); } else { return new BookStackError(BookStackErrorType.SERVER_ERROR, `Unexpected error: ${error.message}`, undefined, { originalError: error }); } } static handleValidationError(error) { if (error.name === 'ZodError') { const issues = error.issues.map((issue) => ({ path: issue.path.join('.'), message: issue.message, code: issue.code })); return new BookStackError(BookStackErrorType.VALIDATION, `Validation failed: ${issues.map((i) => `${i.path}: ${i.message}`).join(', ')}`, 422, { validationIssues: issues }); } return new BookStackError(BookStackErrorType.VALIDATION, `Validation error: ${error.message}`, 422, error); } static handleConfigurationError(message, details) { return new BookStackError(BookStackErrorType.CONFIGURATION, `Configuration error: ${message}`, undefined, details); } static isRetryableError(error) { return [ BookStackErrorType.NETWORK_ERROR, BookStackErrorType.TIMEOUT, BookStackErrorType.RATE_LIMIT ].includes(error.type) || (error.statusCode !== undefined && error.statusCode >= 500); } static getRetryDelay(attempt, baseDelay = 1000) { return Math.min(baseDelay * Math.pow(2, attempt), 30000); } } exports.ErrorHandler = ErrorHandler; //# sourceMappingURL=error-handler.js.map