01 · poll-board · порт 8119

Голосуем
вживую

Создайте опрос на 2-10 вариантов с таймером, отправьте ссылку и смотрите, как растут столбики: результаты приходят по SSE или WebSocket без перезагрузки. Один человек голосует один раз, накрутка режется токеном и хэшем адреса.

Создать опрос openapi.yaml

02 · создание

Новый опрос

Демо-вопрос помечен «демо», настоящих людей за ним нет.

03 · голосование

Опрос

Создайте опрос выше или откройте ссылку вида /#ID.

04 · как устроено

Против накрутки

Токен

Браузер получает подписанный токен голосующего в cookie HttpOnly. Подпись HMAC, подделать нельзя, повторный бюллетень отклоняется.

Хэш IP

Адрес хранится только как HMAC с секретной солью и привязкой к опросу. Сам адрес не пишется ни в базу, ни в логи. С одного хэша допускается ограниченное число бюллетеней.

Порядок событий

Каждое событие несёт номер seq, он растёт на единицу. Страница игнорирует устаревшие кадры, так что при переподключении числа не откатываются.

05 · API

То же из консоли

curl -s localhost:8119/api/polls -H 'content-type: application/json' \
  -d '{"question":"Чай или кофе?","options":["Чай","Кофе"],"ttl_seconds":3600}'

curl -s -c jar -b jar localhost:8119/api/polls/<id>/vote \
  -H 'content-type: application/json' -d '{"choices":[0]}'

curl -N localhost:8119/api/polls/<id>/events