1
1
import { type ComponentLogger , enable } from '@libp2p/logger'
2
2
import { GenericIDB , type BaseDbConfig } from './generic-db.js'
3
3
4
- export interface ConfigDb extends BaseDbConfig {
4
+ export interface ConfigDbWithoutPrivateFields extends BaseDbConfig {
5
5
gateways : string [ ]
6
6
routers : string [ ]
7
7
dnsJsonResolvers : Record < string , string >
@@ -12,6 +12,14 @@ export interface ConfigDb extends BaseDbConfig {
12
12
debug : string
13
13
}
14
14
15
+ /**
16
+ * Private fields for app-only config.
17
+ * These are not configurable by the user, and are only for programmatic use and changing functionality.
18
+ */
19
+ export interface ConfigDb extends ConfigDbWithoutPrivateFields {
20
+ _supportsSubdomains : null | boolean
21
+ }
22
+
15
23
export const defaultGateways = [ 'https://trustless-gateway.link' ]
16
24
export const defaultRouters = [ 'https://delegated-ipfs.dev' ]
17
25
export const defaultDnsJsonResolvers : Record < string , string > = {
@@ -21,11 +29,12 @@ export const defaultEnableRecursiveGateways = true
21
29
export const defaultEnableWss = true
22
30
export const defaultEnableWebTransport = false
23
31
export const defaultEnableGatewayProviders = true
32
+ export const defaultSupportsSubdomains : null | boolean = null
24
33
25
34
/**
26
35
* On dev/testing environments, (inbrowser.dev, localhost:${port}, or 127.0.0.1) we should set the default debug config to helia:sw-gateway*,helia:sw-gateway*:trace so we don't need to go set it manually
27
36
*/
28
- export const defaultDebug = self . location . hostname . search ( / l o c a l h o s t | i n b r o w s e r \. d e v | 1 2 7 \. 0 \. 0 \. 1 / ) === - 1 ? '' : 'helia:sw-gateway*,helia:sw-gateway*:trace'
37
+ export const defaultDebug = ( ) : string => self . location . hostname . search ( / l o c a l h o s t | i n b r o w s e r \. d e v | 1 2 7 \. 0 \. 0 \. 1 / ) === - 1 ? '' : 'helia:sw-gateway*,helia:sw-gateway*:trace'
29
38
30
39
const configDb = new GenericIDB < ConfigDb > ( 'helia-sw' , 'config' )
31
40
@@ -40,17 +49,18 @@ export async function resetConfig (logger: ComponentLogger): Promise<void> {
40
49
await configDb . put ( 'enableWebTransport' , defaultEnableWebTransport )
41
50
await configDb . put ( 'enableRecursiveGateways' , defaultEnableRecursiveGateways )
42
51
await configDb . put ( 'enableGatewayProviders' , defaultEnableGatewayProviders )
43
- await configDb . put ( 'debug' , defaultDebug )
52
+ await configDb . put ( 'debug' , defaultDebug ( ) )
53
+ // leave private/app-only fields as is
44
54
} catch ( err ) {
45
55
log ( 'error resetting config in db' , err )
46
56
} finally {
47
57
configDb . close ( )
48
58
}
49
59
}
50
60
51
- export async function setConfig ( config : ConfigDb , logger : ComponentLogger ) : Promise < void > {
61
+ export async function setConfig ( config : ConfigDbWithoutPrivateFields , logger : ComponentLogger ) : Promise < void > {
52
62
const log = logger . forComponent ( 'set-config' )
53
- enable ( config . debug ?? defaultDebug ) // set debug level first.
63
+ enable ( config . debug ?? defaultDebug ( ) ) // set debug level first.
54
64
await validateConfig ( config , logger )
55
65
try {
56
66
log ( 'config-debug: setting config %O for domain %s' , config , window . location . origin )
@@ -62,7 +72,8 @@ export async function setConfig (config: ConfigDb, logger: ComponentLogger): Pro
62
72
await configDb . put ( 'enableWss' , config . enableWss )
63
73
await configDb . put ( 'enableWebTransport' , config . enableWebTransport )
64
74
await configDb . put ( 'enableGatewayProviders' , config . enableGatewayProviders )
65
- await configDb . put ( 'debug' , config . debug ?? defaultDebug )
75
+ await configDb . put ( 'debug' , config . debug ?? defaultDebug ( ) )
76
+ // ignore private/app-only fields
66
77
} catch ( err ) {
67
78
log ( 'error setting config in db' , err )
68
79
} finally {
@@ -79,8 +90,8 @@ export async function getConfig (logger: ComponentLogger): Promise<ConfigDb> {
79
90
let enableWss
80
91
let enableWebTransport
81
92
let enableGatewayProviders
82
-
83
93
let debug = ''
94
+ let _supportsSubdomains = defaultSupportsSubdomains
84
95
85
96
try {
86
97
await configDb . open ( )
@@ -96,8 +107,10 @@ export async function getConfig (logger: ComponentLogger): Promise<ConfigDb> {
96
107
enableWebTransport = await configDb . get ( 'enableWebTransport' ) ?? defaultEnableWebTransport
97
108
enableGatewayProviders = await configDb . get ( 'enableGatewayProviders' ) ?? defaultEnableGatewayProviders
98
109
99
- debug = await configDb . get ( 'debug' ) ?? defaultDebug
110
+ debug = await configDb . get ( 'debug' ) ?? defaultDebug ( )
100
111
enable ( debug )
112
+
113
+ _supportsSubdomains ??= await configDb . get ( '_supportsSubdomains' )
101
114
} catch ( err ) {
102
115
log ( 'error loading config from db' , err )
103
116
} finally {
@@ -124,15 +137,44 @@ export async function getConfig (logger: ComponentLogger): Promise<ConfigDb> {
124
137
enableWss,
125
138
enableWebTransport,
126
139
enableGatewayProviders,
127
- debug
140
+ debug,
141
+ _supportsSubdomains
128
142
}
129
143
}
130
144
131
- export async function validateConfig ( config : ConfigDb , logger : ComponentLogger ) : Promise < void > {
145
+ export async function validateConfig ( config : ConfigDbWithoutPrivateFields , logger : ComponentLogger ) : Promise < void > {
132
146
const log = logger . forComponent ( 'validate-config' )
133
147
134
148
if ( ! config . enableRecursiveGateways && ! config . enableGatewayProviders && ! config . enableWss && ! config . enableWebTransport ) {
135
149
log . error ( 'Config is invalid. At least one of the following must be enabled: recursive gateways, gateway providers, wss, or webtransport.' )
136
150
throw new Error ( 'Config is invalid. At least one of the following must be enabled: recursive gateways, gateway providers, wss, or webtransport.' )
137
151
}
138
152
}
153
+
154
+ /**
155
+ * Private field setters/getters
156
+ */
157
+ export async function setSubdomainsSupported ( supportsSubdomains : boolean , logger ?: ComponentLogger ) : Promise < void > {
158
+ const log = logger ?. forComponent ( 'set-subdomains-supported' )
159
+ try {
160
+ await configDb . open ( )
161
+ await configDb . put ( '_supportsSubdomains' , supportsSubdomains )
162
+ } catch ( err ) {
163
+ log ?.( 'error setting subdomain support in db' , err )
164
+ } finally {
165
+ configDb . close ( )
166
+ }
167
+ }
168
+
169
+ export async function areSubdomainsSupported ( logger ?: ComponentLogger ) : Promise < null | boolean > {
170
+ const log = logger ?. forComponent ( 'are-subdomains-supported' )
171
+ try {
172
+ await configDb . open ( )
173
+ return await configDb . get ( '_supportsSubdomains' ) ?? defaultSupportsSubdomains
174
+ } catch ( err ) {
175
+ log ?.( 'error loading subdomain support from db' , err )
176
+ } finally {
177
+ configDb . close ( )
178
+ }
179
+ return false
180
+ }
0 commit comments