diff options
Diffstat (limited to 'share/server/loop.js')
-rw-r--r-- | share/server/loop.js | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/share/server/loop.js b/share/server/loop.js new file mode 100644 index 00000000..170a8dc8 --- /dev/null +++ b/share/server/loop.js @@ -0,0 +1,62 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. + +var sandbox = null; + +try { + // if possible, use evalcx (not always available) + sandbox = evalcx(''); + sandbox.emit = emit; + sandbox.sum = sum; + sandbox.log = log; + sandbox.toJSON = toJSON; + sandbox.respondWith = respondWith; + sandbox.registerType = registerType; +} catch (e) {} + +// Commands are in the form of json arrays: +// ["commandname",..optional args...]\n +// +// Responses are json values followed by a new line ("\n") + +var cmd, cmdkey; + +var dispatch = { + "reset" : State.reset, + "add_fun" : State.addFun, + "map_doc" : Views.mapDoc, + "reduce" : Views.reduce, + "rereduce" : Views.rereduce, + "validate" : Validate.validate, + "show_doc" : Render.showDoc, + "list_begin" : Render.listBegin, + "list_row" : Render.listRow, + "list_tail" : Render.listTail +}; + +while (cmd = eval(readline())) { + try { + cmdkey = cmd.shift(); + if (dispatch[cmdkey]) { + // run the correct responder with the cmd body + dispatch[cmdkey].apply(this, cmd); + } else { + // unknown command, quit and hope the restarted version is better + respond({ + error: "query_server_error", + reason: "unknown command '" + cmdkey + "'"}); + quit(); + } + } catch(e) { + respond(e); + } +}; |