···1+import { useMatches } from 'react-router'
2+import type { Route } from '../+types/root'
3+4+export function useRootData() {
5+ const route = useMatches()[0]
6+ const data = route.loaderData as Route.ComponentProps['loaderData']
7+ return data
8+}
···2import { BunSqliteDialect } from 'kysely-bun-worker/normal'
3import { promises as fs } from 'fs'
4import path from 'path'
5-import env from '@/lib/env'
6-import { DB } from './schema'
78export const db = new Kysely<DB>({
9 dialect: new BunSqliteDialect({ url: env.DATABASE_URL }),
···2import { BunSqliteDialect } from 'kysely-bun-worker/normal'
3import { promises as fs } from 'fs'
4import path from 'path'
5+import env from '@api/lib/env'
6+import type { DB } from './schema'
78export const db = new Kysely<DB>({
9 dialect: new BunSqliteDialect({ url: env.DATABASE_URL }),
···1-import { db } from '@/db/db'
2-import { Accounts } from '@/db/schema'
3-import { Insertable } from 'kysely'
45export function createOrUpdateAccount(account: Insertable<Accounts>) {
6 return db
···1+import { db } from '@api/db/db'
2+import type { Accounts } from '@api/db/schema'
3+import type { Insertable } from 'kysely'
45export function createOrUpdateAccount(account: Insertable<Accounts>) {
6 return db
+1-1
packages/server/src/lib/profile.ts
···1import { Agent } from '@atproto/api'
2-import { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'
34export function parseProfile(profile: ProfileViewDetailed) {
5 return profile.handle !== 'handle.invalid' ? null : profile
···1import { Agent } from '@atproto/api'
2+import type { ProfileViewDetailed } from '@atproto/api/dist/client/types/app/bsky/actor/defs'
34export function parseProfile(profile: ProfileViewDetailed) {
5 return profile.handle !== 'handle.invalid' ? null : profile
+1-1
packages/server/src/lib/redirect-validator.ts
···1-import env from '@/lib/env'
23/**
4 * Validates that a redirect URI is allowed
···1+import env from '@api/lib/env'
23/**
4 * Validates that a redirect URI is allowed
+1-1
packages/server/src/lib/session.ts
···1-import { db } from '@/db/db'
23// Session configuration
4const SESSION_DURATION = 7 * 24 * 60 * 60 * 1000 // 7 days in milliseconds
···1+import { db } from '@api/db/db'
23// Session configuration
4const SESSION_DURATION = 7 * 24 * 60 * 60 * 1000 // 7 days in milliseconds
+3-3
packages/server/src/oauth/client.ts
···1import { JoseKey, NodeOAuthClient } from '@atproto/oauth-client-node'
2-import type { Db } from '@/db/db'
3import { SessionStore, StateStore } from './storage'
4-import keys from '@/../jwks.json'
5-import env from '@/lib/env'
67const keyset = await Promise.all(
8 keys.map((k) => JoseKey.fromImportable(JSON.stringify(k), k.kid))
···1import { JoseKey, NodeOAuthClient } from '@atproto/oauth-client-node'
2+import type { Db } from '@api/db/db'
3import { SessionStore, StateStore } from './storage'
4+import keys from '@api/../jwks.json'
5+import env from '@api/lib/env'
67const keyset = await Promise.all(
8 keys.map((k) => JoseKey.fromImportable(JSON.stringify(k), k.kid))
+13-9
packages/server/src/oauth/routes.ts
···1import Elysia, { redirect, status } from 'elysia'
2import { createOAuthClient } from './client'
3import { Agent } from '@atproto/api'
4-import { db } from '@/db/db'
5-import env from '@/lib/env'
6-import keys from '@/../jwks.json'
7-import { createOrUpdateAccount } from '@/lib/account'
8-import { createSession, deleteSession, type SessionData } from '@/lib/session'
9-import { authMacro } from '@/lib/middleware'
10-import { getProfile, parseProfile } from '@/lib/profile'
11-import { idResolver } from '@/lib/idresolver'
000012import {
13 isAllowedRedirectUri,
14 getDefaultRedirectUri,
15 parseRedirectState
16-} from '@/lib/redirect-validator'
1718const publicKeys = keys.map((k) => {
19 const { kty, alg, kid, crv, x, y } = k
···1import Elysia, { redirect, status } from 'elysia'
2import { createOAuthClient } from './client'
3import { Agent } from '@atproto/api'
4+import { db } from '@api/db/db'
5+import env from '@api/lib/env'
6+import keys from '@api/../jwks.json'
7+import { createOrUpdateAccount } from '@api/lib/account'
8+import {
9+ createSession,
10+ deleteSession,
11+ type SessionData
12+} from '@api/lib/session'
13+import { authMacro } from '@api/lib/middleware'
14+import { getProfile } from '@api/lib/profile'
15+import { idResolver } from '@api/lib/idresolver'
16import {
17 isAllowedRedirectUri,
18 getDefaultRedirectUri,
19 parseRedirectState
20+} from '@api/lib/redirect-validator'
2122const publicKeys = keys.map((k) => {
23 const { kty, alg, kid, crv, x, y } = k
+1-1
packages/server/src/oauth/storage.ts
···4 NodeSavedState,
5 NodeSavedStateStore
6} from '@atproto/oauth-client-node'
7-import type { Db } from '@/db/db'
89export class StateStore implements NodeSavedStateStore {
10 constructor(private db: Db) {}
···4 NodeSavedState,
5 NodeSavedStateStore
6} from '@atproto/oauth-client-node'
7+import type { Db } from '@api/db/db'
89export class StateStore implements NodeSavedStateStore {
10 constructor(private db: Db) {}