PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo-forks/avalanchejs/src/serializable/codec

Просмотр файла: codec.ts

import { bytesForInt } from '../../fixtures/utils/bytesFor';
import { concatBytes } from '../../utils/buffer';
import { unpack } from '../../utils/struct';
import type { Serializable, SerializableStatic } from '../common/types';
import { serializable } from '../common/types';
import { Int } from '../primitives';
import { TypeSymbols } from '../constants';

/**
 * @see https://github.com/ava-labs/avalanchego/blob/master/codec/linearcodec/codec.go
 */
@serializable()
export class Codec {
  _type = TypeSymbols.Codec;
  typeToTypeID: Map<TypeSymbols, number>;

  constructor(
    private readonly typeIdToType: (SerializableStatic | undefined)[],
  ) {
    this.typeToTypeID = typeIdToType.reduce(
      (agg, type, index) => (type ? agg.set(new type()._type, index) : agg),
      new Map<TypeSymbols, number>(),
    );
  }

  PackPrefix = (type: Serializable) => {
    const id = this.typeToTypeID.get(type._type);
    if (id === undefined) {
      throw new Error(
        `can't marshal unregistered type: ${type._type.toString()}`,
      );
    }

    return concatBytes(bytesForInt(id), type.toBytes(this));
  };

  UnpackPrefix = <T extends Serializable>(buf: Uint8Array): [T, Uint8Array] => {
    let typeId: Int;
    [typeId, buf] = unpack(buf, [Int]);
    const type = this.typeIdToType[typeId.value()];

    if (type === undefined) {
      throw new Error(
        `couldn't unmarshal interface: unknown type ID ${typeId.value()}`,
      );
    }

    const [entity, rest] = type.fromBytes(buf, this);

    return [entity as T, rest];
  };

  static fromBytes(buf: Uint8Array, codec?: Codec) {
    if (!codec) {
      throw new Error('codec required');
    }
    return codec.UnpackPrefix(buf);
  }

  // this is placed here to satisfy serializable and should not be used directly
  toBytes(): Uint8Array {
    throw new Error('not implemented');
  }

  PackPrefixList(list: Serializable[]): Uint8Array {
    return concatBytes(
      bytesForInt(list.length),
      ...list.map((type) => this.PackPrefix(type)),
    );
  }
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!