There are far too may tutorials out there describing how to  create a NodeJS app which either involves real time chat or drawing. A  couple of years back I was amazed at how easy it was to write 12 lines  of JavaScript code, chuck in a <canvas> element with some mousemove listeners in a page and type node server.js and away it goes!

Since then I’ve always thought it would be cool to extend the size of  the drawing space to become an unlimited sized canvas? Well that’s what  I hope to have working soon.

Initially I set about writing a JavaScript HTML5 canvas map framework  to allow tiles to be requested and drawn on screen but this involved  inventing up coordinate systems, panning animations and dealing with  tile grid boundaries. It got quite complex all while I was thinking there must be a JavaScript library already for this! Most JavaScript mapping libraries render <img>tags  in a mosaic fashion and animate the CSS ‘top’, ‘left’ or translate(x,y)  properties coupled with event listeners to give the effect of a  scrollable map. This won’t work for a drawing app where the user should  be interacting with one single canvas where shapes and lines can be  drawn on efficiently. The only library I could find was OpenLayers 3  which supports map tile rendering on a single canvas element.

The canvas element will span the entire browser screen and gets  divided up into tiles which can be retrieved and saved from a server  using a RESTful API. This might be a great opportunity to experiment  with the new HTTP/2 (formerly known as SPDY) server implementations as  it may enable the ability to request a region and receive a range of  adjacent tiles all in one response rather than requesting each one. I am  currently using a small Java JAX-RS 2.0 implementation in Tomcat but  might switch to a more productive framework such as Rails or Python  Flask.

Real time user events such as mouse move events from other people  will be sent down a WebSocket connection and relayed to all connected  users to display a cursor where others are drawing.

With GET and PUT operations working, hopefully there will be a working prototype for people to try out very soon in the browser.