Table of Contents
מדוע WebRTC ו- JavaScript אידיאליים לעריכה שיתופית
בניית עורך טקסט שיתופי בזמן אמת הפכה לאתגר סימן ההיכר עבור מפתחים המבקשים לדחוף את הגבולות של מה הדפדפן יכול לעשות. בעוד פתרונות רבים מסתמכים על שרתים מרכזיים להעביר שינויים, WebRTC (Web Real-Time תקשורת) מציעה אלטרנטיבה משכנעת על ידי כך המאפשר חיבורים ישיר עמיתים אל-peer. גישה זו מפחיתה את עלויות הלב, השרתים, ומעניקה למשתמשים ניסיון עריכת מבוזר באמת, בשילוב עם תוכניות לוגיות מורכבות.
במדריך זה, תלמד כיצד לאדריכל עורך משותף באמצעות ערוצי נתונים של WebRTC, ליישם טרנספורמציה מבצעית לפתרון סכסוכים, ולשלב משטח עריכת טקסט עשיר.התוצאה הסופית תהיה כלי יקרי ייצור שמשתמשים מרובים יכולים לערוך בו זמנית עם סף אפס.
הבנת טכנולוגיות הליבה
WebRTC ב- Depth
(ב-RTC הוא אוסף של APIs המאפשר לדפדפנים להחליף נתונים בזמן אמת ללא שרתי מתווכים.הוא מורכב משלושה מרכיבים עיקריים: FLT:0;0;0)MediaStreamveFLT:1 עבור אודיו ווידאו, (FLT:2RT) CPeconctionFLT 3 עבור הקמת וניהול קשרים עמיתים, ו-FLT:4CDataCnelation מציעה פרוטוקול הפעלה אמין (TransPerfectation Data) עבור טקסט משותף.
טעות נפוצה אחת היא ש- WebRTC דורש תשתית מורכבת של שרת.למעשה, אתה רק צריך מנגנון קל משקל להחלפת תיאורים של ישיבות ומועמדים ל-ICE. ברגע שלעמיתים יש את הפרטים האלה, הם מתחברים ישירות.זה באופן דרמטי לפשטות כי השרת שלך מטפל רק בשקית היד הראשונית, לא התנועה המעודכנת של עריכה.
JavaScript - Orchestrator
JavaScript מטפל בכל דבר מלכידת קלט משתמש לניהול מצב המסמך.אתה צריך ליישם מאזינים לאירועים מרכזיים (הקטיפה, קלט, פסטה) ולתרגם אותם לפעילות מובנית.המבצעים הללו הם אז מסודרים ונשלחים על ערוץ הנתונים.השפה ו- #8217; לולאת אירוע לא חסימת עובד כאן במיוחד כי זה יכול תור ותהליך בעריכת ללא חסימת חוט UI.
חיבור WebRTC
תגית: The Signalling Server
למרות ש- WebRTC הוא peer-to-peer, עמיתים חייבים בתחילה לגלות אחד את השני.זה נעשה באמצעות שרת איתות, אשר ניתן לבנות עם Node.js ו- WebSockets. שרת האיתות אחראי על החלפת שלושה סוגים של הודעות: תיאורים של מפגשים (offers ותשובות) ו- ICE מועמדים.כאן הוא זרימה מינימלית:
- משתמש A יוצר RTCPeerConnection ומייצר הצעה.
- ההצעה נשלחת לשרת האיתות, אשר מעבירה אותו למשתמש B.
- המשתמש B מקבל את ההצעה, יוצר תשובה ושולח אותו בחזרה.
- במהלך תהליך זה, שני הצדדים מחליפים מועמדים ל-ICE כדי לגלות את הנתיב הטוב ביותר ברשת.
לאחר השלמת החליפין, עמיתים יכולים לפתוח ערוצי נתונים.ניתן למצוא יישום התייחסות ב-FLT:0AppRTC GitHub repositoryFLT:1 , שים לב כי לעולם לא צריך לחשוף את שרת האיתות שלך לאינטרנט הציבורי ללא אימות; אחרת, כל אחד יכול להצטרף לפגישת העריכה שלך.
הקמת ערוץ נתונים
לאחר הקמת RTCPeerConnection, אתה יוצר ערוץ נתונים עם "יצירת נתונים Channel" (העורך בשיתוף, אתה רוצה אספקה אמינה, מסודרת, שהיא מצב ברירת המחדל.הקוד נראה כך:
const dataChannel = peerConnection.createDataChannel('collabEditor', {
ordered: true
});
הקשב ל'ערוץ נתונים' בצד המרוחק כדי לקבל את הפניה הערוץ. ברגע ששני הצדדים יש טיפול בערוץ הנתונים, באפשרותך לשלוח מטענים JSON המייצגים את ה- Edits.כל תשלום צריך לכלול מזהה משתמש ייחודי, תזמון, ואת סוג הניתוח (אירט, למחוק או שינוי).
יישום עורך הטקסט
בחירת העורף הנכון
הגישה הפשוטה ביותר היא להשתמש ב-'ראהפל:0': עם זאת, ניתן לנסח זאת באופן ידוע כי היא מייצרת HTML בלתי צפוי בדפדפנים: בחירה טובה יותר היא ספרייה כמו FLT:1 Quick Quick.jshilFLT:2, המספקת מודל מתואם הנקרא FLT 3:Parchmentmental: 4, you can use in alierativelyer; and alieratively, and aligation to the rightly, and alier.
עבור הפרויקט הזה, אנו נשתמש ב- Quill כי הוא מפשט את המורכבות של תוכן שניתן לעריכה, תוך שהוא עדיין נותן לנו גישה לתבנית הגלום דלה, אשר קל לסידור ולהעביר.
החלפת עריכת דין ומשלוח שינויים
קוויל פולט אירוע "שינוי טקסט" בכל פעם שהמסמכים משתנים.ניתן להקשיב לאירוע זה ולשלוח את דלה לכל בני הזוג המחוברים:
quill.on('text-change', function(delta, oldDelta, source) {
if (source === 'user') {
dataChannel.send(JSON.stringify(delta));
}
});
בדיקת "מקור" מבטיחה כי רק שידור שינויים שבוצעו על ידי המשתמש המקומי, לא שינויים אשר הוחלו מרחוק.זה מונע לולאות אינסופיות שבו עריכה נכנסת גורם עוד עריכה.
קשר עם SynSyncization וסכסוכים
טרנספורמציה
כאשר שני משתמשים עורכים את אותו מסמך בו זמנית, סכסוכים הם בלתי נמנעים.לדוגמה, משתמש A מוסיף דמות בעמדה 5 בזמן המשתמש B מוחק מיקום 3.ללא אסטרטגיית החלטה, המסמך הסופי יתבדל.טרנספורמציה תפעולית (OT) הוא אלגוריתם מוכח המחזק מסמך עקבי על ידי שינוי פעולות נגד זה. OT פועל על ידי שמירה על מספר עבור כל פעולה והתאמה של פעולות מתקרבות על בסיס המצב הנוכחי.
יישום OT מאפס הוא מורכב במקום, לשקול שימוש בספריה כמו FLT:0ot.jssph 1:1 או לוגיקה של טרנספורמציה מובנה ב ProseMirror.הספרות האלה מטפלות במרידות כבדות מתמטית כך שתוכל להתמקד באינטגרציה.
CRDTs כאלטרנטיבה
(הופנה מהדף Replicated Data Types (CRDTs) הם גישה נוספת אשר צברה פופולריות.בניגוד ל-OT, CRDTs אינם דורשים שרת מרכזי או הפעלה צו; כל אחד מהעמיתים מחזיק עותק מקומי ומיישב הבדלים באופן אוטומטי. Libraries כמו FLT:0AutomergeFLT:1 או FLT:2YJsFLT 3.3FLT, הטמיעו אינטגרציה והצעות לשילוב פופולרי, שכמעט, לעומת זאת, הוא גורם ל-T.
הבחירה בין OT ו-CRDT תלויה במקרה השימוש שלך. OT בדרך כלל יש זיכרון נמוך יותר מעל פני הראש ועובד היטב עבור מסמכים טקסט בלבד. CRDTs מתאימים יותר למבנים מורכבים נתונים ותרחישים עריכת לא מקוון.
בינגו ו- Throttling
גם עם פתרון סכסוכים מושלם, שליחת כל מפתחי הרשת יוצרת תנועה מיותרת ויכולה להציף עמיתים. ליישם מנגנון אצווה שאוסף עריכה לפרק זמן קצר (50-100 מ"מ) ושולח אותם כמבצע יחיד.זה מקטין את פני השטח ללא הקרבת תחושה בזמן אמת.You יכול להשתמש במלכודת פשוטה על אירוע שינוי הטקסט:
let batch = [];
quill.on('text-change', function(delta) {
batch.push(delta);
clearTimeout(batchTimer);
batchTimer = setTimeout(() => {
dataChannel.send(JSON.stringify(batch));
batch = [];
}, 50);
});
אדריכלות: Scale and Reliability
ניהול קשרים
אם יותר משני משתמשים להצטרף לאותו מסמך, אתה נתקל בתרחיש רשתי שבו כל אחד מהעמיתים חייב לפתוח חיבור לכל עמית אחר. זה בקנה מידה גרוע כי מספר החיבורים גדל באופן חד-משמעי עם מספר המשתתפים.עבור מפגשים עם יותר מ- 5-6 משתמשים, לשקול באמצעות יחידת מעבר בחירה (SFU) או יחידת בקרת Multipoint (MCU) להעביר נתונים דרך השרת, אתה יכול לעצב אחד אחר דרך השידור.
המדינה Persistence
WebRTC הוא אפסי על ידי עיצוב.אם משתמש מרענן את הדף, הם מאבדים את כל מצב החיבור ואת המסמך חוזר למצבו הראשוני.כדי למנוע אובדן נתונים, אתה צריך שכבת התמדה בצד השרת.אחסן את מצב המסמך במסד נתונים כגון PostgreSQL או Redis לאחר כל ערכת של עורכים.כאשר משתמש חדש מצטרף, הם מביאים את המדינה הנוכחית מן השרת לפני המחבר דרך WebC נותן גישה היברידית של עריכת קודר זה.
שיקולים ביטחוניים ופרטיות
קידוד Data Channels
ערוצי נתונים WebRTC מוצפנים באופן אוטומטי עם DTLS (Datagram Transport Layer Security) זה אומר התוכן של העריכה שלך בטוח מ eavesdropping אפילו כאשר היא עוברת דרך התאמות רשת לא ידועות.עם זאת, הערוץ המצביע אינו מוצפן על ידי ברירת מחדל, כך שאתה חייב לשרת אותו על HTTPS ו- WSS (WebSockets Secure Secure).
בקרת גישה וגישה
רק משום שעמית יכול להתחבר לא אומר שיש לערוך גישה. ליישם מערכת אימות מבוססת אסיקן שבה משתמשים מקבלים אסימוני חתום מהשרת לפני שהם יכולים ליזום חיבור WebRTC.הסימון צריך להכיל את המשתמש & #8217; תפקיד (מדיטציה, צופה, מנהל) ואת המסמך שהם מורשים לגשת אליו.
מניעת התקפות הזריקה
אם אתה משתמש ב-HTML שרירותי, משתמשים זדוניים יכולים להזריק HTML שרירותי, כולל תסריטים.גם עם עורך סניטיס כמו קוויל, עליך לאמת את כל ה-Esttas המתקרבים בסוף המקבל. Quill ’ פורמט דלה הוא קפדני, אבל אתה יכול להוסיף צעד נוסף של סניטיסה המסיר כל תכונות בלתי צפויות.
בדיקות ווויכוח
סימול מספר משתמשים
בדיקה של עורך שיתופי דורשת לפחות שני מקרים של הדפדפן. השתמש בחלונות Incognito או פרופילי דפדפן שונים כדי לדמות משתמשים נפרדים.כלי כמו FLT:0BrowserStackveFLT:1 לאפשר לך לבחון בדפדפנים שונים ובה בעת.לקדיש תשומת לב מיוחדת למקרים כגון מפתחות מתקדמים מהירים, פסים במקביל והפרעות רשת.
מעקב אחר ערוץ הבריאות
ערוצי נתונים של WebRTC יכולים לרדת עקב שינויים ברשת או NAT. ליישם מנגנון פעימות לב שולח הודעה קטנה של 'ping' כל 5 שניות.אם לא התקבלה תגובה בתוך 10 שניות, נניח שהקשר מת ולנסות לשקם אותו מחדש. Log all המדינה משתנה למעקב אחר כך שתוכל לזהות דפוסים בכישלונות חיבור.
תוצאות Optimisations
דיכוי
לערוך טקסט הם קטנים, אבל כאשר משתמשים רבים עורכים, נפח ההודעות יכול להוסיף.הלחיצת פרופיל על ערוץ הנתונים אם הספריה שלך תומכת בו.אתה יכול גם לדחוס את ה-JSON Payload על שכבת היישום באמצעות ספרייה כמו "pako" (zlib ב- JavaScript).זה מקטין את צריכת רוחב הפס עד 80% עבור דפוסים חוזרים.
סינכרונל
לא כל עריכה צריכה להיות נשלחת לכל עמית.לדוגמה, כאשר משתמש הוא מהיר, רק המדינה הסופית לאחר עניינים מרכזיים, לא כל דמות ביניים. השתמש במנגנון זיהוי של זיהוי idle: אם המשתמש הוא הקלדה באופן פעיל, לטבול את השינויים ולשלוח רק את דלטה מאוחדת כאשר הם עוצרים באופן דרסטי.זה מפחית את מספר ההודעות תוך שמירה על חוויה חלקה.
Lazy Rendering
אם המסמך הופך גדול (מאות עמודים), ביצוע התוכן כולו עבור כל עריכה נכנסת יכול לגרום ל- UIJnk. יישום לגלול וירטואלי או הדמיה כך שרק החלק הנראה של המסמך הוא rendered.זה חשוב במיוחד עבור מכשירים ניידים עם כוח עיבוד מוגבל.
המונחים: production Readiness
בחירת שרת אותות
(הייצור, אתה צריך שרת איתות חזק שיכול להתמודד עם אלפי קשרים מקבילים. Node.js עם socket.io הוא בחירה פופולרית בגלל הסקאלות שלה ומנגנוני נפילה מובנה.If youמעדיפים פתרון מנוהל, לשקול שירותים כגון FLT:0StreamFLT:1 או FLT:2TwilioFLT3, אשר מציעים WebRT של תיבה.
בדיקות עם רשתות אמיתיות
בדיקות מקומיות מסתירות את השקיפות וההפסד של הרשת.התערו את העורכת שלכם לסביבה מלחיצה ומבחן עם עמיתים ביבשות שונות.שימוש בכלים כמו FLT:0;0; WiresharkofFLT:1 כדי לנתח את תעבורת WebRTC וזיהוי צווארי בקבוק.לתשומת לב לתהליך בחירת המועמדים של ICE; כמה מהם עשויים לקחת מסלולים ארוכים בשל שרתי STUN / NUR.
עקבו אחרי and Logging
(הופנה מהדף WebRTC אירועים: שינויי מצב חיבור, ערוץ נתונים פתוח/סגור וערוך פעולות. השתמש בשירות מרכזי של כניסה כמו FLT:0DatadogsFLT:1 או FLT:2LogglyFLT 3 כדי לאסוף יומני מכל בני הזוג.
מסקנה
בניית עורך טקסט שיתופי בזמן אמת עם JavaScript ו- WebRTC היא מאמץ מתגמל המרחיב את ההבנה של רשתות, ניהול המדינה וביצועי UI. על ידי מינוף הכוח של קשרים עמיתים אל-peer, אתה יכול ליצור חוויה עריכה שמרגישה מיידית וסקאלות ללא תשתית שרת יקר.
כשאתם מתקדמים קדימה, שקול את העסקאות בין אדריכלות מבוזרת לחלוטין היברידית.עבור קבוצות קטנות, WebRTC טהור עם שרת אותות קל משקל הוא אידיאלי. עבור פריסות גדולות יותר, הוספת שכבת שרת עבור התמדה ובחירת קדימה נותן לך את השליטה שאתה צריך.