Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -23,8 +23,12 @@ MAX_MESSAGES = int(os.getenv("MAX_MESSAGES", "200"))
|
|
| 23 |
PERSIST_TO_FILE = os.getenv("PERSIST_TO_FILE", "0").strip() == "1"
|
| 24 |
PERSIST_PATH = os.getenv("PERSIST_PATH", "webhook_messages.jsonl").strip()
|
| 25 |
|
| 26 |
-
# Downstream wakeup server
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
RELAY_TIMEOUT = int(os.getenv("RELAY_TIMEOUT", "30"))
|
| 29 |
|
| 30 |
# Dedupe window
|
|
@@ -114,6 +118,7 @@ def _norm(v: Any) -> str:
|
|
| 114 |
|
| 115 |
|
| 116 |
def compute_fingerprint(payload: Dict[str, Any]) -> str:
|
|
|
|
| 117 |
parts = {
|
| 118 |
"event_type": _norm(payload.get("event_type")),
|
| 119 |
"rid": _norm(payload.get("rid")),
|
|
@@ -205,14 +210,17 @@ async def webhook(
|
|
| 205 |
now = _now_ts()
|
| 206 |
_gc_seen(now)
|
| 207 |
|
|
|
|
| 208 |
if not _norm(payload.get("sa_processing_state")):
|
| 209 |
payload["sa_processing_state"] = "new"
|
| 210 |
|
|
|
|
| 211 |
fp = _norm(payload.get("sa_fingerprint"))
|
| 212 |
if not fp:
|
| 213 |
fp = compute_fingerprint(payload)
|
| 214 |
payload["sa_fingerprint"] = fp
|
| 215 |
|
|
|
|
| 216 |
duplicate = fp in SEEN
|
| 217 |
if not duplicate:
|
| 218 |
SEEN[fp] = now
|
|
@@ -229,10 +237,6 @@ async def webhook(
|
|
| 229 |
meta = {
|
| 230 |
"client": request.client.host if request.client else None,
|
| 231 |
"path": str(request.url.path),
|
| 232 |
-
"headers": {
|
| 233 |
-
"user-agent": request.headers.get("user-agent"),
|
| 234 |
-
"content-type": request.headers.get("content-type"),
|
| 235 |
-
},
|
| 236 |
}
|
| 237 |
_append_message(payload=payload, meta=meta, relay=relay_info)
|
| 238 |
return JSONResponse(status_code=200, content=relay_info)
|
|
@@ -249,10 +253,6 @@ async def webhook(
|
|
| 249 |
meta = {
|
| 250 |
"client": request.client.host if request.client else None,
|
| 251 |
"path": str(request.url.path),
|
| 252 |
-
"headers": {
|
| 253 |
-
"user-agent": request.headers.get("user-agent"),
|
| 254 |
-
"content-type": request.headers.get("content-type"),
|
| 255 |
-
},
|
| 256 |
}
|
| 257 |
_append_message(payload=payload, meta=meta, relay=relay_info)
|
| 258 |
return JSONResponse(status_code=200, content=relay_info)
|
|
@@ -282,12 +282,6 @@ async def webhook(
|
|
| 282 |
meta = {
|
| 283 |
"client": request.client.host if request.client else None,
|
| 284 |
"path": str(request.url.path),
|
| 285 |
-
"headers": {
|
| 286 |
-
"user-agent": request.headers.get("user-agent"),
|
| 287 |
-
"content-type": request.headers.get("content-type"),
|
| 288 |
-
WEBHOOK_TOKEN_HEADER: "***" if request.headers.get(WEBHOOK_TOKEN_HEADER) else None,
|
| 289 |
-
"x-sa-signature": "***" if request.headers.get("x-sa-signature") else None,
|
| 290 |
-
},
|
| 291 |
}
|
| 292 |
|
| 293 |
_append_message(payload=payload, meta=meta, relay=relay_info)
|
|
@@ -295,7 +289,7 @@ async def webhook(
|
|
| 295 |
|
| 296 |
|
| 297 |
# -----------------------------------------------------------------------------
|
| 298 |
-
# Gradio dashboard
|
| 299 |
# -----------------------------------------------------------------------------
|
| 300 |
def ui_status() -> str:
|
| 301 |
return _safe_json_dumps(
|
|
|
|
| 23 |
PERSIST_TO_FILE = os.getenv("PERSIST_TO_FILE", "0").strip() == "1"
|
| 24 |
PERSIST_PATH = os.getenv("PERSIST_PATH", "webhook_messages.jsonl").strip()
|
| 25 |
|
| 26 |
+
# Downstream wakeup server
|
| 27 |
+
# IMPORTANT: This must be the *actual* endpoint. Example:
|
| 28 |
+
# http://163.245.192.149:8080/wakeup
|
| 29 |
+
WAKEUP_URL = os.getenv("WAKEUP_URL", "http://163.245.192.149:8080/wakeup").strip()
|
| 30 |
+
WAKEUP_URL = WAKEUP_URL.rstrip("/") # normalize to no trailing slash
|
| 31 |
+
|
| 32 |
RELAY_TIMEOUT = int(os.getenv("RELAY_TIMEOUT", "30"))
|
| 33 |
|
| 34 |
# Dedupe window
|
|
|
|
| 118 |
|
| 119 |
|
| 120 |
def compute_fingerprint(payload: Dict[str, Any]) -> str:
|
| 121 |
+
# MVP fingerprint. Upgrade later to sha256(file_bytes) when you have file URL/bytes.
|
| 122 |
parts = {
|
| 123 |
"event_type": _norm(payload.get("event_type")),
|
| 124 |
"rid": _norm(payload.get("rid")),
|
|
|
|
| 210 |
now = _now_ts()
|
| 211 |
_gc_seen(now)
|
| 212 |
|
| 213 |
+
# Default state
|
| 214 |
if not _norm(payload.get("sa_processing_state")):
|
| 215 |
payload["sa_processing_state"] = "new"
|
| 216 |
|
| 217 |
+
# Fingerprint
|
| 218 |
fp = _norm(payload.get("sa_fingerprint"))
|
| 219 |
if not fp:
|
| 220 |
fp = compute_fingerprint(payload)
|
| 221 |
payload["sa_fingerprint"] = fp
|
| 222 |
|
| 223 |
+
# Dedupe
|
| 224 |
duplicate = fp in SEEN
|
| 225 |
if not duplicate:
|
| 226 |
SEEN[fp] = now
|
|
|
|
| 237 |
meta = {
|
| 238 |
"client": request.client.host if request.client else None,
|
| 239 |
"path": str(request.url.path),
|
|
|
|
|
|
|
|
|
|
|
|
|
| 240 |
}
|
| 241 |
_append_message(payload=payload, meta=meta, relay=relay_info)
|
| 242 |
return JSONResponse(status_code=200, content=relay_info)
|
|
|
|
| 253 |
meta = {
|
| 254 |
"client": request.client.host if request.client else None,
|
| 255 |
"path": str(request.url.path),
|
|
|
|
|
|
|
|
|
|
|
|
|
| 256 |
}
|
| 257 |
_append_message(payload=payload, meta=meta, relay=relay_info)
|
| 258 |
return JSONResponse(status_code=200, content=relay_info)
|
|
|
|
| 282 |
meta = {
|
| 283 |
"client": request.client.host if request.client else None,
|
| 284 |
"path": str(request.url.path),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 285 |
}
|
| 286 |
|
| 287 |
_append_message(payload=payload, meta=meta, relay=relay_info)
|
|
|
|
| 289 |
|
| 290 |
|
| 291 |
# -----------------------------------------------------------------------------
|
| 292 |
+
# Gradio dashboard mounted at /ui (doesn't interfere with API routes)
|
| 293 |
# -----------------------------------------------------------------------------
|
| 294 |
def ui_status() -> str:
|
| 295 |
return _safe_json_dumps(
|