OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-proto-peer / spec / state-base / contract / hyperdispatch / index.js

125 lines · javascript ref:
// This file is autogenerated by the hyperdispatch compiler
/* eslint-disable camelcase */

const { c, b4a, assert, DispatchError, ERRORS } = require('hyperdispatch/runtime')
const { version, getEncoding, setVersion } = require('./messages.js')

const defaultVersion = version

class Router {
  constructor () {
    this._handler0 = null
    this._handler1 = null

    this._missing = 2
  }

  add (name, handler) {
    switch (name) {
      case '@state/set-entry':
        this._handler0 = handler
        break
      case '@state/del-entry':
        this._handler1 = handler
        break
      default:
        throw DispatchError.NONEXISTENT_ROUTE(name)
    }
    this._missing--
  }

  _checkAll () {
    assert(this._handler0 !== null, 'Missing handler for "@state/set-entry"')
    assert(this._handler1 !== null, 'Missing handler for "@state/del-entry"')
  }

  async dispatch (message, context) {
    if (this._missing > 0) {
      this._checkAll()
    }

    setVersion(defaultVersion)

    const op = b4a.isBuffer(message) ? decode(message) : message

    switch (op.id) {
      case 0:
        return this._handler0(op.value, context)
      case 1:
        return this._handler1(op.value, context)
      default:
        throw DispatchError.HANDLER_NOT_FOUND_BY_ID(op.id)
    }
  }
}

function encode (name, message, { version = defaultVersion } = {}) {
  const state = { buffer: null, start: 0, end: 0 }

  const route = getRouteByName(name)
  setVersion(version)

  c.uint.preencode(state, route.id)
  route.enc.preencode(state, message)

  state.buffer = b4a.allocUnsafe(state.end)
  c.uint.encode(state, route.id)
  route.enc.encode(state, message)

  return state.buffer
}

function decode (buffer, { version = defaultVersion } = {}) {
  const state = { buffer, start: 0, end: buffer.length }

  const id = c.uint.decode(state)
  const route = getRouteById(id)
  setVersion(version)

  const value = route.enc.decode(state)
  return { id, name: route.name, value }
}

const route0 = {
  name: '@state/set-entry',
  id: 0,
  enc: getEncoding('@state/entry')
}

const route1 = {
  name: '@state/del-entry',
  id: 1,
  enc: getEncoding('@state/entry-key')
}

function getRouteByName (name) {
  switch (name) {
    case '@state/set-entry':
      return route0
    case '@state/del-entry':
      return route1
    default:
      throw DispatchError.ROUTE_NOT_FOUND_BY_NAME(name)
  }
}

function getRouteById (id) {
  switch (id) {
    case 0:
      return route0
    case 1:
      return route1
    default:
      throw DispatchError.HANDLER_NOT_FOUND_BY_ID(id)
  }
}

module.exports = {
  version,
  encode,
  decode,
  Router,
  DispatchError,
  ERRORS
}