open-brainy/examples/brainy-service-template/src/utils/errors.js
David Snelling ee003a9473 feat: add zero-configuration Brainy service template with augmentation-first architecture
- Implement WebSocket augmentation for real-time communication
- Implement WebRTC augmentation for peer-to-peer connections
- Implement HTTP augmentation as minimal REST fallback
- Add auto-discovery augmentation for data pattern analysis
- Add adaptive storage augmentation for intelligent resource management
- Add environment adapter augmentation for universal compatibility
- Template auto-detects environment (browser, Node.js, serverless, containers)
- Intelligent transport selection (WebRTC → WebSocket → HTTP)
- Automatic storage optimization (memory → filesystem → S3)
- Zero configuration required - just npm start
- Includes intelligent verb scoring by default
- Works in any environment without configuration
- Full documentation and examples included
2025-08-06 18:17:32 -07:00

95 lines
No EOL
2.4 KiB
JavaScript

export class ApiError extends Error {
constructor(statusCode, message, isOperational = true, stack = '') {
super(message)
this.name = this.constructor.name
this.statusCode = statusCode
this.isOperational = isOperational
if (stack) {
this.stack = stack
} else {
Error.captureStackTrace(this, this.constructor)
}
}
}
export class ValidationError extends ApiError {
constructor(message, field = null) {
super(400, message)
this.field = field
this.name = 'ValidationError'
}
}
export class NotFoundError extends ApiError {
constructor(resource, id = null) {
const message = id
? `${resource} with ID ${id} not found`
: `${resource} not found`
super(404, message)
this.name = 'NotFoundError'
this.resource = resource
this.resourceId = id
}
}
export class ConflictError extends ApiError {
constructor(message) {
super(409, message)
this.name = 'ConflictError'
}
}
export class DatabaseError extends ApiError {
constructor(message, operation = null) {
super(500, message)
this.name = 'DatabaseError'
this.operation = operation
}
}
export class AuthenticationError extends ApiError {
constructor(message = 'Authentication failed') {
super(401, message)
this.name = 'AuthenticationError'
}
}
export class AuthorizationError extends ApiError {
constructor(message = 'Insufficient permissions') {
super(403, message)
this.name = 'AuthorizationError'
}
}
export class RateLimitError extends ApiError {
constructor(message = 'Rate limit exceeded') {
super(429, message)
this.name = 'RateLimitError'
}
}
// Error factory for common scenarios
export const createError = {
validation: (message, field) => new ValidationError(message, field),
notFound: (resource, id) => new NotFoundError(resource, id),
conflict: (message) => new ConflictError(message),
database: (message, operation) => new DatabaseError(message, operation),
auth: (message) => new AuthenticationError(message),
forbidden: (message) => new AuthorizationError(message),
rateLimit: (message) => new RateLimitError(message),
badRequest: (message) => new ApiError(400, message),
internal: (message) => new ApiError(500, message)
}
export default {
ApiError,
ValidationError,
NotFoundError,
ConflictError,
DatabaseError,
AuthenticationError,
AuthorizationError,
RateLimitError,
createError
}