A decentralized music tracking and discovery platform built on AT Protocol 馃幍
rocksky.app
spotify
atproto
lastfm
musicbrainz
scrobbling
listenbrainz
1import { createClient } from "auth/client";
2import axios from "axios";
3import { consola } from "consola";
4import { createDb, migrateToLatest } from "db";
5import drizzle from "drizzle";
6import authVerifier from "lib/authVerifier";
7import { env } from "lib/env";
8import { createBidirectionalResolver, createIdResolver } from "lib/idResolver";
9import { connect } from "nats";
10import redis from "redis";
11import sqliteKv from "sqliteKv";
12import { createStorage } from "unstorage";
13
14const { DB_PATH } = env;
15export const db = createDb(DB_PATH);
16await migrateToLatest(db);
17
18const kv = createStorage({
19 driver: sqliteKv({ location: env.KV_DB_PATH, table: "kv" }),
20});
21
22const baseIdResolver = createIdResolver(kv);
23
24export const ctx = {
25 oauthClient: await createClient(db),
26 resolver: createBidirectionalResolver(baseIdResolver),
27 baseIdResolver,
28 kv: new Map<string, string>(),
29 db: drizzle.db,
30 nc: await connect({ servers: env.NATS_URL }),
31 analytics: axios.create({ baseURL: env.ANALYTICS }),
32 dropbox: axios.create({ baseURL: env.DROPBOX }),
33 googledrive: axios.create({ baseURL: env.GOOGLE_DRIVE }),
34 tracklist: axios.create({ baseURL: env.TRACKLIST }),
35 musicbrainz: axios.create({ baseURL: env.MUSICBRAINZ_URL }),
36 redis: await redis
37 .createClient({ url: env.REDIS_URL })
38 .on("error", (err) => {
39 consola.error("Uncaught Redis Client Error", err);
40 process.exit(1);
41 })
42 .connect(),
43 meilisearch: axios.create({
44 baseURL: env.MEILISEARCH_URL,
45 headers: { Authorization: `Bearer ${env.MEILISEARCH_API_KEY}` },
46 }),
47 authVerifier,
48 sqliteDb: db,
49 sqliteKv: kv,
50};
51
52export type Context = typeof ctx;