diff --git a/src/dorkbox/network/connection/EndPoint.kt b/src/dorkbox/network/connection/EndPoint.kt index d2e2d343..859b5582 100644 --- a/src/dorkbox/network/connection/EndPoint.kt +++ b/src/dorkbox/network/connection/EndPoint.kt @@ -96,8 +96,12 @@ internal constructor(val type: Class<*>, internal val config: Configuration) : A @Volatile private var shutdownWaiter: SuspendWaiter = SuspendWaiter() - // we only want one instance of these created. These will be called appropriately - val settingsStore: SettingsStore + /** + * Returns the storage used by this endpoint. This is the backing data structure for key/value pairs, and can be a database, file, etc + * + * Only one instance of these is created for an endpoint. + */ + val storage: SettingsStore internal val rmiGlobalSupport = RmiManagerGlobal(logger, actionDispatch, config.serialization) @@ -122,9 +126,9 @@ internal constructor(val type: Class<*>, internal val config: Configuration) : A handshakeKryo = serialization.initHandshakeKryo() // we have to be able to specify the property store - settingsStore = createSettingsStore(logger) + storage = config.settingsStore.create(logger) - crypto = CryptoManagement(logger, settingsStore, type, config.enableRemoteSignatureValidation) + crypto = CryptoManagement(logger, storage, type, config.enableRemoteSignatureValidation) // Only starts the media driver if we are NOT already running! try { @@ -136,13 +140,6 @@ internal constructor(val type: Class<*>, internal val config: Configuration) : A } } - /** - * Open so users can override which/how a settings store is created - */ - open fun createSettingsStore(logger: KLogger): SettingsStore { - return config.settingsStore.create(logger) - } - internal fun initEndpointState() { shutdown.getAndSet(false) shutdownWaiter = SuspendWaiter() @@ -188,14 +185,6 @@ internal constructor(val type: Class<*>, internal val config: Configuration) : A connections.remove(connection) } - /** - * Returns the property store used by this endpoint. The property store can store via properties, - * a database, etc, or can be a "null" property store, which does nothing - */ - fun getStorage(): SettingsStore { - return settingsStore - } - /** * This method allows the connections used by the client/server to be subclassed (with custom implementations). * @@ -629,7 +618,7 @@ internal constructor(val type: Class<*>, internal val config: Configuration) : A } // the storage is closed via this as well. - settingsStore.close() + storage.close() // Connections are closed first, because we want to make sure that no RMI messages can be received // when we close the RMI support objects (in which case, weird - but harmless - errors show up) diff --git a/src/dorkbox/network/handshake/ClientHandshake.kt b/src/dorkbox/network/handshake/ClientHandshake.kt index c9f82515..a3f28586 100644 --- a/src/dorkbox/network/handshake/ClientHandshake.kt +++ b/src/dorkbox/network/handshake/ClientHandshake.kt @@ -146,7 +146,7 @@ internal class ClientHandshake(private val crypto: Crypt suspend fun handshakeHello(handshakeConnection: MediaDriverConnection, connectionTimeoutMS: Long) : ClientConnectionInfo { failed = null oneTimeKey = endPoint.crypto.secureRandom.nextInt() - val publicKey = endPoint.settingsStore.getPublicKey()!! + val publicKey = endPoint.storage.getPublicKey()!! // Send the one-time pad to the server. val publication = handshakeConnection.publication diff --git a/test/dorkboxTest/network/StorageTest.kt b/test/dorkboxTest/network/StorageTest.kt index f9522671..6c263ffc 100644 --- a/test/dorkboxTest/network/StorageTest.kt +++ b/test/dorkboxTest/network/StorageTest.kt @@ -19,12 +19,11 @@ import dorkbox.network.Client import dorkbox.network.Server import dorkbox.network.connection.Connection import dorkbox.network.storage.SettingsStore -import dorkbox.network.storage.types.ChronicleMapStore -import dorkbox.network.storage.types.LmdbStore -import dorkbox.network.storage.types.MemoryStore -import dorkbox.network.storage.types.PropertyStore +import dorkbox.network.storage.StorageType +import dorkbox.network.storage.types.* import kotlinx.coroutines.runBlocking import mu.KLogger +import mu.KotlinLogging import org.junit.Assert import org.junit.Test import java.io.File @@ -33,24 +32,31 @@ class StorageTest : BaseTest() { @Test fun sharedStoreTest() { // we want the server + client to have the SAME info - val store = MemoryStore.type().create() + val store = MemoryAccess(KotlinLogging.logger("StorageType")) - val server = object : Server(serverConfig()) { - override fun createSettingsStore(logger: KLogger): SettingsStore { - return store + val sharedStore = object : StorageType { + override fun create(logger: KLogger): SettingsStore { + return SettingsStore(logger, store) } } - val client = object: Client(clientConfig()) { - override fun createSettingsStore(logger: KLogger): SettingsStore { - return store - } - } + val serverConfig = serverConfig { + settingsStore = sharedStore + } + val server = Server(serverConfig) + + val config = clientConfig { + settingsStore = sharedStore + } + val client = Client(config) server.bind() runBlocking { client.connect("localhost") + + Assert.assertFalse(server.storage.getSalt().contentEquals(client.storage.getSalt())) + server.close() } } @@ -60,8 +66,8 @@ class StorageTest : BaseTest() { fun memoryTest() { val salt1 = MemoryStore.type().create().use { it.getSalt() } - val salt2 = Server(serverConfig().apply { settingsStore = MemoryStore.type() }).use { it.settingsStore.getSalt() } - val salt3 = Server(serverConfig().apply { settingsStore = MemoryStore.type() }).use { it.settingsStore.getSalt() } + val salt2 = Server(serverConfig().apply { settingsStore = MemoryStore.type() }).use { it.storage.getSalt() } + val salt3 = Server(serverConfig().apply { settingsStore = MemoryStore.type() }).use { it.storage.getSalt() } Assert.assertFalse(salt1.contentEquals(salt2)) Assert.assertFalse(salt1.contentEquals(salt3)) @@ -80,8 +86,8 @@ class StorageTest : BaseTest() { file.delete() fileLock.delete() - val salt3 = Server(serverConfig().apply { settingsStore = LmdbStore.type(file) }).use { it.settingsStore.getSalt() } - val salt4 = Server(serverConfig().apply { settingsStore = LmdbStore.type(file) }).use { it.settingsStore.getSalt() } + val salt3 = Server(serverConfig().apply { settingsStore = LmdbStore.type(file) }).use { it.storage.getSalt() } + val salt4 = Server(serverConfig().apply { settingsStore = LmdbStore.type(file) }).use { it.storage.getSalt() } Assert.assertArrayEquals(salt3, salt4) Assert.assertFalse(salt1.contentEquals(salt4)) @@ -99,8 +105,8 @@ class StorageTest : BaseTest() { Assert.assertArrayEquals(salt1, salt2) file.delete() - val salt3 = Server(serverConfig().apply { settingsStore = PropertyStore.type(file) }).use { it.settingsStore.getSalt() } - val salt4 = Server(serverConfig().apply { settingsStore = PropertyStore.type(file) }).use { it.settingsStore.getSalt() } + val salt3 = Server(serverConfig().apply { settingsStore = PropertyStore.type(file) }).use { it.storage.getSalt() } + val salt4 = Server(serverConfig().apply { settingsStore = PropertyStore.type(file) }).use { it.storage.getSalt() } Assert.assertArrayEquals(salt3, salt4) Assert.assertFalse(salt1.contentEquals(salt4)) @@ -117,8 +123,8 @@ class StorageTest : BaseTest() { Assert.assertArrayEquals(salt1, salt2) file.delete() - val salt3 = Server(serverConfig().apply { settingsStore = ChronicleMapStore.type(file) }).use { it.settingsStore.getSalt() } - val salt4 = Server(serverConfig().apply { settingsStore = ChronicleMapStore.type(file) }).use { it.settingsStore.getSalt() } + val salt3 = Server(serverConfig().apply { settingsStore = ChronicleMapStore.type(file) }).use { it.storage.getSalt() } + val salt4 = Server(serverConfig().apply { settingsStore = ChronicleMapStore.type(file) }).use { it.storage.getSalt() } Assert.assertArrayEquals(salt3, salt4) Assert.assertFalse(salt1.contentEquals(salt4))