Experiment with Listener Creation

This commit is contained in:
Jakob Friedl
2025-05-02 18:10:30 +02:00
parent f2fb926e4b
commit 0c39fda207
7 changed files with 131 additions and 0 deletions

19
server/agent.nim Normal file
View File

@@ -0,0 +1,19 @@
import prologue
# /agent/register
proc agentRegister*(ctx: Context) {.async.} =
let body: JsonNode = ctx.request.body().parseJson()
echo body
resp jsonResponse(body, Http200)
# /agent/{uuid}/tasks
proc agentTasks*(ctx: Context) {.async.} =
resp "<h1>Agent Tasks</h1>"
# /agent/{uuid}/results
proc agentResults*(ctx: Context) {.async.} =
resp "<h1>Agent Results</h1>"

52
server/client.nim Normal file
View File

@@ -0,0 +1,52 @@
import prologue
import logging
import uuids
import strformat
import std/asynchttpserver
proc hello*(ctx: Context) {.async.} =
resp "Test"
# /client/listener
proc listenerList*(ctx: Context) {.async.} =
# JSON Response
let response = %*{"message": "Ok"}
resp jsonResponse(response)
# /client/listener/create
proc listenerCreate*(ctx: Context) {.async.} =
# Handle POST parameters (Port, IP)
# Create listener with random UUID
let
name: string = $genUUID()
listenerSettings = newSettings(
appName = name,
debug = false,
address = "127.0.0.1",
port = Port(443),
secretKey = name
)
var listener = newApp(settings=listenerSettings)
proc listenerHandler(req: NativeRequest): Future[void] {.gcsafe.} =
req.respond(Http200, name)
discard listener.serveAsync(listenerHandler)
logging.info(fmt"Listener {name} created.")
resp fmt"Listener {name} created.<br>Listening on <a href=http://{listenerSettings.address}:{listenerSettings.port}>{listenerSettings.address}:{listenerSettings.port}</a>"
# /client/listener/{uuid}/delete
proc listenerDelete*(ctx: Context) {.async.} =
resp "<h2>Listener Deleted</h2>"
# /client/agent
proc agentList*(ctx: Context) {.async.} =
resp "<h1>Agent List</h1>"
# /client/agent/build
proc agentCreate*(ctx: Context) {.async.} =
resp "<h1>Agent Create</h1>"

3
server/config.nims Normal file
View File

@@ -0,0 +1,3 @@
# Define command line switches in this file
--define:usestd
--threads:on

9
server/index.nim Normal file
View File

@@ -0,0 +1,9 @@
import prologue
# /
proc root*(ctx: Context) {.async.} =
resp "<h1>Hello, World!</h1>"
# /auth
proc auth*(ctx: Context) {.async.} =
resp "<h1>Hello, Auth!</h1>"

0
server/listener.nim Normal file
View File

20
server/server.nim Normal file
View File

@@ -0,0 +1,20 @@
import prologue
import asyncdispatch
import ./urls
let
env = loadPrologueEnv(".env")
settings = newSettings(
appName = env.getOrDefault("appName", "Prologue"),
debug = env.getOrDefault("debug", true),
port = Port(env.getOrDefault("port", 8080)),
secretKey = env.getOrDefault("secretKey", "")
)
var app = newApp(settings = settings)
app.addRoute(urls.indexPatterns, "/")
app.addRoute(urls.clientPatterns, "/client")
app.addRoute(urls.agentPatterns, "/agent")
waitFor app.runAsync()

28
server/urls.nim Normal file
View File

@@ -0,0 +1,28 @@
import prologue
import ./[index, client, agent]
let indexPatterns* = @[
pattern("/", index.root, @[HttpGet]),
pattern("/auth", index.auth, @[HttpPost])
]
#[
Client Interfaces
]#
let clientPatterns* = @[
pattern("/listener/", client.listenerList, @[HttpGet]),
pattern("/listener/create", client.listenerCreate, @[HttpPost, HttpGet]),
pattern("/listener/{uuid}/delete", client.listenerDelete, @[HttpGet]),
pattern("/agent/", client.agentList, @[HttpGet]),
pattern("/agent/create", client.agentCreate, @[HttpPost])
]
#[
Agent API
]#
let agentPatterns* = @[
pattern("/register", agent.agentRegister, @[HttpPost]),
pattern("/{uuid}/tasks", agent.agentTasks, @[HttpGet, HttpPost]),
pattern("/{uuid}/results", agent.agentResults, @[HttpGet, HttpPost])
]