Files
Synapsis/scripts/migrate-dids.ts
T
cyph3rasi 60f7dba46c
CI / smoke (push) Has been cancelled
Migrate Synapsis to embedded Turso
2026-07-14 15:50:12 -07:00

103 lines
2.8 KiB
TypeScript

/**
* DID Migration Script
*
* Converts users from legacy did:synapsis: format to new did:key: format
* The new DID is derived from the user's public key
*/
import { db, users } from '../src/db';
import { eq } from 'drizzle-orm';
// Simple base58btc encoder (Bitcoin alphabet)
const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
function base58Encode(buffer: Uint8Array): string {
const alphabet = BASE58_ALPHABET;
let carry: number;
let digits: number[] = [0];
for (let i = 0; i < buffer.length; i++) {
carry = buffer[i];
for (let j = 0; j < digits.length; j++) {
carry += digits[j] << 8;
digits[j] = carry % 58;
carry = (carry / 58) | 0;
}
while (carry) {
digits.push(carry % 58);
carry = (carry / 58) | 0;
}
}
// Leading zeros
for (let i = 0; i < buffer.length && buffer[i] === 0; i++) {
digits.push(0);
}
return digits.reverse().map(d => alphabet[d]).join('');
}
async function migrateDIDs() {
console.log('Starting DID migration...\n');
if (!db) {
console.error('Database not available');
process.exit(1);
}
// Find all users with legacy did:synapsis: format
const legacyUsers = await db.query.users.findMany({
where: { did: { like: 'did:synapsis:%' } },
});
console.log(`Found ${legacyUsers.length} users with legacy DID format\n`);
let migrated = 0;
let failed = 0;
for (const user of legacyUsers) {
try {
console.log(`Migrating: @${user.handle} (${user.did})`);
if (!user.publicKey) {
console.error(` ❌ No public key for @${user.handle}, skipping`);
failed++;
continue;
}
// Generate new did:key from public key
const publicKeyBytes = Buffer.from(user.publicKey, 'base64');
const encoded = base58Encode(new Uint8Array(publicKeyBytes));
const newDID = `did:key:z${encoded}`;
console.log(` → New DID: ${newDID}`);
// Update user record
await db.update(users)
.set({ did: newDID })
.where(eq(users.id, user.id));
console.log(` ✅ Migrated\n`);
migrated++;
} catch (err) {
console.error(` ❌ Failed to migrate @${user.handle}:`, err);
failed++;
}
}
console.log('\n═══════════════════════════════════════');
console.log('Migration complete!');
console.log(` Migrated: ${migrated}`);
console.log(` Failed: ${failed}`);
console.log(` Total: ${legacyUsers.length}`);
console.log('═══════════════════════════════════════');
process.exit(0);
}
migrateDIDs().catch(err => {
console.error('Migration failed:', err);
process.exit(1);
});