ห้องวาดผ่านลิงก์เดียว
เวอร์ชันแรกของแอปนี้ต่อกันแบบ WebRTC ตรงระหว่างสองเครื่องโดยไม่มี server เลย ซึ่งเท่ดี แต่แลกมากับขั้นตอนคัดลอกโค้ดไปมาหลายรอบ และเครือข่ายบางคู่ (NAT แบบเข้มงวด) ต่อกันไม่ได้เลย เวอร์ชันนี้จึงเปลี่ยนมาใช้ Supabase เป็นตัวกลาง แลกความบริสุทธิ์ทางเทคนิคกับความง่ายจริง: เปิดผืน ส่งลิงก์ เพื่อนกดเข้า จบ ไม่มีขั้นตอนแลกโค้ด ไม่มีปัญหา NAT และวาดพร้อมกันได้ถึง 4 คน
ภาพวิ่งยังไง
- ทุก pixel ที่วาดถูกกระจายให้ทุกคนในห้องแบบเรียลไทม์ผ่าน Supabase Realtime (broadcast) แล้วรวมเข้า ผืนด้วยตรรกะ Last-Write-Wins ตัวเดิมของแอป — วาดชนกันเมื่อไหร่ ผลลัพธ์ทุกเครื่องตรงกันเสมอ
- ตัวผืนถูกบันทึกลงฐานข้อมูล Postgres เป็นระยะ (ราวหนึ่งวินาทีหลังหยุดวาด) ทำให้แชร์ลิงก์แล้วกลับมา วาดต่อวันหลังได้ แม้ทุกคนออกจากห้องไปแล้ว
- รายชื่อคนในห้อง (สูงสุด 4 คน) มาจากระบบ presence ของช่องสัญญาณเดียวกัน
ความเป็นส่วนตัว (พูดตรง ๆ)
ต่างจากเวอร์ชัน P2P เดิม รอบนี้ pixel และชื่อเล่นของคุณ ผ่านและถูกเก็บบน server (Supabase) จริง สิ่งที่เราออกแบบไว้เพื่อจำกัดผลกระทบ:
- ไม่มีบัญชีผู้ใช้ ไม่มีอีเมล ตัวตนเป็นแค่รหัสสุ่มกับชื่อเล่นที่ตั้งเอง
- ห้องเป็นแบบรู้ลิงก์ถึงเข้าได้เท่านั้น ไม่มีหน้ารวมห้องสาธารณะ ไม่มีระบบค้นหา
- ผืนที่ไม่มีใครแตะเกิน 30 วันถูกลบทิ้งอัตโนมัติทุกคืน
แปลว่าอย่าใช้ผืนนี้วาดข้อมูลลับ และใครที่ได้ลิงก์ห้องไปก็เข้ามาวาดหรือดูได้เหมือนเพื่อนคนหนึ่ง — แชร์ลิงก์เฉพาะคนที่ตั้งใจชวน
ทำไม TDD แค่บางไฟล์
lib/grid.ts (LWW conflict resolution), lib/proto.ts (encode/decode ข้อความ), lib/undo.ts (ย้อนกลับแบบไม่ทับงานเพื่อน) และตัวหน่วงบันทึก (net/canvas.ts) คือตรรกะที่ผิดพลาดแล้วข้อมูลเพี้ยน เลยเทสต์แน่นด้วย TDD ส่วนการเชื่อมต่อ Realtime จริงกับ UI (zoom/pan/canvas) ต้องอาศัย browser จริง จึงยืนยันด้วยการทดสอบหลายเบราว์เซอร์พร้อมกันแทน