DevNotes Live
6 subscribers
84.2K photos
12K videos
195 files
35.4K links
Автоматический агрегатор IT ресурсов в Telegram (@devnotes_robot)
Информация: https://t.me/devnotes_live/121
Download Telegram
Forwarded from Shock Design
Вдохновение новым дизайном сухого молока Them 1888 от датского агентства Simply.

📙 Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Shock Design
Forwarded from Адовый UX
Если вы увидели, что одну из ваших карт захватил некий Нэсп Д., не пугайтесь

Это просто бюрократическая аббревиатура, оформленная, как имя и фамилия
Forwarded from Адовый UX
👩‍💻 HTTP-ответ с таймером самоуничтожения

Реализуйте простой HTTP-сервер на Node.js, который возвращает уникальные одноразовые ссылки (вида /once/abc123) и сам удаляет их после одного использования или по истечении 60 секунд — в зависимости от того, что наступит раньше.

При повторном доступе к использованной или истекшей ссылке сервер должен возвращать 410 Gone.

Поведение:

GET-запрос на /create создаёт новую одноразовую ссылку, возвращает её клиенту.

При первом запросе к этой ссылке (/once/<id>) возвращается " Valid link" и она становится недействительной.

Если никто не обратился к ссылке за 60 секунд — она автоматически удаляется, и возвращается "410 Gone" при попытке перейти.


Решение задачи🔽

const http = require('http');
const crypto = require('crypto');

const PORT = 3000;
const links = {}; // { id: { createdAt: timestamp, used: bool } }

function generateId() {
return crypto.randomBytes(6).toString('hex');
}

function cleanupLinks() {
const now =
Date.now();
for (const id in links) {
if (now - links[id].createdAt > 60000 || links[id].used) {
delete links[id];
}
}
}

setInterval(cleanupLinks, 5000); // чистим каждые 5 сек

const server = http.createServer((req, res) => {
const url = new URL(req.url, `http://${
req.headers.host}`);

if (url.pathname === '/create') {
const id = generateId();
links[id] = { createdAt:
Date.now(), used: false };
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(`/once/${id}`);
return;
}

const match = url.pathname.match(/^\/once\/([a-z0-9]+)$/);
if (match) {
const id = match[1];
const record = links[id];

if (!record || record.used || (
Date.now() - record.createdAt > 60000)) {
res.writeHead(410, { 'Content-Type': 'text/plain' });
res.end('🔒 410 Gone: Link expired or used');
} else {
links[id].used = true;
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(' Valid link');
}
return;
}

res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('404 Not Found');
});

server.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Адовый UX
Разрешено

Запрещено