@omodaka/pinatinodb-adapter-typeorm
v0.1.0
Published
TypeORM adapter for PinatinoDB - automatic IPFS sync for TypeORM
Downloads
4
Maintainers
Readme
@pinatinodb/typeorm-adapter
TypeORM adapter for PinatinoDB - automatically sync your TypeORM entities to IPFS!
Installation
pnpm add @pinatinodb/typeorm-adapter @pinatinodb/coreUsage
import { DataSource } from 'typeorm';
import { setupPinatinoWithTypeORM } from '@pinatinodb/typeorm-adapter';
import { PinatinoDB } from '@pinatinodb/core';
import { User, Post } from './entities';
// Create TypeORM DataSource
const dataSource = new DataSource({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'user',
password: 'password',
database: 'mydb',
entities: [User, Post],
synchronize: true
});
await dataSource.initialize();
// Create PinatinoDB instance
const pinatino = new PinatinoDB({
pinata: {
apiKey: process.env.PINATA_JWT!
}
});
// Setup automatic sync
await setupPinatinoWithTypeORM(dataSource, pinatino, {
logging: true
});
// Use TypeORM normally - data automatically syncs to IPFS!
const userRepo = dataSource.getRepository(User);
const user = await userRepo.save({
name: 'Alice',
email: '[email protected]'
});
// ✅ Data is now in both TypeORM DB and IPFS!How It Works
The adapter uses TypeORM's Entity Subscriber pattern to listen for database events:
- Entity operation occurs (insert, update, delete)
- Subscriber catches event
- Data synced to IPFS via PinatinoDB
- Operation completes
All TypeORM operations work normally - the IPFS sync happens automatically in the background!
Selective Sync
// Only sync specific entities
await setupPinatinoWithTypeORM(dataSource, pinatino, {
entities: [User, Post], // Only sync these entities
logging: true
});
// Or exclude entities
await setupPinatinoWithTypeORM(dataSource, pinatino, {
excludeEntities: [Log, Session], // Don't sync these
logging: true
});Manual Subscriber Registration
For more control, you can register the subscriber manually:
import { PinatinoSubscriber } from '@pinatinodb/typeorm-adapter';
const subscriber = new PinatinoSubscriber(pinatino, {
logging: true,
entities: [User]
});
const dataSource = new DataSource({
// ... config
subscribers: [subscriber]
});Supported Operations
- ✅ Insert (
afterInsert) - Synced to IPFS - ✅ Update (
afterUpdate) - Updates in IPFS - ✅ Delete (
afterRemove) - Removes from IPFS
Benefits
- 📦 Automatic IPFS backup of your TypeORM data
- 🌍 Decentralized storage alongside traditional DB
- ⏱️ Time-travel queries (IPFS immutability)
- 🔄 Zero code changes to existing TypeORM code
- 🎯 Selective sync - choose what goes to IPFS
- 🎨 Event-driven - uses TypeORM's built-in subscriber pattern
Example Entity
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn('uuid')
id!: string;
@Column()
name!: string;
@Column()
email!: string;
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
createdAt!: Date;
}When you save a User entity, it's automatically synced to IPFS with its CID stored!
License
MIT
