Contribute At ws

Tossapon Nuanchuay
ntossapo
Published in
2 min readFeb 6, 2018

ws เป็น nodejs lib ที่ใช้งานอย่างแพร่หลาย น่าจะย่อมาจาก websocket น่าจะเป็น lib แรกๆ เลยที่เล่นเรื่อง websocket protocol ว่าง ๆ ลองเอา RFC ไปเคี้ยวเล่น

กำลังทำ websocket proxy เพื่อให้ puppeteer scale ได้และสามารถใช้ remote browser ได้ (เท่าที่อ่านเจอ chromium ไม่ได้ bind address เป็น global เพราะฉนั้นก็จะ connect TCP session จาก host อื่นไม่ได้) โดย puppeteer เนี่ย มันใช้ ws ในการสื่อสารกับ browser

ปัญหาที่ต้อง contribute คือ design ไว้ว่าจะเปิด local chromium ให้และเปิด ws proxy ไว้ที่ port 0 (port 0 หมายถึง port ใดๆ ที่ว่าง ณ ขณะนั้น) ผู้ที่ต้องการใช้ chromium ก็ต่อ ws ไปที่ url ที่จัดหาให้ แต่!! เมื่อเราเปิด port 0 เราไม่สามารถรู้ได้เลยว่า แล้ว os มันจัดหา port อะไรให้เรา หมายความว่า เปิด port 0 แต่ไม่รู้ว่า port ที่เปิดจริงๆ คือ port อะไร

จริงจะใช้ _server ก็ได้ แต่ถ้าจะเอาจริงๆ ก็ค่อนข้างเหี้*ไปหน่อย ทำให้ถูกหลักอนามัยหน่อยละกัน

เริ่ม contribute คือเข้าไปอ่าน code ของ ws เขียนไว้สวยมาก ประณีต เลยลอง fork และเขียน ให้สามารถ return _server ออกมาผ่าน public function แล้วเปิด Pull Request ไป Upstream เลย โยนหินถามทางดู

ไม่ผ่านดิ มันมี CI !!! Tool เขาเทพมาก มี code coverage, AppVeyor กับ Travis แบบนี้ก็ต้องเขียน Test หละ

ภายใน ws มีการ setup development tool ไว้เรียบร้อยแล้ว npm test ได้เลย สิ่งแรกที่เจอคือ eslint ซึ่งโหดสัสๆ มีตัวอย่างดังนี้

  • function address(){... แบบนี้ไม่ได้ ต้อง function address () {...
  • if ถ้าไม่มี {} ให้อยู่บรรทัดเดียว เป็นดังนี้ if(a) throw new Error();
  • throw เป็น object เท่านั้น

เขียนไปสักพักก็ผ่าน ไม่ได้ยากมากมาย เขียน test เรียนร้อย ระหว่างนั้น เจ้าของก็เข้ามา review พอดี ปรับเปลี่ยนนิดหน่อย และส่งอีกรอบ

โดนตีกลับไปมา 2-3 รอบ เพราะต้องเขียน comment function ให้ถูก format และเขียน doc ให้เขาด้วย (หลัง ๆ ดึกเกินตามแก้ไม่ไหว พี่เจ้าของแกแก้เองแม่งเลย)

สุดท้ายก็ได้ merge!!

เรื่องนี้สอนให้รู้ว่า การเปิด PR ที่ไหนๆ ไม่ได้ยากอย่างที่คิด

Thank Luigi Pinca For nice merge experience. You’re awesome!!

--

--