Hey all,
I got nerd sniped by Joan this morning:
<+Wohali> hmmmmm. https://github.com/denoland/deno
<+Wohali> i know i know another runtime but it's focused on security
I wondered what it would take to make a couchjs variant based on deno. Turns
out: about a day if you cut some corners ;)
One of the interesting aspects, as Joan notes, is its more-secure-by-default,
so I have some hopes that this might work out better than our ill-fated nodejs
query server experiment from a few years back.
I started by hacking up a readily generated main.js, then ran `make` again, and
did it all again. Overall, it is ~30 LOC changes. Since there is no synchronous
`readline()` available and JS code can either by sync or async, we can’t make
it so one source could run in our couchjs or deno.
So I went ahead and ripped all the basics out of our main.js and modernised
things a little bit along the way. The result is a main-deno.js that can run
map/reduce/rereduce/filter/view_filter/validate_doc_update functions (as
validated by the query server spec).
https://gist.github.com/janl/c3139bc72efe663e35005d8864c4201f
I intentionally left out the couchappy functions, as at least lists with the
`getRow()` function won’t be implementable without an API break. I also left
out legacy compact with esprima/escodegen to keep things more manageable. Oh
and no lib/modules, given today’s JS packaging tooling, it’s an easy choice to
leave out.
I haven’t done any sort of benchmarking, but I’d love for someone here to give
this a try. Here’s how to hack up `./dev/run` to add support for `deno` design
docs:
https://gist.github.com/janl/01559f8617ef44afd5ceec39ec8389e8
If you want to run this on a regular CouchDB setup, set up this env var before
launching CouchDB:
COUCHDB_QUERY_SERVER_DENO="deno run --allow-write /path/to/main-deno.js”
`--allow-write` is only required for the debug log (/tmp/deno-qs.log), but
won’t be required during operation, adding to the sandboxed nature of it all.
And some proof of operation:
https://gist.github.com/janl/8636d469420a1fd2de481ae8f5780854
It’d be nice to see how stable this is in practice and if there are any
meaningful performance / resource-usage differences. Any takers? I’ll answer
any and all setup questions.
Now I’m passing the nerd-snipe torch to Paul:
<+jan____> uh, and it is embeddable https://deno.land/manual/embedding_deno
Best
Jan
—