WeeWikiPaint

Minimum Marketable Features:
+ marketing home page (episodes 1-32)
+ single-user painting on home page (episodes 33-200)
+ replace home page with professional design (episodes 201-321)
+ IE 11 support (and get rid of IE 8) (episodes 322-324)
+ Android support (episodes 325-327)
+ iOS 8 support (episode 328)
+ replace 404 page with professional design (episodes 329-369)
* collaborative painting (episode 370+)
- multiple servers
- responsive design
- accessibility
- polish
  - clear button retains focus when drawing (IE8, 9, Chrome)
  - drawing glitches occur when exiting drawing area that is flush against side of browser
  - one-pixel gap on right side of drawing area (Firefox, others unknown)
  - favicon
	- 'clear' button flashes rather than depressing (iOS)
	- 'clear' button depresses diagonally rather than vertically (IE 9, IE 11)
- multiple painting/erasing tools
- save the pages (persistence / databases)
- wiki-fy the pages
- more complex painting?
- more collaborative features?

User Stories to finish current MMF:
* make mouse pointer disappear when user intentionally disconnects (navigates away, reloads, etc.)
- make mouse pointer disappear when user loses connectivity
- time out inactive users (make their pointers disappear)
- reconnect and resync when client is disconnected/reconnected
- show disconnection warning / other UX when client is disconnected
- handle server reset smoothly (clear the drawing? re-sync to browsers? not persistence/DB)
- handle packet loss (What packet loss is possible? TCP handles this? What about unstable cellular connections?)

- version synchronization across client/server
- collision-handling / conflicts / race conditions
- load management
- server monitoring / error handling
- security (handling bad data, denial of service attacks)
	- nsp, snyk
- performance optimization
	- garbage collection pauses
	- network tick rate is currently unbounded
	- event repo stores everything, no culling
- bug: shows ghost pointer on other clients when tapping 'clear' button on mobile browsers
	- see onTouchClick_spike branch (but note document.elementFromPoint may not be testable on IE 11)
	- retire support for IE 11 first?
- bug: ghost pointers block other actions
	- e.g., starting a drag on top of a ghost pointer drags the pointer instead of drawing a line
	- e.g., clicking clear button if ghost pointer is in the way prevents button from clicking
	- investigate 'pointer-events: none' CSS
- polish: make 'clear' button depress when clear event received?

Engineering Tasks:
* Modify server code to send 'remove pointer' events to all other browsers when client disconnects
- Resolve order-of-operations issue when reloading -- server seems to get client move event *after* disconnect event.
- Look into accidental disconnection--try the spike

To Do on current task:
* Create a client module for Socket.IO tests (clean up the duplication between _server_test.js and _real_time_server_test.js)
- Convert TestClient to ES6 class syntax
- Move waitForConnectionCount() to TestClient
- Wait until server side is complete when creating and closing sockets
- asyncify listening for socket.io events in RealTimeServer tests?
- Create a clean shutdown for RealTimeServer.stop that waits for connections to close?