7949da3734
feat: structured logging, JSDoc types, and WEBHOOK_SECRET guard
...
- Replace string-interpolated console.log/error with JSON.stringify
for searchable/filterable CF Workers dashboard logs
- Add shared JSDoc typedefs (Subscriber, QueueMessage, ChatTarget)
with @param/@returns annotations on key functions
- Guard against undefined WEBHOOK_SECRET env var (auth bypass on
misconfigured deploy)
- Add 3 declined features to feature-decisions.md (fan-out decoupling,
idempotency keys, /ping)
2026-04-09 11:30:00 +07:00
8c993df72b
fix: harden webhook reliability, fix bugs, add test suite
...
- Statuspage webhook always returns 200 to prevent subscriber removal
- Fix parseKvKey returning string chatId instead of number
- Queue consumer retries on Telegram 5xx instead of acking (prevents message loss)
- Fix observability top-level enabled flag (false → true)
- Add defensive null checks for webhook payload body
- Cache Bot instance per isolate to avoid middleware rebuild per request
- Add vitest + @cloudflare/vitest-pool-workers with 31 tests
- Document DLQ and KV sharding as declined features
2026-04-09 10:29:30 +07:00
133e7799fd
refactor: reorder feature decisions by implementation likelihood
2026-04-09 09:41:45 +07:00
ef55a918d3
fix: correct HMAC feature decision — clarify Statuspage platform limitation
2026-04-09 09:37:19 +07:00
976a2594b7
fix: security and robustness improvements, add project docs
...
- Hash inputs in timingSafeEqual to prevent length leak side-channel
- Add quote escaping to escapeHtml for defense in depth
- Normalize chatId to Number in parseKvKey for type consistency
- Log Retry-After header on 429 rate limit responses
- Slim README to focused overview, move details to docs/
- Add docs/: system-architecture, setup-guide, feature-decisions
- Add documentation section and README guidelines to CLAUDE.md
2026-04-09 09:27:45 +07:00