es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Discriminar el tipo de segmento de Node.js Buffer en TypeScript

He definido estas interfaces en typescript:

enum TypeId {
  A = 0,
  B = 1,
  C = 2
}

interface A {
  id: TypeId.A
}

interface B {
  id: TypeId.B,
  foo: string
}

interface C {
  id: TypeId.C
}

type MyType = A | B | C

Ahora quiero deserializar estos tipos desde una instancia de Buffer. Leo un byte para obtener el ID y si coincide con TypeId.B, se deben leer 4 bytes para el valor de foo.

¿Cómo puedo hacer esto en una función con la firma parse(buffer: Buffer): MyType?

Gracias por cualquier ayuda.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Aquí hay una posible implementación para la función parse:

    function parse(buffer: Buffer): MyType {
      const id = buffer.readUInt8(0);
    
      switch (id) {
        case TypeId.A:
          return { id: TypeId.A };
        case TypeId.B:
          return { id: TypeId.B, foo: buffer.readUInt32LE(1).toString() };
        case TypeId.C:
          return { id: TypeId.C };
        default:
          throw new Error(`ID de tipo desconocido: ${id}`);
      }
    }
    

    Esta función lee el primer byte del buffer para determinar la ID del objeto a deserializar. Dependiendo de la ID, crea un objeto de la interfaz correspondiente, leyendo opcionalmente bytes adicionales del buffer.

    Para TypeId.B, leemos 4 bytes con el método readUInt32LE, que devuelve un entero sin signo en formato little-endian. Convertimos este valor a una cadena con el método toString y lo asignamos a la propiedad foo del objeto devuelto.

    Si la ID no es reconocida, lanzamos un error. Ten en cuenta que esta implementación asume que el buffer contiene al menos un byte y que está bien formado (es decir, contiene una ID válida y el número correcto de bytes adicionales para TypeId.B).

Comments are closed.