16 KiB
DebrosFramework Technical Reference
Core Architecture Components
DebrosFramework Main Class
Location: src/framework/DebrosFramework.ts
The main framework class that orchestrates all components:
export class DebrosFramework {
// Core services
private orbitDBService: FrameworkOrbitDBService;
private ipfsService: FrameworkIPFSService;
// Framework components
private databaseManager: DatabaseManager;
private shardManager: ShardManager;
private queryCache: QueryCache;
private relationshipManager: RelationshipManager;
private pinningManager: PinningManager;
private pubsubManager: PubSubManager;
private migrationManager: MigrationManager;
// Lifecycle methods
async initialize(orbitDBService?, ipfsService?, config?): Promise<void>
async start(): Promise<void>
async stop(): Promise<void>
getStatus(): FrameworkStatus
getMetrics(): FrameworkMetrics
}
BaseModel Class
Location: src/framework/models/BaseModel.ts
Abstract base class for all data models:
export abstract class BaseModel {
// Instance properties
public id: string;
public _loadedRelations: Map<string, any>;
protected _isDirty: boolean;
protected _isNew: boolean;
// Static configuration
static modelName: string;
static storeType: StoreType;
static scope: 'user' | 'global';
static sharding?: ShardingConfig;
static fields: Map<string, FieldConfig>;
static relationships: Map<string, RelationshipConfig>;
// CRUD operations
async save(): Promise<this>
static async create<T>(data: any): Promise<T>
static async findById<T>(id: string): Promise<T | null>
static query<T>(): QueryBuilder<T>
async delete(): Promise<void>
// Lifecycle hooks
async beforeCreate(): Promise<void>
async afterCreate(): Promise<void>
async beforeUpdate(): Promise<void>
async afterUpdate(): Promise<void>
async beforeDelete(): Promise<void>
async afterDelete(): Promise<void>
}
Decorator System
@Model Decorator
Location: src/framework/models/decorators/Model.ts
Configures model behavior and database storage:
interface ModelConfig {
scope: 'user' | 'global'; // Database scope
type: StoreType; // OrbitDB store type
sharding?: ShardingConfig; // Data distribution strategy
pinning?: PinningConfig; // Automatic pinning configuration
pubsub?: PubSubConfig; // Event publishing configuration
validation?: ValidationConfig; // Model-level validation
}
@Model({
scope: 'user',
type: 'docstore',
sharding: { strategy: 'hash', count: 4, key: 'userId' }
})
@Field Decorator
Location: src/framework/models/decorators/Field.ts
Defines field properties and validation:
interface FieldConfig {
type: FieldType; // Data type
required?: boolean; // Required field
unique?: boolean; // Unique constraint
default?: any | (() => any); // Default value
validate?: (value: any) => boolean; // Custom validation
transform?: (value: any) => any; // Data transformation
serialize?: boolean; // Include in serialization
index?: boolean; // Create index for field
virtual?: boolean; // Virtual field (not stored)
}
@Field({
type: 'string',
required: true,
unique: true,
validate: (value: string) => value.length >= 3,
transform: (value: string) => value.trim().toLowerCase()
})
Relationship Decorators
Location: src/framework/models/decorators/relationships.ts
// Many-to-one relationship
@BelongsTo(() => User, 'userId')
author: User;
// One-to-many relationship
@HasMany(() => Post, 'authorId')
posts: Post[];
// One-to-one relationship
@HasOne(() => Profile, 'userId')
profile: Profile;
// Many-to-many relationship
@ManyToMany(() => Tag, 'post_tags', 'tag_id', 'post_id')
tags: Tag[];
Lifecycle Hook Decorators
Location: src/framework/models/decorators/hooks.ts
@BeforeCreate()
setupDefaults() {
this.createdAt = Date.now();
}
@AfterCreate()
async sendNotification() {
await this.notifyUsers();
}
@BeforeUpdate()
updateTimestamp() {
this.updatedAt = Date.now();
}
@AfterUpdate()
async invalidateCache() {
await this.clearRelatedCache();
}
@BeforeDelete()
async checkPermissions() {
if (!this.canDelete()) {
throw new Error('Cannot delete this record');
}
}
@AfterDelete()
async cleanupRelations() {
await this.removeRelatedData();
}
Query System
QueryBuilder Class
Location: src/framework/query/QueryBuilder.ts
Fluent interface for building queries:
export class QueryBuilder<T> {
// Filter methods
where(field: string, value: any): QueryBuilder<T>
where(field: string, operator: string, value: any): QueryBuilder<T>
where(callback: (query: QueryBuilder<T>) => void): QueryBuilder<T>
orWhere(field: string, value: any): QueryBuilder<T>
whereIn(field: string, values: any[]): QueryBuilder<T>
whereNotIn(field: string, values: any[]): QueryBuilder<T>
whereNull(field: string): QueryBuilder<T>
whereNotNull(field: string): QueryBuilder<T>
whereLike(field: string, pattern: string): QueryBuilder<T>
// Relationship methods
with(relations: string[]): QueryBuilder<T>
withCount(relations: string[]): QueryBuilder<T>
// Ordering and limiting
orderBy(field: string, direction?: 'asc' | 'desc'): QueryBuilder<T>
limit(count: number): QueryBuilder<T>
offset(count: number): QueryBuilder<T>
// Field selection
select(fields: string[]): QueryBuilder<T>
distinct(field?: string): QueryBuilder<T>
// Caching
cache(ttl?: number): QueryBuilder<T>
// Execution methods
find(): Promise<T[]>
findOne(): Promise<T | null>
first(): Promise<T | null>
count(): Promise<number>
exists(): Promise<boolean>
paginate(page: number, perPage: number): Promise<PaginationResult<T>>
// Aggregation
sum(field: string): Promise<number>
avg(field: string): Promise<number>
min(field: string): Promise<any>
max(field: string): Promise<any>
}
Query Operators
type QueryOperator =
| 'eq' // Equal to
| 'ne' // Not equal to
| 'gt' // Greater than
| 'gte' // Greater than or equal
| 'lt' // Less than
| 'lte' // Less than or equal
| 'in' // In array
| 'not in' // Not in array
| 'like' // Pattern matching
| 'regex' // Regular expression
| 'is null' // Is null
| 'is not null' // Is not null
| 'includes' // Array includes value
| 'includes any'// Array includes any of values
| 'includes all'// Array includes all values
Database Management
DatabaseManager Class
Location: src/framework/core/DatabaseManager.ts
Handles database creation and lifecycle:
export class DatabaseManager {
// Database operations
async getGlobalDatabase(modelName: string): Promise<Database>
async getUserDatabase(userId: string, modelName: string): Promise<Database>
async createDatabase(name: string, type: StoreType, options?: any): Promise<Database>
async closeDatabase(name: string): Promise<void>
// Document operations
async getDocument(database: Database, storeType: StoreType, id: string): Promise<any>
async putDocument(database: Database, storeType: StoreType, id: string, data: any): Promise<void>
async deleteDocument(database: Database, storeType: StoreType, id: string): Promise<void>
async queryDocuments(database: Database, storeType: StoreType, query: any): Promise<any[]>
// Lifecycle
async initialize(orbitDBService: FrameworkOrbitDBService): Promise<void>
async stop(): Promise<void>
}
ShardManager Class
Location: src/framework/sharding/ShardManager.ts
Handles data distribution across shards:
export class ShardManager {
// Shard operations
getShardForKey(modelName: string, key: string): Shard
getShardForRange(modelName: string, value: any): Shard
getAllShards(modelName: string): Shard[]
// Shard management
async createShards(modelName: string, config: ShardingConfig): Promise<void>
async redistributeData(modelName: string, newShardCount: number): Promise<void>
// Configuration
setShardingConfig(modelName: string, config: ShardingConfig): void
getShardingConfig(modelName: string): ShardingConfig | undefined
}
interface ShardingConfig {
strategy: 'hash' | 'range' | 'user';
count: number;
key: string;
ranges?: ShardRange[];
}
interface Shard {
id: string;
database: Database;
range?: { min: any; max: any };
}
Relationship Management
RelationshipManager Class
Location: src/framework/relationships/RelationshipManager.ts
Handles loading and caching of model relationships:
export class RelationshipManager {
// Relationship loading
async loadRelationship(model: BaseModel, relationshipName: string): Promise<any>
async loadRelationships(model: BaseModel, relationshipNames: string[]): Promise<void>
async eagerLoadRelationships(models: BaseModel[], relationshipNames: string[]): Promise<void>
// Relationship operations
async attachRelationship(model: BaseModel, relationshipName: string, relatedModel: BaseModel): Promise<void>
async detachRelationship(model: BaseModel, relationshipName: string, relatedModel: BaseModel): Promise<void>
async syncRelationship(model: BaseModel, relationshipName: string, relatedModels: BaseModel[]): Promise<void>
// Caching
getCachedRelationship(model: BaseModel, relationshipName: string): any
setCachedRelationship(model: BaseModel, relationshipName: string, data: any): void
clearRelationshipCache(model: BaseModel, relationshipName?: string): void
}
Migration System
MigrationManager Class
Location: src/framework/migrations/MigrationManager.ts
Handles schema evolution and data transformation:
export class MigrationManager {
// Migration operations
async runMigration(migrationId: string): Promise<MigrationResult>
async rollbackMigration(migrationId: string): Promise<MigrationResult>
async runPendingMigrations(): Promise<MigrationResult[]>
// Migration management
registerMigration(migration: Migration): void
getPendingMigrations(): Migration[]
getAppliedMigrations(): Promise<string[]>
// Status
getMigrationStatus(): Promise<MigrationStatus>
}
interface Migration {
id: string;
version: string;
name: string;
description: string;
targetModels: string[];
up: MigrationOperation[];
down: MigrationOperation[];
dependencies?: string[];
validators?: MigrationValidator[];
}
MigrationBuilder Class
Location: src/framework/migrations/MigrationBuilder.ts
Fluent interface for creating migrations:
export function createMigration(name: string, version: string): MigrationBuilder {
return new MigrationBuilder(name, version);
}
export class MigrationBuilder {
// Field operations
addField(modelName: string, fieldName: string, config: FieldConfig): MigrationBuilder
removeField(modelName: string, fieldName: string): MigrationBuilder
modifyField(modelName: string, fieldName: string, config: FieldConfig): MigrationBuilder
renameField(modelName: string, oldName: string, newName: string): MigrationBuilder
// Index operations
addIndex(modelName: string, fields: string[], options?: IndexOptions): MigrationBuilder
removeIndex(modelName: string, indexName: string): MigrationBuilder
// Data transformation
transformData(modelName: string, transformer: (data: any) => any): MigrationBuilder
// Validation
addValidator(name: string, validator: MigrationValidator): MigrationBuilder
// Build migration
build(): Migration
}
Caching System
QueryCache Class
Location: src/framework/query/QueryCache.ts
Intelligent caching of query results:
export class QueryCache {
// Cache operations
get(key: string): Promise<any>
set(key: string, value: any, ttl?: number): Promise<void>
delete(key: string): Promise<void>
clear(): Promise<void>
// Cache management
invalidateModelCache(modelName: string): Promise<void>
invalidateUserCache(userId: string): Promise<void>
// Statistics
getStats(): CacheStats
getHitRate(): number
}
RelationshipCache Class
Location: src/framework/relationships/RelationshipCache.ts
Specialized caching for relationship data:
export class RelationshipCache {
// Relationship caching
getCachedRelationship(modelId: string, relationshipName: string): any
setCachedRelationship(modelId: string, relationshipName: string, data: any, ttl?: number): void
invalidateRelationship(modelId: string, relationshipName: string): void
// Batch operations
preloadRelationships(modelIds: string[], relationshipNames: string[]): Promise<void>
warmCache(modelName: string, relationshipName: string): Promise<void>
}
Type Definitions
Framework Types
Location: src/framework/types/framework.ts
export interface FrameworkConfig {
cache?: CacheConfig;
queryOptimization?: QueryOptimizationConfig;
automaticPinning?: PinningConfig;
pubsub?: PubSubConfig;
development?: DevelopmentConfig;
}
export interface CacheConfig {
enabled?: boolean;
maxSize?: number;
ttl?: number;
}
export type StoreType = 'docstore' | 'eventlog' | 'keyvalue' | 'counter' | 'feed';
Model Types
Location: src/framework/types/models.ts
export interface FieldConfig {
type: FieldType;
required?: boolean;
unique?: boolean;
default?: any | (() => any);
validate?: (value: any) => boolean;
transform?: (value: any) => any;
serialize?: boolean;
index?: boolean;
virtual?: boolean;
}
export type FieldType = 'string' | 'number' | 'boolean' | 'array' | 'object' | 'date';
export interface RelationshipConfig {
type: 'belongsTo' | 'hasMany' | 'hasOne' | 'manyToMany';
target: () => typeof BaseModel;
foreignKey: string;
localKey?: string;
through?: string;
throughForeignKey?: string;
throughLocalKey?: string;
}
Query Types
Location: src/framework/types/queries.ts
export interface QueryOptions {
where?: WhereClause[];
orderBy?: OrderByClause[];
limit?: number;
offset?: number;
with?: string[];
cache?: boolean | number;
}
export interface WhereClause {
field: string;
operator: QueryOperator;
value: any;
boolean: 'and' | 'or';
}
export interface OrderByClause {
field: string;
direction: 'asc' | 'desc';
}
export interface PaginationResult<T> {
data: T[];
total: number;
page: number;
perPage: number;
totalPages: number;
hasNext: boolean;
hasPrev: boolean;
}
Error Handling
Framework Errors
export class DebrosFrameworkError extends Error {
code: string;
details?: any;
constructor(message: string, code?: string, details?: any) {
super(message);
this.name = 'DebrosFrameworkError';
this.code = code || 'UNKNOWN_ERROR';
this.details = details;
}
}
export class ValidationError extends DebrosFrameworkError {
field: string;
value: any;
constraint: string;
}
export class QueryError extends DebrosFrameworkError {
query: string;
parameters?: any[];
}
export class RelationshipError extends DebrosFrameworkError {
modelName: string;
relationshipName: string;
relatedModel: string;
}
Performance Optimization
Query Optimization
Location: src/framework/query/QueryOptimizer.ts
export class QueryOptimizer {
// Query optimization
optimizeQuery(query: QueryBuilder<any>): QueryBuilder<any>
analyzeQueryPerformance(query: QueryBuilder<any>): Promise<QueryAnalysis>
suggestIndexes(modelName: string): Promise<IndexSuggestion[]>
// Statistics
getSlowQueries(): Promise<SlowQuery[]>
getQueryStats(): Promise<QueryStats>
}
LazyLoader Class
Location: src/framework/relationships/LazyLoader.ts
export class LazyLoader {
// Lazy loading
async loadOnDemand(model: BaseModel, relationshipName: string): Promise<any>
async batchLoad(models: BaseModel[], relationshipName: string): Promise<void>
// Configuration
setBatchSize(size: number): void
setLoadingStrategy(strategy: 'immediate' | 'batched' | 'deferred'): void
}
This technical reference provides the implementation details needed to work effectively with the DebrosFramework codebase.