I'm not sure whether I should be discussing this here or on
GitHub.
I have extended the existing server branch to include an internal
HTTP/WebSocket server. I've used the existing Server class in
build_system.py as the base class for the HTTP handler in
server.py. As of right now, the only method needing to be
implemented by subclasses is handle_data() which takes in the raw
data and determines what to do with it. In the case of the
BuildHttpHandler, it assumes the data is pure JSON and parses it
before it hands it off to other methods to use it.
In order to test it out, run "b2 --python --http-server
../path/to/boostbuild/server/client/index.html " in some project.
The HttpServer class will fire up a server on port 8000 and serve
the index file passed on the command line. Visit
http://localhost:8000 in a
browser. It is expected for the index file to create a new
Websocket() connection to localhost on the same port. The server
will then capture the request and return the websocket handshake.
I had a test file that allowed me to manually write to the socket
(via the browser's JS console) which worked quite well, but I
seemed to have misplaced that example project. I then tried to
connect up to Vladimir's existing React example, but there were a
couple of JS problems and I don't know enough about React in order
to quickly diagnose. The page loads just fine, but clicking on any
of the UI buttons produces problems.
At my job, I created a dependency graph viewer utilizing D3.js and
a JSON dump (a feature I have added on a company branch) from
Boost.Build. It allows the user to be able to visualize the
Jamfiles and the Main targets and alternatives contained within
them as well as a visualization of the -d+12 output. After
dreaming a little bit, I could see using the HTTP/Socket server to
allow the same type of application to make requests to the build
system in order to retrieve information as well as submit build
requests simply by selecting a main target, choosing properties
for the build request (with typeahead support) and then clicking
build. A lot of the developers at my place of employment are heavy
IDE/GUI users and aren't CLI savvy; this kind of tool would help
them out.
I plan on performing more work on the server branch soon so that I
can try and add file watching and borrow some of the engine
changes from the daemon branch. I'd like to try and solidify the
Builder and Server classes to provide an abstract interface.
My changes are currently on
my
fork of the repo and can be found on the
features/http-server
branch.
Let me know if what I've done sounds good or not.
Thanks,
Aaron