A decentralized music tracking and discovery platform built on AT Protocol 馃幍
listenbrainz
spotify
atproto
lastfm
musicbrainz
scrobbling
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};