n8n-bookstack-agent-tool
Version:
Comprehensive BookStack API integration tool for n8n AI Agent with MCP framework compatibility
104 lines • 4.88 kB
JavaScript
;
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