[READ ONLY MIRROR] Spark Social AppView Server
github.com/sprksocial/server
atproto
deno
hono
lexicon
1import * as dotenv from "dotenv";
2import { envInt, envList, envStr } from "@atp/common";
3
4dotenv.config({ quiet: true });
5
6export interface ServerConfigValues {
7 version?: string;
8 debugMode?: boolean;
9 port?: number;
10 publicUrl?: string;
11 serverDid: string;
12 privateKey: string;
13 alternateAudienceDids: string[];
14 modServiceDid: string;
15 adminPasswords: string[];
16 indexedAtEpoch?: Date;
17
18 bigThreadUris: Set<string>;
19 bigThreadDepth?: number;
20 maxThreadDepth?: number;
21 maxThreadParents: number;
22
23 videoCdn?: string;
24 mediaCdn?: string;
25 thumbCdn?: string;
26
27 dbUri?: string;
28 dbName?: string;
29 dbUser?: string;
30 dbPass?: string;
31 relayUrl?: string;
32 plcUrl?: string;
33}
34
35export class ServerConfig {
36 constructor(private cfg: ServerConfigValues) {}
37
38 static readEnv() {
39 const version = envStr("SPRK_VERSION");
40 const debugMode = Deno.env.get("NODE_ENV") === "development" ||
41 Deno.env.get("NODE_ENV") === "test";
42 const port = envInt("SPRK_PORT") ?? 3000;
43 const publicUrl = envStr("SPRK_PUBLIC_URL") ?? undefined;
44 const serverDid = envStr("SPRK_SERVER_DID") ?? "did:example:test";
45 const privateKey = envStr("SPRK_PRIVATE_KEY") ?? "";
46 const alternateAudienceDids = envList("SPRK_ALTERNATE_AUDIENCE_DIDS") ?? [];
47 const modServiceDid = envStr("SPRK_MOD_SERVICE_DID") ?? "did:web:localhost";
48 const adminPasswords = envList("SPRK_ADMIN_PASSWORDS") ?? ["admin-token"];
49
50 const indexedAtEpochEnv = Deno.env.get("SPRK_INDEXED_AT_EPOCH");
51 const indexedAtEpoch = indexedAtEpochEnv !== undefined
52 ? new Date(indexedAtEpochEnv)
53 : undefined;
54
55 const bigThreadUris = new Set(envList("SPRK_BIG_THREAD_URIS"));
56 const bigThreadDepth = envInt("SPRK_BIG_THREAD_DEPTH") ?? 10;
57 const maxThreadDepth = envInt("SPRK_MAX_THREAD_DEPTH") ?? 10;
58 const maxThreadParents = envInt("SPRK_MAX_THREAD_PARENTS") ?? 10;
59
60 const videoCdn = envStr("SPRK_VIDEO_CDN") ?? "https://video.sprk.so";
61 const mediaCdn = envStr("SPRK_MEDIA_CDN") ?? "https://media.sprk.so";
62 const thumbCdn = envStr("SPRK_THUMB_CDN") ?? "https://thumb.sprk.so";
63
64 const dbUri = envStr("SPRK_DB_URI") ??
65 "mongodb://mongo:mongo@localhost:27017/dev";
66 const dbName = envStr("SPRK_DB_NAME") ?? "dev";
67 const dbUser = envStr("SPRK_DB_USER") ?? "mongo";
68 const dbPass = envStr("SPRK_DB_PASS") ?? "mongo";
69 const relayUrl = envStr("SPRK_RELAY") ??
70 "wss://relay1.us-east.bsky.network";
71 const plcUrl = envStr("SPRK_PLC") ?? "https://plc.directory";
72
73 return new ServerConfig({
74 version,
75 debugMode,
76 port,
77 publicUrl,
78 serverDid,
79 privateKey,
80 alternateAudienceDids,
81 modServiceDid,
82 adminPasswords,
83 indexedAtEpoch,
84 bigThreadUris,
85 bigThreadDepth,
86 maxThreadDepth,
87 maxThreadParents,
88 videoCdn,
89 mediaCdn,
90 thumbCdn,
91 dbUri,
92 dbName,
93 dbUser,
94 dbPass,
95 relayUrl,
96 plcUrl,
97 });
98 }
99
100 get version() {
101 return this.cfg.version;
102 }
103 get debugMode() {
104 return this.cfg.debugMode;
105 }
106 get port() {
107 return this.cfg.port;
108 }
109 get publicUrl() {
110 return this.cfg.publicUrl;
111 }
112 get serverDid() {
113 return this.cfg.serverDid;
114 }
115 get privateKey() {
116 return this.cfg.privateKey;
117 }
118 get alternateAudienceDids() {
119 return this.cfg.alternateAudienceDids;
120 }
121 get modServiceDid() {
122 return this.cfg.modServiceDid;
123 }
124 get adminPasswords() {
125 return this.cfg.adminPasswords;
126 }
127 get indexedAtEpoch() {
128 return this.cfg.indexedAtEpoch;
129 }
130
131 // Threads
132 get bigThreadDepth() {
133 return this.cfg.bigThreadDepth;
134 }
135 get bigThreadUris() {
136 return this.cfg.bigThreadUris;
137 }
138 get maxThreadParents() {
139 return this.cfg.maxThreadParents;
140 }
141 get maxThreadDepth() {
142 return this.cfg.maxThreadDepth;
143 }
144
145 // CDNs
146 get videoCdn() {
147 return this.cfg.videoCdn;
148 }
149 get mediaCdn() {
150 return this.cfg.mediaCdn;
151 }
152 get thumbCdn() {
153 return this.cfg.thumbCdn;
154 }
155
156 get dbUri() {
157 return this.cfg.dbUri;
158 }
159 get dbName() {
160 return this.cfg.dbName;
161 }
162 get dbUser() {
163 return this.cfg.dbUser;
164 }
165 get dbPass() {
166 return this.cfg.dbPass;
167 }
168 get relayUrl() {
169 return this.cfg.relayUrl;
170 }
171 get plcUrl() {
172 return this.cfg.plcUrl;
173 }
174}