@@ -81,65 +81,86 @@ export async function setConfig (config: ConfigDbWithoutPrivateFields, logger: C
8181 }
8282}
8383
84- export async function getConfig ( logger : ComponentLogger ) : Promise < ConfigDb > {
85- const log = logger . forComponent ( 'get-config' )
86- let gateways = defaultGateways
87- let routers = defaultRouters
88- let dnsJsonResolvers = defaultDnsJsonResolvers
89- let enableRecursiveGateways
90- let enableWss
91- let enableWebTransport
92- let enableGatewayProviders
93- let debug = ''
94- let _supportsSubdomains = defaultSupportsSubdomains
95-
96- try {
97- await configDb . open ( )
98-
99- gateways = await configDb . get ( 'gateways' )
84+ let getConfigPromise : Promise < ConfigDb > | null = null
10085
101- routers = await configDb . get ( 'routers' )
102-
103- dnsJsonResolvers = await configDb . get ( 'dnsJsonResolvers' )
104-
105- enableRecursiveGateways = await configDb . get ( 'enableRecursiveGateways' ) ?? defaultEnableRecursiveGateways
106- enableWss = await configDb . get ( 'enableWss' ) ?? defaultEnableWss
107- enableWebTransport = await configDb . get ( 'enableWebTransport' ) ?? defaultEnableWebTransport
108- enableGatewayProviders = await configDb . get ( 'enableGatewayProviders' ) ?? defaultEnableGatewayProviders
109-
110- debug = await configDb . get ( 'debug' ) ?? defaultDebug ( )
111- enable ( debug )
112-
113- _supportsSubdomains ??= await configDb . get ( '_supportsSubdomains' )
114- } catch ( err ) {
115- log ( 'error loading config from db' , err )
116- } finally {
117- configDb . close ( )
118- }
119-
120- if ( gateways == null || gateways . length === 0 ) {
121- gateways = [ ...defaultGateways ]
122- }
123-
124- if ( routers == null || routers . length === 0 ) {
125- routers = [ ...defaultRouters ]
126- }
127- if ( dnsJsonResolvers == null || Object . keys ( dnsJsonResolvers ) . length === 0 ) {
128- dnsJsonResolvers = { ...defaultDnsJsonResolvers }
86+ export async function getConfig ( logger : ComponentLogger ) : Promise < ConfigDb > {
87+ if ( getConfigPromise != null ) {
88+ /**
89+ * If there is already a promise to get the config, return it.
90+ * This is to prevent multiple calls to the db to get the same config, because
91+ * each request will close the DB when done, and then the next request will fail at some point
92+ */
93+ return getConfigPromise
12994 }
13095
131- // always return the config, even if we failed to load it.
132- return {
133- gateways,
134- routers,
135- dnsJsonResolvers,
136- enableRecursiveGateways,
137- enableWss,
138- enableWebTransport,
139- enableGatewayProviders,
140- debug,
141- _supportsSubdomains
142- }
96+ getConfigPromise = ( async ( ) => {
97+ const log = logger . forComponent ( 'get-config' )
98+ let gateways = defaultGateways
99+ let routers = defaultRouters
100+ let dnsJsonResolvers = defaultDnsJsonResolvers
101+ let enableRecursiveGateways
102+ let enableWss
103+ let enableWebTransport
104+ let enableGatewayProviders
105+ let debug = ''
106+ let _supportsSubdomains = defaultSupportsSubdomains
107+
108+ let config : ConfigDb
109+
110+ log ( 'config-debug: getting config for domain %s' , globalThis . location . origin )
111+ try {
112+ await configDb . open ( )
113+
114+ config = await configDb . getAll ( )
115+ debug = config . debug ?? defaultDebug ( )
116+ enable ( debug )
117+
118+ gateways = config . gateways
119+
120+ routers = config . routers
121+
122+ dnsJsonResolvers = config . dnsJsonResolvers
123+ enableRecursiveGateways = config . enableRecursiveGateways ?? defaultEnableRecursiveGateways
124+ enableWss = config . enableWss ?? defaultEnableWss
125+ enableWebTransport = config . enableWebTransport ?? defaultEnableWebTransport
126+ enableGatewayProviders = config . enableGatewayProviders ?? defaultEnableGatewayProviders
127+
128+ _supportsSubdomains ??= config . thing
129+ } catch ( err ) {
130+ log ( 'error loading config from db' , err )
131+ } finally {
132+ configDb . close ( )
133+ }
134+
135+ if ( gateways == null || gateways . length === 0 ) {
136+ gateways = [ ...defaultGateways ]
137+ }
138+
139+ if ( routers == null || routers . length === 0 ) {
140+ routers = [ ...defaultRouters ]
141+ }
142+ if ( dnsJsonResolvers == null || Object . keys ( dnsJsonResolvers ) . length === 0 ) {
143+ dnsJsonResolvers = { ...defaultDnsJsonResolvers }
144+ }
145+
146+ // always return the config, even if we failed to load it.
147+ return {
148+ gateways,
149+ routers,
150+ dnsJsonResolvers,
151+ enableRecursiveGateways,
152+ enableWss,
153+ enableWebTransport,
154+ enableGatewayProviders,
155+ debug,
156+ _supportsSubdomains
157+ }
158+ } ) ( ) . finally ( ( ) => {
159+ getConfigPromise = null
160+ } )
161+
162+ const result = await getConfigPromise
163+ return result
143164}
144165
145166export async function validateConfig ( config : ConfigDbWithoutPrivateFields , logger : ComponentLogger ) : Promise < void > {
0 commit comments