@@ -81,65 +81,86 @@ export async function setConfig (config: ConfigDbWithoutPrivateFields, logger: C
81
81
}
82
82
}
83
83
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
100
85
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
129
94
}
130
95
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
143
164
}
144
165
145
166
export async function validateConfig ( config : ConfigDbWithoutPrivateFields , logger : ComponentLogger ) : Promise < void > {
0 commit comments