couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jan Lehnardt <>
Subject Deno Query Server Demo
Date Thu, 14 May 2020 20:01:13 GMT
Hey all,

I got nerd sniped by Joan this morning:

    <+Wohali> hmmmmm.
    <+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).

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:

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:

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

View raw message