- กำลังพัฒนาฟีเจอร์รองรับ Exchange ใน Thunderbird โดยใช้ภาษา Rust
- ใน ESR (Extended Support) เวอร์ชันถัดไปที่มีกำหนดออกในเดือนกรกฎาคม จะรองรับเฉพาะอีเมลก่อนเป็นลำดับแรก และฟังก์ชันปฏิทินกับสมุดรายชื่อจะรองรับภายหลัง
- Brendan Abolivier, Ikey Doherty และ Sean Burke กำลังดำเนินงานนี้อยู่
เหตุผลที่เลือกใช้ภาษา Rust
- Thunderbird เป็นโปรเจ็กต์เก่าที่มีโค้ด C++ แบบดั้งเดิมจำนวนมาก
- สำหรับการพัฒนาฟีเจอร์ใหม่ จำเป็นต้องมีภาษาที่ทรงพลังและบำรุงรักษาได้ดีในระยะยาว
- Rust มีข้อดีด้านความปลอดภัยของหน่วยความจำ ประสิทธิภาพ ความเป็นโมดูลาร์ และ ecosystem
- โครงสร้างพื้นฐาน CI ที่ใช้ร่วมกับ Firefox รองรับ Rust อยู่แล้ว
- สามารถเรียกใช้งานข้ามระหว่าง Rust, C++ และ JavaScript ได้ผ่าน XPCOM
- สามารถใช้เครื่องมืออันทรงพลังของ Rust เพื่อปรับปรุงสถาปัตยกรรมแบบเดิมได้
- Rust รองรับหลายแพลตฟอร์ม จึงสามารถนำกลับไปใช้กับโปรเจ็กต์อื่น เช่น Thunderbird for Android/K-9 Mail ได้
ความท้าทายที่พบ
- โค้ดเดิมมีแพตเทิร์น asynchronous จำนวนมากที่ไม่เข้ากับ Rust ได้ดีนัก
- ในโค้ดเบสของ Firefox และ Thunderbird มีฟังก์ชันจำนวนมากที่ยังไม่มี Rust bindings
- ระบบบิลด์ของ Thunderbird ใช้วิธีนำโค้ด Firefox เข้ามาเป็น subtree ทำให้รวมโค้ด Rust ได้ยาก
- เนื่องจากไม่สามารถซ้อน Cargo workspace กันได้ จึงแก้ไขด้วยการปรับเครื่องมือบิลด์
mach
- XPCOM เดิมถูกออกแบบมาสำหรับ C++ จึงต้องใช้ boilerplate จำนวนมากเมื่อใช้งานจาก Rust
- แก้ไขโดยเขียนลอจิกตามโปรโตคอลด้วย Rust และสร้าง bridge class ด้วย C++ เพื่อเชื่อมเข้ากับโค้ดเดิม
การพัฒนาการรองรับ Exchange ด้วย Rust
- API ของ EWS (Exchange Web Services) สื่อสารผ่าน HTTP และใช้คำขอ/คำตอบในรูปแบบ XML
- สำหรับการส่งคำขอ HTTP ใช้คอมโพเนนต์เครือข่าย necko ของ Firefox แต่การเปิดให้ใช้ผ่าน XPCOM ทำให้ใช้งานไม่สะดวก
- สร้าง crate
xpcom_async เพื่อแปลงงาน asynchronous ของ XPCOM ให้เป็นไวยากรณ์ async/await ของ Rust
- สร้าง crate
moz_http เพื่อมอบ HTTP client API สไตล์ reqwest
- เดิมตั้งใจจะใช้ crate ที่มีอยู่แล้วสำหรับจัดการคำขอ/คำตอบ XML แต่ไม่สามารถตอบโจทย์ความต้องการของ EWS ได้
- สร้าง crate
xml_struct เพื่อให้แมปกันได้อย่างตรงไปตรงมาระหว่างโครงสร้างข้อมูลของ Rust กับ XML
- สร้าง crate
ews เพื่อมอบ type definitions สำหรับ EWS และ XML serialization/deserialization API ที่อิงบน xml_struct และ serde
แผนในอนาคต
- กำลังขยายการทดสอบแบบอัตโนมัติก่อนเดินหน้าพัฒนาฟีเจอร์หลักถัดไป
- นอกจาก unit test แล้ว ยังสร้าง mock EWS server เพื่อทำ integration test อยู่ด้วย
- กำลังปรับปรุงการจัดการข้อผิดพลาด
- เนื่องจากพฤติกรรมข้อผิดพลาดของ EWS มีเอกสารไม่ชัดเจน จึงจำเป็นต้องจัดการหลายชั้น ตั้งแต่ระดับโปรโตคอลไปจนถึงระดับที่ต้องให้ผู้ใช้เข้ามาจัดการ
- กำลังขยายการรองรับโปรโตคอล EWS และเชื่อมต่อเข้ากับ UI ของ Thunderbird
- ล่าสุดได้พัฒนาฟีเจอร์เพิ่มบัญชี EWS, ซิงก์ลำดับชั้นโฟลเดอร์จากเซิร์ฟเวอร์ระยะไกล และแสดงโฟลเดอร์ใน UI เสร็จแล้ว
- ขั้นต่อไปคือการดึงรายการข้อความจากเซิร์ฟเวอร์ระยะไกล และทำให้ฟีเจอร์รองรับเมลขาออกของ Thunderbird ใช้งานได้แบบทั่วไปมากขึ้น
- จะทำเอกสารสำหรับทุกงานเพื่อให้บำรุงรักษาได้ดีในอนาคต
- รวมถึงกำลังจัดทำเอกสารเกี่ยวกับสถาปัตยกรรมโปรโตคอลเมลเดิมของ Thunderbird และทิศทางการปรับปรุง
ความเห็นของ GN⁺
- การนำ Rust เข้ามาใช้ใน Thunderbird เพื่อปรับสถาปัตยกรรมเก่าให้ทันสมัย ถือเป็นการเปลี่ยนแปลงที่น่าชื่นชมอย่างมาก ทีมงานพยายามอย่างหลากหลายเพื่อใช้ประโยชน์จากข้อดีของ Rust โดยยังคงความเข้ากันได้กับโค้ดเบสเดิม
- crate อย่าง
xpcom_async, moz_http, xml_struct, ews ที่สร้างขึ้นระหว่างกระบวนการพัฒนา น่าจะนำไปใช้ประโยชน์กับโปรเจ็กต์อื่นนอกเหนือจาก Thunderbird ได้ด้วย
- อย่างไรก็ตาม สถาปัตยกรรมเก่าของ Thunderbird และระบบบิลด์ที่พึ่งพาโค้ดเบสของ Firefox อย่างมาก อาจยังเป็นอุปสรรคต่อการนำ Rust เข้ามาใช้ต่อไปในอนาคต ในระยะยาวจึงน่าจะต้องมีความพยายามเพื่อแก้ปัญหาเหล่านี้ด้วย
- EWS เป็นบริการอีเมลที่ถูกใช้อย่างแพร่หลายในองค์กรและสถาบันการศึกษา ดังนั้นหาก Thunderbird รองรับ EWS ได้ ก็จะช่วยขยายฐานผู้ใช้ได้อย่างมาก แต่ในขณะเดียวกัน EWS ก็เป็นโปรโตคอลปิดของ Microsoft จึงอาจมีความยากในการนำมาใช้งานในโปรเจ็กต์โอเพนซอร์ส
- โดยรวมแล้ว ดูเหมือนว่าโปรเจ็กต์ Thunderbird กำลังใช้โอกาสจากการนำ Rust เข้ามาเป็นแรงผลักดันในการปรับสถาปัตยกรรมให้ทันสมัยและขยายฟังก์ชันอย่างจริงจัง ในฐานะหนึ่งในไคลเอนต์อีเมลโอเพนซอร์สตัวแทนสำคัญ ความก้าวหน้าของ Thunderbird จะเป็นประโยชน์อย่างมากต่อผู้ใช้
1 ความคิดเห็น
ความคิดเห็นบน Hacker News