Skip to content

A TypeScript library designed to simplify integration with multiple data sources in a generic and extensible way.

License

Notifications You must be signed in to change notification settings

statuscompliance/databinder

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

17 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

DataBinder

A powerful TypeScript library for unified data integration across multiple sources

DataBinder simplifies the complexity of working with multiple APIs and data sources by providing a unified interface, intelligent caching, robust error handling, and enterprise-grade features like persistence, validation, and observability.

✨ Key Features

  • πŸ”— Universal Data Integration - Connect to REST APIs, GitHub, Microsoft Graph, and more
  • πŸ“¦ Datasource Catalog - Register, manage, and persist datasource configurations
  • πŸš€ Flexible Response Formats - Full, batch, iterator, and stream processing
  • πŸ”„ Smart Retry Logic - Exponential backoff with configurable retry conditions
  • πŸ›‘οΈ Built-in Security - Input validation, sanitization, and authentication handling
  • πŸ“Š Observability Ready - OpenTelemetry integration with automatic instrumentation
  • πŸ’Ύ Persistence Layer - Database and file-based storage for datasource instances
  • 🎯 Property Mapping - Transform and normalize data across different sources
  • πŸ“„ Comprehensive Documentation - Detailed guides and examples for every feature

πŸš€ Quick Start

npm install @statuscompliance/databinder

Basic Example

import { DataBinder, Linker, DatasourceCatalog } from '@statuscompliance/databinder';
import { RestApiDatasource } from '@statuscompliance/databinder/Datasources';

// 1. Create catalog and register datasources
const catalog = new DatasourceCatalog();
catalog.registerDatasource(RestApiDatasource);

// 2. Create datasource instance
const apiInstance = catalog.createDatasourceInstance('rest-api', {
  baseUrl: 'https://api.example.com',
  auth: { type: 'bearer', token: 'your-token' }
}, 'my-api');

// 3. Create linker and databinder
const linker = new Linker({ datasources: [apiInstance] });
const dataBinder = new DataBinder({ linker });

// 4. Fetch data
const data = await dataBinder.fetchFromDatasource('my-api', {
  methodName: 'get',
  endpoint: '/users'
});

πŸ“š Documentation

Topic Description Link
Core Functionality DataBinder and Linker classes πŸ“– Read More
Datasource Catalog Registration, persistence, and management πŸ“– Read More
Built-in Datasources REST API, GitHub, Microsoft Graph πŸ“– Read More
Utilities Validation, sanitization, logging, telemetry πŸ“– Read More

πŸ”Œ Supported Datasources

REST API Datasource

Generic REST API integration with full HTTP method support, authentication, and error handling.

const restApi = catalog.createDatasourceInstance('rest-api', {
  baseUrl: 'https://api.example.com',
  auth: { type: 'bearer', token: 'token' },
  headers: { 'Content-Type': 'application/json' }
});

GitHub API Datasource

Specialized GitHub integration with pre-built methods for repositories, issues, pull requests, and more.

const githubApi = catalog.createDatasourceInstance('github-api', {
  personalAccessToken: 'ghp_xxxxxxxxxxxx',
  defaultOrg: 'your-org'
});

Microsoft Graph Datasource

Access Microsoft 365 services including users, groups, mail, and SharePoint.

const graphApi = catalog.createDatasourceInstance('microsoft-graph', {
  tenantId: 'tenant-id',
  clientId: 'client-id',
  clientSecret: 'client-secret'
});

πŸ—οΈ Architecture Overview

DataBinder follows a modular architecture that promotes reusability and extensibility:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   DataBinder    │◄──►│     Linker      │◄──►│   Datasources   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                       β”‚                       β”‚
         β–Ό                       β–Ό                       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Utilities     β”‚    β”‚    Catalog      β”‚    β”‚  Persistence    β”‚
β”‚ β€’ Validation    β”‚    β”‚ β€’ Registry      β”‚    β”‚ β€’ Database      β”‚
β”‚ β€’ Sanitization β”‚    β”‚ β€’ Factory       β”‚    β”‚ β€’ File System   β”‚
β”‚ β€’ Retry Logic   β”‚    β”‚ β€’ Serialization β”‚    β”‚ β€’ Metadata      β”‚
β”‚ β€’ Telemetry     β”‚    β”‚ β€’ Validation    β”‚    β”‚ β€’ Migration     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ’‘ Advanced Usage

Batch Processing with Iterator

// Process large datasets efficiently
const iterator = await dataBinder.fetchAll({ 
  responseFormat: 'iterator',
  batchSize: 100 
});

for await (const batch of iterator) {
  console.log(`Processing ${batch.data.length} items...`);
  await processBatch(batch.data);
}

Property Mapping and Transformation

const linker = new Linker({
  datasources: [apiInstance],
  datasourceConfigs: {
    'my-api': {
      id: 'my-api',
      propertyMapping: {
        'user_id': 'id',
        'full_name': 'name',
        'created_at': 'createdDate'
      }
    }
  }
});

Database Persistence

// Create database adapter
class MongoDBAdapter implements DatabaseAdapter {
  async save(instances: SerializedDatasourceInstance[]): Promise<void> {
    await this.db.collection('datasources').replaceMany(instances);
  }
  
  async load(): Promise<SerializedDatasourceInstance[]> {
    return await this.db.collection('datasources').find({}).toArray();
  }
}

// Use with catalog
const dbAdapter = new MongoDBAdapter();
await catalog.saveToDatabaseAdapter(dbAdapter, true); // Include metadata
await catalog.loadFromDatabaseAdapter(dbAdapter);

Custom Datasource Creation

const customDatasource: DatasourceDefinition = {
  id: 'custom-api',
  name: 'My Custom API',
  configSchema: {
    type: 'object',
    properties: {
      apiKey: { type: 'string' },
      baseUrl: { type: 'string' }
    },
    required: ['apiKey', 'baseUrl']
  },
  createInstance: (config) => ({
    id: '',
    definitionId: 'custom-api', 
    config,
    methods: {
      getData: async (options) => {
        // Your implementation
        return { data: [] };
      }
    }
  })
};

catalog.registerDatasource(customDatasource);

🌟 Use Cases

  • API Aggregation - Combine data from multiple APIs into unified responses
  • Data Pipeline Integration - Connect various data sources in ETL processes
  • Microservices Communication - Standardize inter-service data fetching
  • Analytics Platform - Collect data from diverse sources for analysis
  • Node-RED Integration - Persistent datasource instances for flow reusability
  • Multi-tenant Applications - Isolated datasource configurations per tenant

🀝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

πŸ“„ License

Apache License 2.0 - see LICENSE file for details.

πŸ”— Links

License

Apache License 2.0

About

A TypeScript library designed to simplify integration with multiple data sources in a generic and extensible way.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 99.2%
  • JavaScript 0.8%