Create Request wrapper

This commit is contained in:
2020-07-02 16:21:51 +02:00
parent c4038383aa
commit 61b8327a20
5 changed files with 43 additions and 21 deletions

View File

@@ -49,6 +49,7 @@ class SonosWorker(
device.stop() device.stop()
device.volume = data.volume device.volume = data.volume
if (preferences.getBoolean(PreferenceKey.ENABLE_GONG, false)) { if (preferences.getBoolean(PreferenceKey.ENABLE_GONG, false)) {
playUri(device, gongUrl) playUri(device, gongUrl)
} }

View File

@@ -30,9 +30,9 @@ class DefaultEndpoint(
return null return null
} }
val request = Request.of(extractBody(session), matchingResult.variables) val request = Request.of(session, matchingResult)
val response = consumer.call(request.body, request.params).checktable() val response = consumer.call(request.luaTable).checktable()
return parseResponse(response) return parseResponse(response)
} }
@@ -81,10 +81,4 @@ class DefaultEndpoint(
private fun getData(response: LuaTable) = response.get("data").checkstring().tojstring() private fun getData(response: LuaTable) = response.get("data").checkstring().tojstring()
private fun extractBody(session: IHTTPSession): String {
return mutableMapOf<String, String>().let {
session.parseBody(it)
it["postData"] ?: ""
}
}
} }

View File

@@ -1,14 +1,10 @@
package com.bartlomiejpluta.ttsserver.core.web.endpoint package com.bartlomiejpluta.ttsserver.core.web.endpoint
import com.bartlomiejpluta.ttsserver.core.sonos.worker.SonosWorker
import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate
import fi.iki.elonen.NanoHTTPD import fi.iki.elonen.NanoHTTPD
import fi.iki.elonen.NanoHTTPD.newFixedLengthResponse import fi.iki.elonen.NanoHTTPD.newFixedLengthResponse
import org.luaj.vm2.LuaClosure import org.luaj.vm2.LuaClosure
import java.util.concurrent.BlockingQueue
import java.util.concurrent.Executors
import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.ThreadPoolExecutor
class QueuedEndpoint( class QueuedEndpoint(
private val uri: UriTemplate, private val uri: UriTemplate,
@@ -33,7 +29,7 @@ class QueuedEndpoint(
return null return null
} }
val request = Request.of(extractBody(session), matchingResult.variables) val request = Request.of(session, matchingResult)
queue.add(request) queue.add(request)

View File

@@ -1,16 +1,40 @@
package com.bartlomiejpluta.ttsserver.core.web.endpoint package com.bartlomiejpluta.ttsserver.core.web.endpoint
import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate
import fi.iki.elonen.NanoHTTPD
import org.luaj.vm2.LuaValue import org.luaj.vm2.LuaValue
class Request private constructor(rawBody: String, paramsMap: Map<String, String>) { class Request private constructor(
val body = LuaValue.valueOf(rawBody) request: NanoHTTPD.IHTTPSession,
val params = LuaValue.tableOf().also { params -> matchingResult: UriTemplate.MatchingResult
paramsMap ) {
.map { LuaValue.valueOf(it.key) to LuaValue.valueOf(it.value) } val luaTable = LuaValue.tableOf()
.forEach { params.set(it.first, it.second) }
init {
val body = extractBody(request)
val pathParams = extractPathParams(matchingResult)
luaTable.set("body", body)
luaTable.set("params", pathParams)
} }
private fun extractPathParams(matchingResult: UriTemplate.MatchingResult) =
LuaValue.tableOf().also { params ->
matchingResult.variables
.map { LuaValue.valueOf(it.key) to LuaValue.valueOf(it.value) }
.forEach { params.set(it.first, it.second) }
}
private fun extractBody(request: NanoHTTPD.IHTTPSession) =
mutableMapOf<String, String>().let {
request.parseBody(it)
it["postData"] ?: ""
}
companion object { companion object {
fun of(body: String, params: Map<String, String>) = Request(body, params) fun of(request: NanoHTTPD.IHTTPSession, matchingResult: UriTemplate.MatchingResult) =
Request(request, matchingResult)
} }
} }

View File

@@ -3,6 +3,9 @@ package com.bartlomiejpluta.ttsserver.core.web.endpoint
import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService
import com.bartlomiejpluta.ttsserver.service.state.ServiceState import com.bartlomiejpluta.ttsserver.service.state.ServiceState
import org.luaj.vm2.LuaClosure import org.luaj.vm2.LuaClosure
import org.luaj.vm2.LuaInteger
import org.luaj.vm2.LuaValue
import org.luaj.vm2.lib.ZeroArgFunction
import java.util.concurrent.BlockingQueue import java.util.concurrent.BlockingQueue
class Worker( class Worker(
@@ -18,6 +21,10 @@ class Worker(
} }
private fun consume(request: Request) { private fun consume(request: Request) {
consumer.call(request.body, request.params) consumer.call(request.luaTable, QueueSizeFunction(queue))
}
class QueueSizeFunction(private val queue: BlockingQueue<Request>) : ZeroArgFunction() {
override fun call(): LuaInteger = LuaValue.valueOf(queue.size)
} }
} }