forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {envBool, envInt, envList, envStr} from '@atproto/common'
2
3export type Config = {
4 service: ServiceConfig
5 db: DbConfig
6}
7
8export type ServiceConfig = {
9 port: number
10 version?: string
11 hostnames: string[]
12 hostnamesSet: Set<string>
13 appHostname: string
14 safelinkEnabled: boolean
15 safelinkPdsUrl?: string
16 safelinkAgentIdentifier?: string
17 safelinkAgentPass?: string
18}
19
20export type DbConfig = {
21 url: string
22 migrationUrl?: string
23 pool: DbPoolConfig
24 schema?: string
25}
26
27export type DbPoolConfig = {
28 size: number
29 maxUses: number
30 idleTimeoutMs: number
31}
32
33export type Environment = {
34 port?: number
35 version?: string
36 hostnames: string[]
37 appHostname?: string
38 dbPostgresUrl?: string
39 dbPostgresMigrationUrl?: string
40 dbPostgresSchema?: string
41 dbPostgresPoolSize?: number
42 dbPostgresPoolMaxUses?: number
43 dbPostgresPoolIdleTimeoutMs?: number
44 safelinkEnabled?: boolean
45 safelinkPdsUrl?: string
46 safelinkAgentIdentifier?: string
47 safelinkAgentPass?: string
48}
49
50export const readEnv = (): Environment => {
51 return {
52 port: envInt('LINK_PORT'),
53 version: envStr('LINK_VERSION'),
54 hostnames: envList('LINK_HOSTNAMES'),
55 appHostname: envStr('LINK_APP_HOSTNAME'),
56 dbPostgresUrl: envStr('LINK_DB_POSTGRES_URL'),
57 dbPostgresMigrationUrl: envStr('LINK_DB_POSTGRES_MIGRATION_URL'),
58 dbPostgresSchema: envStr('LINK_DB_POSTGRES_SCHEMA'),
59 dbPostgresPoolSize: envInt('LINK_DB_POSTGRES_POOL_SIZE'),
60 dbPostgresPoolMaxUses: envInt('LINK_DB_POSTGRES_POOL_MAX_USES'),
61 dbPostgresPoolIdleTimeoutMs: envInt(
62 'LINK_DB_POSTGRES_POOL_IDLE_TIMEOUT_MS',
63 ),
64 safelinkEnabled: envBool('LINK_SAFELINK_ENABLED'),
65 safelinkPdsUrl: envStr('LINK_SAFELINK_PDS_URL'),
66 safelinkAgentIdentifier: envStr('LINK_SAFELINK_AGENT_IDENTIFIER'),
67 safelinkAgentPass: envStr('LINK_SAFELINK_AGENT_PASS'),
68 }
69}
70
71export const envToCfg = (env: Environment): Config => {
72 const serviceCfg: ServiceConfig = {
73 port: env.port ?? 3000,
74 version: env.version,
75 hostnames: env.hostnames,
76 hostnamesSet: new Set(env.hostnames),
77 appHostname: env.appHostname ?? 'bsky.app',
78 safelinkEnabled: env.safelinkEnabled ?? false,
79 safelinkPdsUrl: env.safelinkPdsUrl,
80 safelinkAgentIdentifier: env.safelinkAgentIdentifier,
81 safelinkAgentPass: env.safelinkAgentPass,
82 }
83 if (!env.dbPostgresUrl) {
84 throw new Error('Must configure postgres url (LINK_DB_POSTGRES_URL)')
85 }
86 const dbCfg: DbConfig = {
87 url: env.dbPostgresUrl,
88 migrationUrl: env.dbPostgresMigrationUrl,
89 schema: env.dbPostgresSchema,
90 pool: {
91 idleTimeoutMs: env.dbPostgresPoolIdleTimeoutMs ?? 10000,
92 maxUses: env.dbPostgresPoolMaxUses ?? Infinity,
93 size: env.dbPostgresPoolSize ?? 10,
94 },
95 }
96
97 return {
98 service: serviceCfg,
99 db: dbCfg,
100 }
101}