• Jump To … +
    server.coffee src/actionknob.coffee src/autosem.coffee src/bitbucket_kba.coffee src/browserlog.coffee src/datareduction.coffee src/dci.coffee src/dciknob.coffee src/deeseeeye.coffee src/dnd.coffee src/doof.coffee src/formurla-mngr.coffee src/fractalpanel.coffee src/fractalpanel_test.coffee src/front.coffee src/ingestor.coffee src/kbabitbucket.coffee src/knobctrl.coffee src/lib_test.coffee src/nanoclock.coffee src/noodb.coffee src/noodbabstract.coffee src/noodbbrowser.coffee src/noodbbrowser_test.coffee src/noodbsec.coffee src/noorauth.coffee src/noorplugin.coffee src/noorquery.coffee src/noorvm.coffee src/noorwrite.coffee src/quadparser.coffee src/quadparsern3.coffee src/rbac.coffee src/reactor.coffee src/rebase.coffee src/rsrcidx.coffee src/sandboxactions.coffee src/screen_ctx.coffee src/spogi.coffee src/tabular_widget.coffee src/visctrl.coffee src/voicesknob.coffee src/whowhen.coffee src/xsd2native.coffee
  • noodbbrowser.coffee

  • ¶
    _ = (window? and window._) or require('underscore')
    Clock = require("./nanoclock").Clock
    Log = require("./browserlog").BrowserLog
    NooDBAbstract = require("./noodbabstract").NooDBAbstract
    InsecureListener = require("./noodbabstract").InsecureListener
    Spogi = require("./spogi").Spogi
    
    class NooDBBrowser extends NooDBAbstract
      constructor: (@socket, @server_uri, args, read_callback) ->
        @queries = []
        args = args or {}
        defaults =
          verbose: false
          warn_time_threshold: 5000
          verbosity: 3
          clock: new Clock()
          instrumented: false # instrumented = true turns on demonstrative code
  • ¶

    log: new Log(‘warning’) # https://github.com/tj/log.js

          log_level: 'ERROR'
  • ¶

    What the default_graph should be is a puzzle, if it’s even needed. Should it be @server_uri? Or @server_uri + “/somepath/“?

          default_graph: "#{@server_uri}/erewhon/"
          last_user_no_int: 57 * 57 - 1 #ie zz when base57
        @resolve_defaults(defaults, args, Log)
        @build_indices()
  • ¶

    console.warn “DO THE EQUIVALENT OF @init_db()”

        @init_db(read_callback)
        @register_socket()
    
      read_db: (fname, read_more, fname_queue, callback) ->
        super()
    
      get_server_session: () ->
  • ¶

    The serverSession is the one which embodies the current execution of the server. Ideally it will have the session start time and the git code version associated with it.

        if not @session_no?
          all = @by_pred.getAll("nrn:serverStartedAt")
          @session_no = all.length + 1
  • ¶

    user_no this should be an identifier for the server

        if not @session_no?
          @log.alert "@session_no is blank"
        return {user_symbol: @user_symbol, session_no: @session_no}
    
      allege: (s, p, o, g, sess, date) ->
  • ¶

    sess and date are up to the server-side

        if undefined in [s, p, o]
          throw new Error("everything must be defined of <s:#{s}> <p:#{p}> <o:#{o}>")
        @socket.emit('allege_upstream', [s, p, o, g])
        return
    
      allege_local: (s, p, o, g, sess, date) ->
        @__proto__.__proto__.allege.call(@, s, p, o, g, sess, date)
    
      allege_transaction: (quads) ->
        @socket.emit('allege_transaction', quads)
        return
    
      receive_transaction_reponse: (data) =>
        alert(JSON.stringify(data,null,4))
    
      register_socket: ->
        @log.info "register_socket() socket:",@socket
        @socket.on('from_upstream', @from_upstream)
        @socket.on('transaction_response', @receive_transaction_response)
        @socket.on('alert_user', @alert_user)
        @socket.on('set_server_session', @set_server_session)
        @socket.on('set_prefix', @set_prefix)
        @register_socket_session()
    
      set_server_session: (session_id) =>
  • ¶

    the session_id looks like “<user_symbol>_<session_no>” eg s8uY7_489

        part = session_id.split('_')
        if part.length isnt 2 or part[0].length < 1 or part[1].length < 1
          throw new Error \
            "set_server_session() expects session_id like 'usym_int' not '#{session_id}'"
        @user_symbol = part[0]
        @session_no = Number.parseInt(part[1])
  • ¶

    console.log “set_server_session() ==>”,@get_server_session()

        return
    
      subscribe: (qry) ->
        @log.info("subscribe()", qry)
        @queries.push(qry)
        @socket.emit('error', "ABOUT TO EMIT subscribe")
        @socket.emit('subscribe', qry)
    
      alert_user: (data) =>
        msg = data.msg or data
        alert(msg)
        return
    
      register_socket_session: ->
        if @auth_cookie
          @socket.emit 'register_session', @auth_cookie
        return
    
      from_upstream: (quint) => # quint is a 5-tuple for brevity
        @log.debug("from_upstream()", quint)
        spogi = @index(quint)
        if spogi
          @ensure_prefixes(spogi)
          @log.debug("  ", spogi.asTTL())
        return
    
      ensure_prefixes: (spogi) ->
        sought = {}
        for t in ['s','p','o','g','i']
          if not spogi[t].isUri # spogi.o might not be an URI
            continue
          prfx = spogi[t].prefix_part()
          if not (sought[prfx] or @prefixdb.prefixes.has_k(prfx))
            sought[prfx] = true
            @request_prefix_from_upstream(prfx)
        return
    
      request_prefix_from_upstream: (prfx) ->
        if not @prefixdb.prefixes.has_k(prfx)
          @socket.emit('get_prefix', prfx)
        return
    
      set_prefix: (pair) =>
        @prefixdb.add_prefix(pair[0], pair[1])
        return
    
      persist: (spogi) ->
        @socket.emit('allege', spogi.asLine())
        @log.warning("NooDBBrowser.persist is a NOOP")
        return
    
      query_upstream: (q) ->
        @queries.push(q)
        @socket.emit('subscribe', q)
        return
    
      subscribe_visualization: (viz, qry) ->
  • ¶

    @subscribe(qry) # TODO why isn’t this required?

        @log.debug "subscribe_visualization() qry:", qry
        @query_upstream(qry)
        @subscribe_listener(new VisualizationListener(viz), qry)
    
    class VisualizationListener extends InsecureListener
      constructor: (@viz) ->
        super()
      get_id: ->
        @viz.id
      send: (spogi) =>
        onward = @viz.discriminate(spogi)
        if onward?
          @viz.receive(onward)
        null
    
    (exports ? this).NooDBBrowser = NooDBBrowser