Serve Full-stack
Un patrón full-stack: servidor HTTP que usa nyx-kv como backend de estado. El endpoint counter demuestra un read-modify-write con comandos RESP.
Código
// nyx-serve full-stack — HTTP server + JSON API + nyx-kv backend
// nyx-serve full-stack — servidor HTTP + API JSON + backend nyx-kv
import "std/http"
import "std/web"
fn resp_cmd(parts: Array) -> String {
var sb: StringBuilder = StringBuilder.new()
sb.append("*")
sb.append(int_to_string(parts.length()))
sb.append("\r\n")
var i: int = 0
while i < parts.length() {
let p: String = parts[i]
sb.append("$" + int_to_string(p.length()) + "\r\n" + p + "\r\n")
i = i + 1
}
return sb.to_string()
}
// Call nyx-kv and return the result (or empty on error)
fn kv_get(key: String) -> String {
let fd: int = tcp_connect("127.0.0.1", 6380)
if fd < 0 { return "" }
tcp_write(fd, resp_cmd(["GET", key]))
let hdr: String = tcp_read_line(fd)
let val: String = tcp_read_line(fd)
tcp_close(fd)
return val.trim()
}
fn kv_set(key: String, val: String) -> int {
let fd: int = tcp_connect("127.0.0.1", 6380)
if fd < 0 { return -1 }
tcp_write(fd, resp_cmd(["SET", key, val]))
tcp_read_line(fd)
tcp_close(fd)
return 0
}
// GET /counter — increments and returns a global counter stored in nyx-kv
fn counter(req: Request) -> Response {
let current: String = kv_get("counter")
var n: int = 0
if current.length() > 0 { n = string_to_int(current) }
n = n + 1
kv_set("counter", int_to_string(n))
return response_json(200, "{\"count\": " + int_to_string(n) + "}")
}
fn main() -> int {
let app: App = app_new()
app_get(app, "/counter", counter)
print("full-stack app: HTTP + JSON + KV backend")
print("GET /counter increments a counter stored in nyx-kv")
print("this pattern powers nyxlang.com's request analytics")
return 0
}
Salida
full-stack app: HTTP + JSON + KV backend GET /counter increments a counter stored in nyx-kv this pattern powers nyxlang.com's request analytics
Explicación
Este es el patrón canónico full-stack de Nyx: una capa HTTP sin estado que habla con una capa nyx-kv con estado a través de RESP. resp_cmd codifica los comandos en el formato de wire de Redis — un array con prefijo de longitud de bulk strings — que nyx-kv habla nativamente. kv_get y kv_set abren cada una una conexión de corta duración; en producción las pondrías en un pool. El endpoint /counter muestra un read-modify-write: hace GET del valor actual, lo incrementa, y hace SET de vuelta. Este patrón no es atómico entre llamadores concurrentes — para un contador real usarías INCR, que nyx-kv ejecuta del lado del servidor. La ganancia arquitectónica es que la capa web permanece sin estado, así que cualquier worker en cualquier datacenter puede servir cualquier solicitud.