lipp/node-jet

View on GitHub
src/3_jet/utils.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { State } from './peer/state.js'
import { Method } from './peer/method.js'
import { JsonRPCError, JSONRPCError } from './errors.js'
import { ErrorType, ValueType } from './types.js'

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const getValue = (o: any, field: string) => {
  if (field === '') return o
  const keys = field.split('.')
  for (let i = 0; i < keys.length; i++) {
    const key = keys[i]
    if (key in o) {
      o = o[key]
    } else {
      return undefined
    }
  }
  return o
}
const isJsonRPCError = (
  err: JsonRPCError | string | ErrorType
): err is JsonRPCError =>
  typeof err === 'object' && 'code' in err && 'message' in err

export const errorObject = (err: JSONRPCError | ErrorType | string) => {
  let data
  if (isJsonRPCError(err)) {
    return err as JSONRPCError
  } else {
    data = {} as ErrorType
    if (typeof err === 'string') {
      data.message = err
      data.stack = 'no stack available'
    } else {
      data.message = err.message
      data.stack = err.stack
      data.lineNumber = err.lineNumber
      data.fileName = err.fileName
    }
    return {
      code: -32603,
      message: 'Internal error',
      data: data
    }
  }
}
export const isState = <T extends ValueType>(
  stateOrMethod: State<T> | Method
): stateOrMethod is State<T> => {
  return '_value' in stateOrMethod
}