···55PUBLIC_URL="" # Set when deployed publicly, e.g. "https://mysite.com". Informs OAuth client id.
66DB_PATH=":memory:" # The SQLite database path. Leave as ":memory:" to use a temporary in-memory database.
7788-# CORS Settings
99-CORS_ORIGIN="http://localhost:*" # Allowed CORS origin, adjust as necessary
1010-1111-# Rate Limiting
1212-COMMON_RATE_LIMIT_WINDOW_MS="1000" # Window size for rate limiting (ms)
1313-COMMON_RATE_LIMIT_MAX_REQUESTS="20" # Max number of requests per window per IP
1414-158# Secrets
169# Must set this in production. May be generated with `openssl rand -base64 33`
1710# COOKIE_SECRET=""
-22
Dockerfile
···11-FROM node:22.5-slim
22-33-# Create app directory
44-WORKDIR /usr/src/app
55-66-# Copy package.json and package-lock.json
77-COPY package*.json ./
88-99-# Install app dependencies
1010-RUN npm ci
1111-1212-# Bundle app source
1313-COPY . .
1414-1515-# Build the TypeScript files
1616-RUN npm run build
1717-1818-# Expose port 8080
1919-EXPOSE 8080
2020-2121-# Start the app
2222-CMD npm run start
···11-import { JoseKey } from '@atproto/jwk-jose'
21import { NodeOAuthClient } from '@atproto/oauth-client-node'
32import type { Database } from '#/db'
43import { env } from '#/env'
+1-3
src/auth/session.ts
···11-'use server'
22-31import assert from 'node:assert'
42import type { IncomingMessage, ServerResponse } from 'node:http'
53import { getIronSession } from 'iron-session'
64import { env } from '#/env'
77-import { AppContext } from '#/config'
55+import { AppContext } from '#/index'
8697export type Session = { did: string }
108
-13
src/config.ts
···11-import type { OAuthClient } from '@atproto/oauth-client-node'
22-import type pino from 'pino'
33-import type { Database } from '#/db'
44-import type { Ingester } from '#/firehose/ingester'
55-import { Resolver } from '#/ident/types'
66-77-export type AppContext = {
88- db: Database
99- ingester: Ingester
1010- logger: pino.Logger
1111- oauthClient: OAuthClient
1212- resolver: Resolver
1313-}