- Frontend Framework: SvelteKit 2 עם Svelte 5
- Styling: TailwindCSS
- Type Safety: TypeScript
- API Integration: Server-Side API Calls
- State Management: Svelte 5 Runes ($state)
- Authentication: Form Actions + Server-Side Sessions
- Session Storage: Redis
- Testing: Playwright
- Logging: Pino
מכיל את כל הלוגיקה של קריאות ה-API בצד שרת:
loginToApi()- התחברות למערכת וקבלת טוקןlogoutFromApi()- התנתקות מהמערכתgetMessagesFromApi()- קבלת הודעות SMS כל הפונקציות מתקשרות עם השרת בכתובתhttps://www.call2all.co.il/ym/api/
הגדרות טיפוסים עבור TypeScript:
Message- מבנה של הודעת SMS (תאריך, שולח, תוכן, נמען)LoginResponse- מבנה של תשובת שרת להתחברותMessagesResponse- מבנה של תשובת שרת לבקשת הודעות
קומפוננטות משנה של האפליקציה:
קומפוננטת טופס התחברות:
- מציגה שדות שם משתמש וסיסמה
- תומכת ב-autocomplete
- מטפלת בשגיאות התחברות
- מעוצבת עם TailwindCSS
קומפוננטה להצגת הודעת SMS בודדת:
- מקבלת כ-prop את פרטי ההודעה
- מציגה תאריך, שולח, תוכן ונמען
- מעוצבת עם TailwindCSS בצורה נקייה ומרווחת
קומפוננטה להצגת רשימת הודעות:
- מקבלת כ-props את רשימת ההודעות ופונקציות לרענון והתנתקות
- מציגה כפתורי פעולה (רענון והתנתקות)
- מרנדרת את כל ההודעות באמצעות קומפוננטת Message
הדפים והניתוב של האפליקציה:
תבנית הבסיס של האפליקציה:
- מייבאת את קובץ ה-CSS הראשי
- מגדירה את כיוון הטקסט לימין לשמאל (RTL)
- מגדירה צבע רקע בסיסי
הדף הראשי של האפליקציה:
- מנהל את מצב ההתחברות באמצעות Form Actions
- מציג טופס התחברות או רשימת הודעות בהתאם למצב
- מטפל בשגיאות ומציג הודעות למשתמש
לוגיקת צד שרת:
- מנהל את קריאות ה-API
- מנהל את הסשן והטוקן
- מטפל בפעולות המשתמש (התחברות, התנתקות, רענון)
- שימוש ב-$state של Svelte 5 לניהול משתנים ריאקטיביים:
messages- רשימת ההודעותerror- הודעות שגיאה
- שימוש בסשן בצד שרת לשמירת הטוקן
-
התחברות:
- טופס עם שדות שם משתמש וסיסמה
- תמיכה ב-autocomplete
- הצגת שגיאות התחברות
- שמירת טוקן בסשן בצד שרת
-
הצגת הודעות:
- טעינה אוטומטית בהתחברות
- תצוגה מאורגנת ונקייה
- מידע מלא על כל הודעה
-
רענון הודעות:
- כפתור לטעינה מחדש
- עדכון אוטומטי של התצוגה
-
התנתקות:
- ניקוי טוקן וסשן
- חזרה למסך התחברות
שירותי צד שרת:
מודול התחברות ל-Redis:
- יצירת חיבור ל-Redis באמצעות Vercel KV
- ניהול החיבור והתאוששות משגיאות
מודול ניהול סשנים:
- יצירת סשנים חדשים
- שמירה ושליפה של נתוני סשן
- ניקוי סשנים בהתנתקות
מודול לוגים עם Pino:
- רישום פעולות משתמש
- רישום שגיאות מערכת
- לוגרים ייעודיים לכל רכיב (auth, db, api, redis)
- פורמט מובנה ללוגים
כלי עזר:
עזרים לטיפול בטפסים:
- ולידציה של שדות
- טיפול בשגיאות
- עיבוד נתונים
- קריאות API מתבצעות בצד שרת
- מערכת סשנים מבוססת Redis עם Vercel KV
- הפרדה בין אימות משתמש לטוקן API
- הצפנת סיסמה בתצוגה
- ניקוי נתונים בהתנתקות
- שכבת אבטחה נוספת עם שם משתמש וסיסמה למערכת
- לוגים מפורטים של פעולות משתמש
- שימוש ב-TailwindCSS לעיצוב מודרני ונקי
- תמיכה מלאה בעברית ו-RTL
- ממשק משתמש אינטואיטיבי
- התאמה למובייל (responsive)
- התקנת תלויות:
npm install - הרצת טסטים:
npm test - הגדרת קובץ .env עם הפרטים הבאים:
# API Credentials API_USERNAME=your_api_username API_PASSWORD=your_api_password # Client Credentials CLIENT_USERNAME=admin CLIENT_PASSWORD=123456 # API URL API_URL=https://www.call2all.co.il/ym/api/ - הרצת שרת פיתוח:
npm run dev - גישה לאפליקציה בדפדפן:
http://localhost:5173
הרצת המיגרציות על מסד ה-D1 המקומי (בטוחה להרצה חוזרת):
npm run db:migrate:local
messages אינה קיימת בייצור. יש להריץ ידנית, אחרי merge:
wrangler d1 migrations apply sms-inbox-db --remote
שלושה אנדפוינטים למכונה-מול-מכונה — סוכן אוטומטי עם מפתח API, בלי דפדפן ובלי סשן:
| אנדפוינט | שיטה | מה הוא עושה |
|---|---|---|
/api/messages |
GET | הודעות משני הספקים, מסוננות ומעודכנות (עם חנק) |
/api/numbers |
GET | רשימת מספרי הטלפון הזמינים (ימות + זדרמה) |
/api/sync |
POST | משיכה מכוונת מכל הספקים אל D1, מתעלמת מהחנק |
Authorization: Bearer <API_KEY> או X-API-Key: <API_KEY>. שרת בלי API_KEY מוגדר
מחזיר 503 (לא מעבר שקט). מפתח חסר/שגוי → 401.
| פרמטר | משמעות | הערות |
|---|---|---|
dest |
מספר יעד | כל פורמט (מקומי/בינלאומי) — ההשוואה דו-כיוונית |
sender |
מספר שולח | כל פורמט. לא חיפוש טקסט חופשי |
since |
חלון בשניות אחורה מעכשיו | מספר שלם אי-שלילי |
limit |
מספר תוצאות מקסימלי | ברירת מחדל 100 |
מקרי קצה:
limit=0הוא אפס תוצאות, ולא "בלי הגבלה".since=0מחזיר רשימה ריקה ("0 שניות אחורה" — אין חלון בכלל).- מספר בלי אף ספרה ב-
dest/sender(למשלabc) נכשל סגור ומחזיר רשימה ריקה, ולא את כל ההודעות. since/limitלא-תקינים (למשלabc,-1) מחזירים 400.
מבנה התשובה:
{
"messages": [...],
"count": 3,
"total": 57,
"synced": true,
"fetchedAt": "2026-08-20T21:05:00.000Z",
"errors": []
}synced/fetchedAt הם מה שמאפשר לסוכן שממתין לקוד להבדיל בין "אין הודעה חדשה"
(synced:false, אין הודעה כי אין מה למשוך שוב) ל"לא נמשך כלום" (synced:true
אבל שום דבר לא הגיע). errors מכיל שגיאות ספק שלא הפילו את הבקשה כולה (provider+message).
חנק המשיכה: כל קריאה מנסה קודם למשוך מהספקים, אבל שתי קריאות בתוך
REFRESH_THROTTLE_SEC שניות (ברירת מחדל 5) מייצרות משיכה אחת בלבד — כדי שלא
להציף את ה-API של ימות ב-polling תכוף. מקומית (Miniflare, תהליך אחד) החנק
מדויק-לשנייה. בייצור, Cloudflare KV הוא consistent-eventually בין colos —
כלומר החנק שם הוא best-effort, לא מובטח לשנייה. שני מצבי הכשל שלו זולים:
משיכה עודפת, או תשובה ישנה בשנייה. זה תכנון, לא באג.
משיכה מכוונת מכל הספקים אל D1 — מתעלמת מהחנק במכוון, ולכן מיועדת לקריאה מתוזמנת (Worker עם cron, סלייס נפרד) ולא ל-polling מקרי.
{ "inserted": 53, "fetchedAt": "2026-08-20T21:05:00.000Z", "errors": [] }insertedסופר רק שורות חדשות שנכנסו ל-D1 בקריאה הזאת —0הוא תשובה תקינה (לרוב אחרי הקריאה הראשונה, כיINSERT OR IGNOREלא סופר כפילויות).- קריאה עם כותרת
Originשאינה זהה למקור האתר מקבלת 403 מ-hooks.server.ts(בדיקת CSRF ידנית שכל מסלול ה-UI עובר בה) — לפני הראוט ולפני בדיקת המפתח.curlו-fetchשיוצא מ-Worker אינם שולחיםOrigin, ולכן המסלול המיועד עובד; אבל דפדפן ממקור אחר לא יוכל לקרוא לאנדפוינט הזה. זו השורה שתחסוך שעת דיבוג ל-Worker המתוזמן.
מחזיר { "numbers": ["0515131038", "0559661922"] }. לא מסנכרן ואינו נחנק —
שואל את זדרמה על מספרים, לא על הודעות.
הפרויקט כולל מערכת טסטים מקיפה עם Playwright:
טסטים למערכת ההתחברות:
- בדיקת התחברות תקינה
- בדיקת שגיאות התחברות
- בדיקת התנתקות
- הרצת כל הטסטים:
npm test - הרצת טסט ספציפי:
npm test tests/login.spec.ts - הרצה במצב UI:
npm run test:ui
- הגדרת Vercel KV (Redis):
- יצירת מופע Redis חדש ב-Vercel Dashboard
- העתקת פרטי החיבור (URL ו-Token) למשתני הסביבה:
KV_REST_API_URL=your_kv_url KV_REST_API_TOKEN=your_kv_token
- העלאת הפרויקט ל-Vercel
- הגדרת כל משתני הסביבה ב-Vercel Dashboard
- שם משתמש: admin
- סיסמה: 123456