Skip to content

Architecture

ddb-lib is designed as a modular monorepo with clear separation of concerns. Each package serves a specific purpose and can be used independently or combined with others.

Design principles

1. modularity

Each package is independent and focused on a single responsibility: - Core: Pure utilities with zero dependencies - Stats: Framework-agnostic monitoring - Client: Full-featured DynamoDB client - Amplify: Amplify-specific integration

2. zero to minimal dependencies

Packages minimize external dependencies to reduce bundle size and security surface: - @ddb-lib/core: Zero dependencies - @ddb-lib/stats: Only depends on core - @ddb-lib/client: Depends on core, stats, and AWS SDK (peer) - @ddb-lib/amplify: Depends on core, stats, and aws-amplify (peer)

3. tree-shakeable

All packages support tree-shaking, ensuring unused code is eliminated from your bundle.

4. type safety

Full TypeScript support throughout with strict typing and inference.

Package architecture

Package Dependency Graph

graph TD
    A[Your Application] --> B[@ddb-lib/client]
    A --> C[@ddb-lib/amplify]
    B --> D[@ddb-lib/core]
    B --> E[@ddb-lib/stats]
    C --> D
    C --> E
    E --> D
    B --> F[AWS SDK v3]
    C --> G[aws-amplify]

    style A fill:#e3f2fd
    style B fill:#c8e6c9
    style C fill:#c8e6c9
    style D fill:#fff9c4
    style E fill:#fff9c4
    style F fill:#ffccbc
    style G fill:#ffccbc

Package responsibilities

@ddb-lib/core

Purpose: Pure utility functions for DynamoDB patterns

Responsibilities: - Pattern helpers (entity keys, composite keys, time-series, etc.) - Multi-attribute key utilities - Expression builders (key conditions, filters, conditions) - Type guards and validators

No Dependencies: Can be used anywhere, even in browser environments

@ddb-lib/stats

Purpose: Performance monitoring and optimization

Responsibilities: - Statistics collection - Recommendation generation - Anti-pattern detection - Performance metrics aggregation

Framework Agnostic: Works with any data access layer

@ddb-lib/client

Purpose: Full-featured DynamoDB client

Responsibilities: - All DynamoDB operations (CRUD, query, scan, batch, transactions) - Automatic statistics collection - Retry logic with exponential backoff - Access pattern definitions - Error handling

For: Standalone Node.js applications

@ddb-lib/amplify

Purpose: AWS Amplify Gen 2 integration

Responsibilities: - Wrap Amplify data client with monitoring - Amplify-specific pattern helpers - Automatic operation tracking - Statistics and recommendations for Amplify

For: Amplify Gen 2 applications

Data flow

Standalone application flow

Standalone Data Flow

sequenceDiagram
    participant App as Your App
    participant Client as TableClient
    participant Stats as StatsCollector
    participant Core as PatternHelpers
    participant DDB as DynamoDB

    App->>Core: Generate key pattern
    Core-->>App: Return formatted key
    App->>Client: Execute operation
    Client->>Stats: Record operation start
    Client->>DDB: Send request
    DDB-->>Client: Return response
    Client->>Stats: Record operation end
    Stats-->>Client: Update metrics
    Client-->>App: Return result
    App->>Client: Get recommendations
    Client->>Stats: Generate recommendations
    Stats-->>App: Return insights

Amplify application flow

Amplify Data Flow

sequenceDiagram
    participant App as Your App
    participant Monitor as AmplifyMonitor
    participant Model as Monitored Model
    participant Stats as StatsCollector
    participant Amplify as Amplify Client
    participant DDB as DynamoDB

    App->>Monitor: Wrap model
    Monitor-->>App: Return monitored model
    App->>Model: Execute operation
    Model->>Stats: Record operation start
    Model->>Amplify: Forward operation
    Amplify->>DDB: Send request
    DDB-->>Amplify: Return response
    Amplify-->>Model: Return result
    Model->>Stats: Record operation end
    Model-->>App: Return result
    App->>Monitor: Get recommendations
    Monitor->>Stats: Generate recommendations
    Stats-->>App: Return insights

Extensibility

The architecture is designed for extensibility:

Custom data access layers

You can use @ddb-lib/core and @ddb-lib/stats with your own data access implementation:

import { StatsCollector } from '@ddb-lib/stats'
import { PatternHelpers } from '@ddb-lib/core'

class MyCustomClient {
  private stats = new StatsCollector({ enabled: true })

  async query(params: any) {
    const start = Date.now()
    const key = PatternHelpers.entityKey('USER', params.userId)

    // Your custom logic
    const result = await this.customQuery(key)

    // Record statistics
    this.stats.record({
      operation: 'query',
      timestamp: start,
      latencyMs: Date.now() - start,
      itemCount: result.length
    })

    return result
  }
}

Custom patterns

Add your own pattern helpers:

import { PatternHelpers } from '@ddb-lib/core'

// Extend with custom patterns
export class MyPatternHelpers extends PatternHelpers {
  static customPattern(data: any): string {
    // Your custom logic
    return `CUSTOM#${data.id}`
  }
}

Performance considerations

Build time

  • Hugo builds the documentation site in ~30ms
  • TypeScript compilation is fast with project references
  • Tree-shaking eliminates unused code

Runtime

  • Core utilities are pure functions (no overhead)
  • Statistics collection uses sampling to minimize impact
  • Pattern helpers are optimized for common cases

Bundle size

Approximate sizes (minified + gzipped): - @ddb-lib/core: ~8KB - @ddb-lib/stats: ~15KB - @ddb-lib/client: ~35KB - @ddb-lib/amplify: ~12KB

Security

  • No credentials stored in any package
  • Relies on AWS SDK and Amplify for authentication
  • Statistics data is sanitized
  • No external network calls except to AWS services

Future architecture

Planned enhancements: - Schema validation package - Migration tools package - Testing utilities package - CLI tools for analysis - Dashboard for visualizing statistics