OverviewFilesCommitsIssuesDocsReleasesPeers

holepunchto-deps / @holepunchto / keet-media / shared / spec / hrpc / index.js

210 lines · javascript ref:
// This file is autogenerated by the hrpc compiler
/* eslint-disable camelcase */
/* eslint-disable space-before-function-paren */

import { c, RPC, RPCStream, RPCRequestStream } from 'hrpc/runtime'
import { getEncoding } from './messages.js'

const methods = new Map([
  ['@media/create-chat-image-preview', 0],
  [0, '@media/create-chat-image-preview'],
  ['@media/create-chat-video-preview', 1],
  [1, '@media/create-chat-video-preview'],
  ['@media/create-chat-link-preview', 2],
  [2, '@media/create-chat-link-preview'],
  ['@media/create-profile-avatar', 3],
  [3, '@media/create-profile-avatar'],
  ['@media/create-room-avatar', 4],
  [4, '@media/create-room-avatar'],
  ['@media/decode-image', 5],
  [5, '@media/decode-image']
])

class HRPC {
  constructor(stream) {
    this._stream = stream
    this._handlers = []
    this._requestEncodings = new Map([
      ['@media/create-chat-image-preview', getEncoding('@media/create-chat-image-preview-request')],
      ['@media/create-chat-video-preview', getEncoding('@media/create-chat-video-preview-request')],
      ['@media/create-chat-link-preview', getEncoding('@media/create-chat-link-preview-request')],
      ['@media/create-profile-avatar', getEncoding('@media/create-profile-avatar-request')],
      ['@media/create-room-avatar', getEncoding('@media/create-room-avatar-request')],
      ['@media/decode-image', getEncoding('@media/decode-image-request')]
    ])
    this._responseEncodings = new Map([
      [
        '@media/create-chat-image-preview',
        getEncoding('@media/create-chat-image-preview-response')
      ],
      [
        '@media/create-chat-video-preview',
        getEncoding('@media/create-chat-video-preview-response')
      ],
      ['@media/create-chat-link-preview', getEncoding('@media/create-chat-link-preview-response')],
      ['@media/create-profile-avatar', getEncoding('@media/create-profile-avatar-response')],
      ['@media/create-room-avatar', getEncoding('@media/create-room-avatar-response')],
      ['@media/decode-image', getEncoding('@media/decode-image-response')]
    ])
    this._rpc = new RPC(stream, async (req) => {
      const command = methods.get(req.command)
      const responseEncoding = this._responseEncodings.get(command)
      const requestEncoding = this._requestEncodings.get(command)
      if (this._requestIsSend(command)) {
        const request = req.data ? c.decode(requestEncoding, req.data) : null
        await this._handlers[command](request)
        return
      }
      if (!this._requestIsStream(command) && !this._responseIsStream(command)) {
        const request = req.data ? c.decode(requestEncoding, req.data) : null
        const response = await this._handlers[command](request)
        req.reply(c.encode(responseEncoding, response))
      }
      if (!this._requestIsStream(command) && this._responseIsStream(command)) {
        const request = req.data ? c.decode(requestEncoding, req.data) : null
        const responseStream = new RPCStream(
          null,
          null,
          req.createResponseStream(),
          responseEncoding
        )
        responseStream.data = request
        await this._handlers[command](responseStream)
      }
      if (this._requestIsStream(command) && !this._responseIsStream(command)) {
        const requestStream = new RPCRequestStream(
          req,
          responseEncoding,
          req.createRequestStream(),
          requestEncoding
        )
        const response = await this._handlers[command](requestStream)
        req.reply(c.encode(responseEncoding, response))
      }
      if (this._requestIsStream(command) && this._responseIsStream(command)) {
        const requestStream = new RPCRequestStream(
          req,
          responseEncoding,
          req.createRequestStream(),
          requestEncoding,
          req.createResponseStream(),
          responseEncoding
        )
        await this._handlers[command](requestStream)
      }
    })
  }

  async _call(name, args) {
    const requestEncoding = this._requestEncodings.get(name)
    const responseEncoding = this._responseEncodings.get(name)
    const request = this._rpc.request(methods.get(name))
    const encoded = c.encode(requestEncoding, args)
    request.send(encoded)
    return c.decode(responseEncoding, await request.reply())
  }

  _callSync(name, args) {
    const requestEncoding = this._requestEncodings.get(name)
    const responseEncoding = this._responseEncodings.get(name)
    if (this._requestIsSend(name)) {
      const encoded = c.encode(requestEncoding, args)
      const request = this._rpc.event(methods.get(name))
      request.send(encoded)
    }

    const request = this._rpc.request(methods.get(name))

    if (!this._requestIsStream(name) && this._responseIsStream(name)) {
      const encoded = c.encode(requestEncoding, args)
      request.send(encoded)
      return new RPCStream(request.createResponseStream(), responseEncoding)
    }
    if (this._requestIsStream(name) && !this._responseIsStream(name)) {
      return new RPCRequestStream(
        request,
        responseEncoding,
        null,
        null,
        request.createRequestStream(),
        requestEncoding
      )
    }
    if (this._requestIsStream(name) && this._responseIsStream(name)) {
      return new RPCRequestStream(
        request,
        responseEncoding,
        request.createResponseStream(),
        responseEncoding,
        request.createRequestStream(),
        requestEncoding
      )
    }
  }

  async createChatImagePreview(args) {
    return this._call('@media/create-chat-image-preview', args)
  }

  async createChatVideoPreview(args) {
    return this._call('@media/create-chat-video-preview', args)
  }

  async createChatLinkPreview(args) {
    return this._call('@media/create-chat-link-preview', args)
  }

  async createProfileAvatar(args) {
    return this._call('@media/create-profile-avatar', args)
  }

  async createRoomAvatar(args) {
    return this._call('@media/create-room-avatar', args)
  }

  async decodeImage(args) {
    return this._call('@media/decode-image', args)
  }

  onCreateChatImagePreview(responseFn) {
    this._handlers['@media/create-chat-image-preview'] = responseFn
  }

  onCreateChatVideoPreview(responseFn) {
    this._handlers['@media/create-chat-video-preview'] = responseFn
  }

  onCreateChatLinkPreview(responseFn) {
    this._handlers['@media/create-chat-link-preview'] = responseFn
  }

  onCreateProfileAvatar(responseFn) {
    this._handlers['@media/create-profile-avatar'] = responseFn
  }

  onCreateRoomAvatar(responseFn) {
    this._handlers['@media/create-room-avatar'] = responseFn
  }

  onDecodeImage(responseFn) {
    this._handlers['@media/decode-image'] = responseFn
  }

  _requestIsStream(command) {
    return [].includes(command)
  }

  _responseIsStream(command) {
    return [].includes(command)
  }

  // prettier-ignore-start
  _requestIsSend(command) {
    return [
      // prettier-ignore
    ].includes(command)
  }
}

export default HRPC