|
| 1 | +package dev.c0redev.volter.domain.model |
| 2 | + |
| 3 | +import dev.c0redev.volter.json.optJSONArrayStringList |
| 4 | +import dev.c0redev.volter.json.optNullableBoolean |
| 5 | +import dev.c0redev.volter.json.optNullableInt |
| 6 | +import dev.c0redev.volter.json.optNullableString |
| 7 | +import dev.c0redev.volter.json.putStringListIfNonempty |
| 8 | +import org.json.JSONObject |
| 9 | + |
| 10 | + |
| 11 | +data class RelayOptions( |
| 12 | + val peerId: String? = null, |
| 13 | + val privateKey: String? = null, |
| 14 | + val allowedClasses: List<String>? = null, |
| 15 | + val maxConcurrent: Int? = null, |
| 16 | + val budgetKbps: Int? = null, |
| 17 | + val discoverySigned: String? = null, |
| 18 | + val discoveryURL: String? = null, |
| 19 | + val gossipEnabled: Boolean? = null, |
| 20 | + val bootstrapPubKey: String? = null, |
| 21 | + val emergencyPolicyURL: String? = null, |
| 22 | + val emergencyPolicyPubKey: String? = null, |
| 23 | + val pathAggressive: Boolean? = null, |
| 24 | + val pathCooldownMs: Int? = null, |
| 25 | + val stunServers: List<String>? = null, |
| 26 | + val turnUrls: List<String>? = null, |
| 27 | + val gossipPeers: List<String>? = null, |
| 28 | + val gossipIntervalSec: Int? = null, |
| 29 | + val gossipMaxAgeSec: Int? = null, |
| 30 | + val geoAllowCountries: List<String>? = null, |
| 31 | + val geoDenyCountries: List<String>? = null, |
| 32 | + val stakeMin: Int? = null, |
| 33 | + val peerPathFromDiscovery: Boolean? = null, |
| 34 | + val peerRelayUseQuic: Boolean? = null, |
| 35 | + val peerRelayUseUdp: Boolean? = null, |
| 36 | + val peerRelayUdpListen: String? = null, |
| 37 | + val peerRelayUdpAdvertise: String? = null, |
| 38 | + val peerQuicServerName: String? = null, |
| 39 | + val dhtFindUrls: List<String>? = null, |
| 40 | + val stakeRegistryURL: String? = null, |
| 41 | + val stakeRegistryPubKey: String? = null, |
| 42 | + val stakeReputationFile: String? = null, |
| 43 | + val stakeBonusHttpUrl: String? = null, |
| 44 | + val stakeMerkleFile: String? = null, |
| 45 | + val stakeMerkleRootUrl: String? = null, |
| 46 | + val dhtRpcListenUdp: String? = null, |
| 47 | + val dhtRpcSecret: String? = null, |
| 48 | + val dhtRpcSeedPeers: List<String>? = null, |
| 49 | + val dhtRpcIntervalSec: Int? = null, |
| 50 | + val dhtRpcFindK: Int? = null, |
| 51 | + val dhtIterativeRounds: Int? = null, |
| 52 | + val dhtIterativeAlpha: Int? = null, |
| 53 | + val dhtPublishSrflx: Boolean? = null, |
| 54 | + val symmetricNatHolePunch: Boolean? = null, |
| 55 | +) { |
| 56 | + fun toJson(): JSONObject { |
| 57 | + val j = JSONObject() |
| 58 | + peerId?.takeIf { it.isNotBlank() }?.let { j.put("peerId", it) } |
| 59 | + privateKey?.takeIf { it.isNotBlank() }?.let { j.put("privateKey", it) } |
| 60 | + j.putStringListIfNonempty("allowedClasses", allowedClasses) |
| 61 | + maxConcurrent?.takeIf { it != 0 }?.let { j.put("maxConcurrent", it) } |
| 62 | + budgetKbps?.takeIf { it != 0 }?.let { j.put("budgetKbps", it) } |
| 63 | + discoverySigned?.takeIf { it.isNotBlank() }?.let { j.put("discoverySigned", it) } |
| 64 | + discoveryURL?.takeIf { it.isNotBlank() }?.let { j.put("discoveryURL", it) } |
| 65 | + gossipEnabled?.let { j.put("gossipEnabled", it) } |
| 66 | + bootstrapPubKey?.takeIf { it.isNotBlank() }?.let { j.put("bootstrapPubKey", it) } |
| 67 | + emergencyPolicyURL?.takeIf { it.isNotBlank() }?.let { j.put("emergencyPolicyURL", it) } |
| 68 | + emergencyPolicyPubKey?.takeIf { it.isNotBlank() }?.let { j.put("emergencyPolicyPubKey", it) } |
| 69 | + pathAggressive?.let { j.put("pathAggressive", it) } |
| 70 | + pathCooldownMs?.takeIf { it != 0 }?.let { j.put("pathCooldownMs", it) } |
| 71 | + j.putStringListIfNonempty("stunServers", stunServers) |
| 72 | + j.putStringListIfNonempty("turnUrls", turnUrls) |
| 73 | + j.putStringListIfNonempty("gossipPeers", gossipPeers) |
| 74 | + gossipIntervalSec?.takeIf { it != 0 }?.let { j.put("gossipIntervalSec", it) } |
| 75 | + gossipMaxAgeSec?.takeIf { it != 0 }?.let { j.put("gossipMaxAgeSec", it) } |
| 76 | + j.putStringListIfNonempty("geoAllowCountries", geoAllowCountries) |
| 77 | + j.putStringListIfNonempty("geoDenyCountries", geoDenyCountries) |
| 78 | + stakeMin?.takeIf { it != 0 }?.let { j.put("stakeMin", it) } |
| 79 | + peerPathFromDiscovery?.let { j.put("peerPathFromDiscovery", it) } |
| 80 | + peerRelayUseQuic?.let { j.put("peerRelayUseQuic", it) } |
| 81 | + peerRelayUseUdp?.let { j.put("peerRelayUseUdp", it) } |
| 82 | + peerRelayUdpListen?.takeIf { it.isNotBlank() }?.let { j.put("peerRelayUdpListen", it) } |
| 83 | + peerRelayUdpAdvertise?.takeIf { it.isNotBlank() }?.let { j.put("peerRelayUdpAdvertise", it) } |
| 84 | + peerQuicServerName?.takeIf { it.isNotBlank() }?.let { j.put("peerQuicServerName", it) } |
| 85 | + j.putStringListIfNonempty("dhtFindUrls", dhtFindUrls) |
| 86 | + stakeRegistryURL?.takeIf { it.isNotBlank() }?.let { j.put("stakeRegistryURL", it) } |
| 87 | + stakeRegistryPubKey?.takeIf { it.isNotBlank() }?.let { j.put("stakeRegistryPubKey", it) } |
| 88 | + stakeReputationFile?.takeIf { it.isNotBlank() }?.let { j.put("stakeReputationFile", it) } |
| 89 | + stakeBonusHttpUrl?.takeIf { it.isNotBlank() }?.let { j.put("stakeBonusHttpUrl", it) } |
| 90 | + stakeMerkleFile?.takeIf { it.isNotBlank() }?.let { j.put("stakeMerkleFile", it) } |
| 91 | + stakeMerkleRootUrl?.takeIf { it.isNotBlank() }?.let { j.put("stakeMerkleRootUrl", it) } |
| 92 | + dhtRpcListenUdp?.takeIf { it.isNotBlank() }?.let { j.put("dhtRpcListenUdp", it) } |
| 93 | + dhtRpcSecret?.takeIf { it.isNotBlank() }?.let { j.put("dhtRpcSecret", it) } |
| 94 | + j.putStringListIfNonempty("dhtRpcSeedPeers", dhtRpcSeedPeers) |
| 95 | + dhtRpcIntervalSec?.takeIf { it != 0 }?.let { j.put("dhtRpcIntervalSec", it) } |
| 96 | + dhtRpcFindK?.takeIf { it != 0 }?.let { j.put("dhtRpcFindK", it) } |
| 97 | + dhtIterativeRounds?.takeIf { it != 0 }?.let { j.put("dhtIterativeRounds", it) } |
| 98 | + dhtIterativeAlpha?.takeIf { it != 0 }?.let { j.put("dhtIterativeAlpha", it) } |
| 99 | + dhtPublishSrflx?.let { j.put("dhtPublishSrflx", it) } |
| 100 | + symmetricNatHolePunch?.let { j.put("symmetricNatHolePunch", it) } |
| 101 | + return j |
| 102 | + } |
| 103 | + |
| 104 | + companion object { |
| 105 | + fun fromJson(j: JSONObject): RelayOptions { |
| 106 | + fun list(key: String) = j.optJSONArrayStringList(key) |
| 107 | + return RelayOptions( |
| 108 | + peerId = j.optNullableString("peerId"), |
| 109 | + privateKey = j.optNullableString("privateKey"), |
| 110 | + allowedClasses = list("allowedClasses"), |
| 111 | + maxConcurrent = j.optNullableInt("maxConcurrent"), |
| 112 | + budgetKbps = j.optNullableInt("budgetKbps"), |
| 113 | + discoverySigned = j.optNullableString("discoverySigned"), |
| 114 | + discoveryURL = j.optNullableString("discoveryURL"), |
| 115 | + gossipEnabled = j.optNullableBoolean("gossipEnabled"), |
| 116 | + bootstrapPubKey = j.optNullableString("bootstrapPubKey"), |
| 117 | + emergencyPolicyURL = j.optNullableString("emergencyPolicyURL"), |
| 118 | + emergencyPolicyPubKey = j.optNullableString("emergencyPolicyPubKey"), |
| 119 | + pathAggressive = j.optNullableBoolean("pathAggressive"), |
| 120 | + pathCooldownMs = j.optNullableInt("pathCooldownMs"), |
| 121 | + stunServers = list("stunServers"), |
| 122 | + turnUrls = list("turnUrls"), |
| 123 | + gossipPeers = list("gossipPeers"), |
| 124 | + gossipIntervalSec = j.optNullableInt("gossipIntervalSec"), |
| 125 | + gossipMaxAgeSec = j.optNullableInt("gossipMaxAgeSec"), |
| 126 | + geoAllowCountries = list("geoAllowCountries"), |
| 127 | + geoDenyCountries = list("geoDenyCountries"), |
| 128 | + stakeMin = j.optNullableInt("stakeMin"), |
| 129 | + peerPathFromDiscovery = j.optNullableBoolean("peerPathFromDiscovery"), |
| 130 | + peerRelayUseQuic = j.optNullableBoolean("peerRelayUseQuic"), |
| 131 | + peerRelayUseUdp = j.optNullableBoolean("peerRelayUseUdp"), |
| 132 | + peerRelayUdpListen = j.optNullableString("peerRelayUdpListen"), |
| 133 | + peerRelayUdpAdvertise = j.optNullableString("peerRelayUdpAdvertise"), |
| 134 | + peerQuicServerName = j.optNullableString("peerQuicServerName"), |
| 135 | + dhtFindUrls = list("dhtFindUrls"), |
| 136 | + stakeRegistryURL = j.optNullableString("stakeRegistryURL"), |
| 137 | + stakeRegistryPubKey = j.optNullableString("stakeRegistryPubKey"), |
| 138 | + stakeReputationFile = j.optNullableString("stakeReputationFile"), |
| 139 | + stakeBonusHttpUrl = j.optNullableString("stakeBonusHttpUrl"), |
| 140 | + stakeMerkleFile = j.optNullableString("stakeMerkleFile"), |
| 141 | + stakeMerkleRootUrl = j.optNullableString("stakeMerkleRootUrl"), |
| 142 | + dhtRpcListenUdp = j.optNullableString("dhtRpcListenUdp"), |
| 143 | + dhtRpcSecret = j.optNullableString("dhtRpcSecret"), |
| 144 | + dhtRpcSeedPeers = list("dhtRpcSeedPeers"), |
| 145 | + dhtRpcIntervalSec = j.optNullableInt("dhtRpcIntervalSec"), |
| 146 | + dhtRpcFindK = j.optNullableInt("dhtRpcFindK"), |
| 147 | + dhtIterativeRounds = j.optNullableInt("dhtIterativeRounds"), |
| 148 | + dhtIterativeAlpha = j.optNullableInt("dhtIterativeAlpha"), |
| 149 | + dhtPublishSrflx = j.optNullableBoolean("dhtPublishSrflx"), |
| 150 | + symmetricNatHolePunch = j.optNullableBoolean("symmetricNatHolePunch"), |
| 151 | + ) |
| 152 | + } |
| 153 | + } |
| 154 | +} |
| 155 | + |
| 156 | + |
| 157 | +fun RelayOptions.withUserOverlay(user: RelayOptions?): RelayOptions { |
| 158 | + if (user == null) return this |
| 159 | + return copy( |
| 160 | + peerId = user.peerId ?: peerId, |
| 161 | + privateKey = user.privateKey ?: privateKey, |
| 162 | + allowedClasses = user.allowedClasses ?: allowedClasses, |
| 163 | + maxConcurrent = user.maxConcurrent ?: maxConcurrent, |
| 164 | + budgetKbps = user.budgetKbps ?: budgetKbps, |
| 165 | + discoverySigned = user.discoverySigned ?: discoverySigned, |
| 166 | + discoveryURL = user.discoveryURL ?: discoveryURL, |
| 167 | + gossipEnabled = user.gossipEnabled ?: gossipEnabled, |
| 168 | + bootstrapPubKey = user.bootstrapPubKey ?: bootstrapPubKey, |
| 169 | + emergencyPolicyURL = user.emergencyPolicyURL ?: emergencyPolicyURL, |
| 170 | + emergencyPolicyPubKey = user.emergencyPolicyPubKey ?: emergencyPolicyPubKey, |
| 171 | + pathAggressive = user.pathAggressive ?: pathAggressive, |
| 172 | + pathCooldownMs = user.pathCooldownMs ?: pathCooldownMs, |
| 173 | + stunServers = user.stunServers ?: stunServers, |
| 174 | + turnUrls = user.turnUrls ?: turnUrls, |
| 175 | + gossipPeers = user.gossipPeers ?: gossipPeers, |
| 176 | + gossipIntervalSec = user.gossipIntervalSec ?: gossipIntervalSec, |
| 177 | + gossipMaxAgeSec = user.gossipMaxAgeSec ?: gossipMaxAgeSec, |
| 178 | + geoAllowCountries = user.geoAllowCountries ?: geoAllowCountries, |
| 179 | + geoDenyCountries = user.geoDenyCountries ?: geoDenyCountries, |
| 180 | + stakeMin = user.stakeMin ?: stakeMin, |
| 181 | + peerPathFromDiscovery = user.peerPathFromDiscovery ?: peerPathFromDiscovery, |
| 182 | + peerRelayUseQuic = user.peerRelayUseQuic ?: peerRelayUseQuic, |
| 183 | + peerRelayUseUdp = user.peerRelayUseUdp ?: peerRelayUseUdp, |
| 184 | + peerRelayUdpListen = user.peerRelayUdpListen ?: peerRelayUdpListen, |
| 185 | + peerRelayUdpAdvertise = user.peerRelayUdpAdvertise ?: peerRelayUdpAdvertise, |
| 186 | + peerQuicServerName = user.peerQuicServerName ?: peerQuicServerName, |
| 187 | + dhtFindUrls = user.dhtFindUrls ?: dhtFindUrls, |
| 188 | + stakeRegistryURL = user.stakeRegistryURL ?: stakeRegistryURL, |
| 189 | + stakeRegistryPubKey = user.stakeRegistryPubKey ?: stakeRegistryPubKey, |
| 190 | + stakeReputationFile = user.stakeReputationFile ?: stakeReputationFile, |
| 191 | + stakeBonusHttpUrl = user.stakeBonusHttpUrl ?: stakeBonusHttpUrl, |
| 192 | + stakeMerkleFile = user.stakeMerkleFile ?: stakeMerkleFile, |
| 193 | + stakeMerkleRootUrl = user.stakeMerkleRootUrl ?: stakeMerkleRootUrl, |
| 194 | + dhtRpcListenUdp = user.dhtRpcListenUdp ?: dhtRpcListenUdp, |
| 195 | + dhtRpcSecret = user.dhtRpcSecret ?: dhtRpcSecret, |
| 196 | + dhtRpcSeedPeers = user.dhtRpcSeedPeers ?: dhtRpcSeedPeers, |
| 197 | + dhtRpcIntervalSec = user.dhtRpcIntervalSec ?: dhtRpcIntervalSec, |
| 198 | + dhtRpcFindK = user.dhtRpcFindK ?: dhtRpcFindK, |
| 199 | + dhtIterativeRounds = user.dhtIterativeRounds ?: dhtIterativeRounds, |
| 200 | + dhtIterativeAlpha = user.dhtIterativeAlpha ?: dhtIterativeAlpha, |
| 201 | + dhtPublishSrflx = user.dhtPublishSrflx ?: dhtPublishSrflx, |
| 202 | + symmetricNatHolePunch = user.symmetricNatHolePunch ?: symmetricNatHolePunch, |
| 203 | + ) |
| 204 | +} |
0 commit comments