A decentralized music tracking and discovery platform built on AT Protocol 馃幍
listenbrainz spotify atproto lastfm musicbrainz scrobbling
at setup-tracing 44 lines 1.6 kB view raw
1import { JoseKey } from "@atproto/jwk-jose"; 2import { NodeOAuthClient } from "@atproto/oauth-client-node"; 3import type { Database } from "../db"; 4import { env } from "../lib/env"; 5import { SessionStore, StateStore } from "./storage"; 6 7export const createClient = async (db: Database) => { 8 const publicUrl = env.PUBLIC_URL; 9 const url = publicUrl || `http://127.0.0.1:${env.PORT}`; 10 const enc = encodeURIComponent; 11 return new NodeOAuthClient({ 12 clientMetadata: { 13 client_name: "AT Protocol Express App", 14 client_id: publicUrl 15 ? `${url}/client-metadata.json` 16 : `http://localhost?redirect_uri=${enc( 17 `${url}/oauth/callback`, 18 )}&scope=${enc("atproto transition:generic")}`, 19 client_uri: url, 20 redirect_uris: [`${url}/oauth/callback`], 21 scope: "atproto transition:generic", 22 grant_types: ["authorization_code", "refresh_token"], 23 response_types: ["code"], 24 application_type: "web", 25 token_endpoint_auth_method: url.startsWith("https") 26 ? "private_key_jwt" 27 : "none", 28 token_endpoint_auth_signing_alg: url.startsWith("https") 29 ? "ES256" 30 : undefined, 31 dpop_bound_access_tokens: true, 32 jwks_uri: url.startsWith("https") ? `${url}/jwks.json` : undefined, 33 }, 34 keyset: url.startsWith("https") 35 ? await Promise.all([ 36 JoseKey.fromImportable(env.PRIVATE_KEY_1), 37 JoseKey.fromImportable(env.PRIVATE_KEY_2), 38 JoseKey.fromImportable(env.PRIVATE_KEY_3), 39 ]) 40 : undefined, 41 stateStore: new StateStore(db), 42 sessionStore: new SessionStore(db), 43 }); 44};