Skip to content

WebChat

توفر کانال WebChat ابزار دردشة مدمجة وقابلة للتضمين تتصل بعامل Triggerfish از طریق WebSocket. صُممت للتفاعخیرت با العمخیرء وابزارها پشتیبانی، یا هر سيناريو تريد دره تقديم تجربة دردشة از طریق الويب.

طبقه‌بندی پیش‌فرض

انجام می‌شود طبقه‌بندی WebChat به‌صورت پیش‌فرض كـ PUBLIC. این پیش‌فرض ثابت لسبب وجيه: زوار الويب خیر يُعاملون هرگز كمالك. هر پیام از نشست WebChat تحمل Taint PUBLIC بغض النظر عن پیکربندی.

الزوار ليسوا مالكين هرگز بخخیرف کانال‌ها الأخرى حيث انجام می‌شود التحقق از هویت المالك

ببارّف المستخدم یا رقم الهاتف، يعيّن WebChat isOwner: false لتمام اخیرتصاخیرت. این يعني أن عامل لن ينفذ هرگز یاامر روی مستوى المالك از نشست WebChat. این قرار أازي متعمد -- نمی‌توانك التحقق از هویت زائر ويب مجهول. :::

راه‌اندازی

الخطوة 1: تكوين Triggerfish

أضف کانال WebChat به triggerfish.yaml:

yaml
channels:
  webchat:
    port: 8765
    allowedOrigins:
      - "https://your-site.com"
الخيارالنوعالزامیالوصف
portnumberخیرازفذ خادم WebSocket (پیش‌فرض: 8765)
classificationstringخیرسطح طبقه‌بندی (پیش‌فرض: PUBLIC)
allowedOriginsstring[]خیرأصول CORS المسموح بها (پیش‌فرض: ["*"])

الخطوة 2: تشغيل Triggerfish

bash
triggerfish stop && triggerfish start

يبدأ خادم WebSocket باخیرستماع روی الازفذ المُعدّ.

الخطوة 3: توصيل ابزار الدردشة

اتصل بنقطة نهاية WebSocket از تطبيق الويب الخاص بك:

javascript
const ws = new WebSocket("ws://localhost:8765");

ws.onopen = () => {
  console.log("Connected to Triggerfish");
};

ws.onmessage = (event) => {
  const frame = JSON.parse(event.data);

  if (frame.type === "session") {
    // الخادم عيّن بارّف نشست
    console.log("Session:", frame.sessionId);
  }

  if (frame.type === "message") {
    // رد عامل
    console.log("Agent:", frame.content);
  }
};

// إرسال پیام
function sendMessage(text) {
  ws.send(JSON.stringify({
    type: "message",
    content: text,
  }));
}

چگونه کار می‌کند

تدفق اخیرتصال

  1. يفتح عميل مرورگر اتصال WebSocket به الازفذ المُعدّ
  2. يُرقّي Triggerfish درخواست HTTP به WebSocket
  3. يُولّد بارّف نشست فريد (webchat-<uuid>)
  4. يرسل الخادم بارّف نشست للعميل در إطار session
  5. يرسل ويستقبل العميل إطارات message بصيغة JSON

تنسيق إطار پیام

تمام الپیام‌ها هي كائنات JSON باین الهيهر:

json
{
  "type": "message",
  "content": "Hello, how can I help?",
  "sessionId": "webchat-a1b2c3d4-..."
}

أنواع الإطارات:

النوعاخیرتجاهالوصف
sessionاز الخادم به العميليُرسل عند اخیرتصال با بارّف نشست المُعيّن
messageكخیر اخیرتجاهينپیام دردشة بمحتوى نصي
pingكخیر اخیرتجاهيننبض للحفاظ روی اخیرتصال
pongكخیر اخیرتجاهينپاسخ نبض الحفاظ روی اخیرتصال

مدیریت نشست

هر اتصال WebSocket يحصل روی جلسته الخاصة. عند إغخیرق اخیرتصال، تُزال نشست از خريطة اخیرتصاخیرت النشطة. خیر يوجد استئناف للنشست -- إذا انقطع اخیرتصال، يُعيّن بارّف نشست جديد عند إعادة اخیرتصال.

فحص الصحة

يستجيب خادم WebSocket همچنین لدرخواستات HTTP العادية بفحص صحة:

bash
curl http://localhost:8765
# پاسخ: "WebChat OK"

این مدرد لفحوصات صحة موازن الحمل والمراقبة.

مؤشرات الكتابة

يرسل ويستقبل Triggerfish مؤشرات كتابة از طریق WebChat. عندما يعالج عامل درخواستاً، يُرسل إطار مؤشر كتابة به العميل. يمكن لخیربزار عرضه لإظهار أن عامل يفكر.

اعتبارات أازية

  • تمام الزوار خارجيون -- isOwner همیشه false. لن ينفذ عامل یاامر المالك از WebChat.
  • Taint PUBLIC -- هر پیام ملوثة بـ PUBLIC روی مستوى نشست. نمی‌توان للعامل الوصول به یا إعادة بيانات فوق طبقه‌بندی PUBLIC در نشست WebChat.
  • CORS -- كوّن allowedOrigins لتقييد النطاقات التي يمكنها اخیرتصال. پیش‌فرض ["*"] يسمح بهر أصل، وهو ازاسب للتطوير لكن باید تقييده در الإنتاج.

قيّد الأصول در الإنتاج لنشر الإنتاج، حدد همیشه

الأصول المسموح بها صراحة:

yaml
channels:
  webchat:
    port: 8765
    allowedOrigins:
      - "https://your-domain.com"
      - "https://app.your-domain.com"

تغيير طبقه‌بندی

بینما انجام می‌شود طبقه‌بندی WebChat به‌صورت پیش‌فرض كـ PUBLIC، می‌توانید تقنياً تعيينه لمستوى مختلف. وبا آن، بما أن isOwner همیشه false، يظل طبقه‌بندی الفعّال لتمام الپیام‌ها PUBLIC بسبب قانون طبقه‌بندی الفعّال (min(channel, recipient)).

yaml
channels:
  webchat:
    port: 8765
    classification: INTERNAL # مسموح، لكن isOwner خیر يزال false

المستويات الصالحة: PUBLIC، INTERNAL، CONFIDENTIAL، RESTRICTED.