نمونه کار — Intranet Messenger

پیام‌رسان سبک برای شبکه داخلی

اگه توی یه شرکت یا سازمان کار می‌کنی و به یه چت ساده برای دو نفر نیاز داری، Two Chat دقیقاً همینه. بدون سرور خارجی، بدون پیچیدگی — فقط نصب کن و چت کن.

ببین چه قابلیتایی داره
۲ کاربر همزمان
SSE ارتباط لحظه‌ای
PWA قابل نصب روی گوشی
MIT لایسنس آزاد

چیزایی که توش هست

از چت ساده متنی تا ضبط ویس و ارسال عکس — همه چیز توی یه پروژه سبک Node.js

💬

پیام متنی

تا ۲۰۰۰ کاراکتر متن بفرست. از فارسی و ایموجی پشتیبانی می‌کنه و با Enter ارسال می‌شه.

📸

ارسال عکس

JPEG، PNG، WebP، GIF — تا ۱۲ مگابایت. عکس‌ها خودکار با Sharp فشرده می‌شن تا حجم کم بشه.

🎙️

پیام صوتی

دکمه میکروفون رو بزن و حرف بزن. ویس با WebM ذخیره می‌شه و با موج صوتی پخش می‌شه.

↩️

ریپلای

روی هر پیامی می‌تونی ریپلای کنی. پیش‌نمایش پیام اصلی بالای composer نمایش داده می‌شه.

✏️

ویرایش پیام

اگه اشتباه تایپ کردی، پیام رو ویرایش کن. یه برچسب «ویرایش‌شده» اضافه می‌شه تا طرف مقابل بفهمه.

💕

ری‌اکشن

چهار تا ایموجی برای ری‌اکشن. روشون بزن و حذفشون کن — همه چیز لحظه‌ای آپدیت می‌شه.

✓✓

تیک خوانده‌شدن

وقتی طرف مقابل پیامت رو بخونه، تیک‌ها سبز می‌شن. از IntersectionObserver استفاده می‌شه.

⌨️

در حال تایپ

وقتی طرف مقابل در حال تایپ باشه، زیر اسمش «در حال تایپ...» نمایش داده می‌شه.

🟢

آنلاین / آفلاین

وضعیت آنلاین بودن با TTL کار می‌کنه. وقتی تب مرورگر فعال باشه، presence آپدیت می‌شه.

📅

تاریخ شمسی

بین پیام‌های روزهای مختلف، جداکننده تاریخ شمسی نمایش داده می‌شه با locale فارسی.

🖼️

آرشیو رسانه

یه پنل جداگانه همه عکس‌ها و ویس‌ها رو نشون می‌ده. روش بزنی مستقیم می‌ری پیام مربوطه.

🎨

استیکر محلی

استیکرها از فایل manifest محلی لود می‌شن. نیازی به CDN خارجی نیست.

📱

قابل نصب روی گوشی

با PWA می‌تونی Two Chat رو مثل یه اپ روی گوشیت نصب کنی. نوتیفیکیشن هم می‌ده.

🔐

ورود دو کاربره

فقط دو تا کاربر مجاز از قبل تعیین شدن. هر کسی با اسم کاربری خودش وارد می‌شه.

💾

ذخیره محلی

پیام‌ها توی یه فایل JSON ذخیره می‌شن. فایل‌ها هم توی پوشه uploads. خودش manage می‌کنه.

ارتباط لحظه‌ای با SSE

بدون WebSocket، سبک و ساده — Server-Sent Events کافیه

رویدادهایی که لحظه‌ای ارسال می‌شن

سرور به همه کلاینت‌ها خبر می‌ده وقتی اتفاقی بیفته:

  • message:new — یه پیام جدید اومده
  • message:update — کسی پیامش رو ویرایش کرد یا ری‌اکشن گذاشت
  • message:read — پیامت خوانده شد
  • presence:update — کسی آنلاین یا آفلاین شد
  • typing:update — کسی داره تایپ می‌کنه
  • ping — سیگنال زنده بودن هر ۳۰ ثانیه
user1
آنلاین
user2
آفلاین
user2
داره تایپ می‌کنه...

ری‌اکشن تعاملی

روی ایموجی‌ها بزن — مثل هر اپ چتی، ری‌اکشن روی پیام ظاهر می‌شه:

  • POST /api/messages/:id/reactions
  • دوبار بزنی حذف می‌شه (toggle)
  • لحظه‌ای broadcast می‌شه به طرف مقابل
این پیام رو دوست داری؟

آرشیو رسانه

دکمه گالری توی هدر — همه عکس‌ها و ویس‌ها رو یه جا ببین:

  • گرید سه‌ستونه برای عکس‌ها
  • لیست ویس با دکمه پخش
  • بزنی روی هر کدوم، مستقیم می‌ری اون پیام
🌆
🏔️
🌸
🎨
📷

با چی ساخته شده

Backend سبک Node.js و Frontend بدون فریم‌ورک — همه چیز دست‌ساز

Node.js Express 5 SSE Sharp Multer Helmet express-session express-rate-limit Vanilla JS Service Worker RTL / fa-IR
مرورگر — index.html + app.js
REST API
SSE /api/events
Express — server.js
data/messages.json
uploads/

ساخته شده برای شبکه داخلی

امنیت پایه برای استقرار LAN — با توصیه HTTPS و فایروال

🛡️

Helmet + CSP

Content Security Policy و هدرهای امنیتی استاندارد. x-powered-by غیرفعال شده.

⏱️

Rate Limiting

۱۶۰ درخواست در دقیقه — جلوی اسپم و درخواست‌های مشکوک رو می‌گیره.

📁

اعتبارسنجی آپلود

فقط فایل‌های مجاز آپلود می‌شن. حداکثر ۱۲MB و نام فایل sanitize می‌شه.

🔒

Session امن

HttpOnly cookie با SameSite. توی production حتماً از HTTPS استفاده کن.