Graphical PDS migrator for AT Protocol
1import { isValidHandle } from 'npm:@atproto/syntax' 2import { oauthClient } from "../../../lib/oauth/client.ts"; 3import { define } from "../../../utils.ts"; 4 5function isValidUrl(url: string): boolean { 6 try { 7 const urlp = new URL(url) 8 // http or https 9 return urlp.protocol === 'http:' || urlp.protocol === 'https:' 10 } catch { 11 return false 12 } 13} 14 15export const handler = define.handlers({ 16 async POST(ctx) { 17 const data = await ctx.req.json() 18 const handle = data.handle 19 if ( 20 typeof handle !== 'string' || 21 !(isValidHandle(handle) || isValidUrl(handle)) 22 ) { 23 return new Response("Invalid Handle", {status: 400}) 24 } 25 26 // Initiate the OAuth flow 27 try { 28 const url = await oauthClient.authorize(handle, { 29 scope: 'atproto transition:generic transition:chat.bsky', 30 }) 31 return Response.json({ redirectUrl: url.toString() }) 32 } catch (err) { 33 console.error({ err }, 'oauth authorize failed') 34 return new Response("Couldn't initiate login", {status: 500}) 35 } 36 }, 37});