@qnighy/marshal
TypeScript icon, indicating that this package has built-in type declarations

0.1.3 • Public • Published

@qnighy/marshal

Parses data exported by Ruby's Marshal.dump.

Quickstart

npm install --save @qnighy/marshal
# OR
yarn add @qnighy/marshal
import { Marshal } from "@qnighy/marshal";
// OR
const { Marshal } = require("@qnighy/marshal");

const buf = Uint8Array.from([
  4, 8, 123, 7, 58, 9, 110, 97, 109, 101, 73, 34, 8, 102, 111, 111, 6, 58, 6,
  69, 84, 58, 12, 110, 117, 109, 98, 101, 114, 115, 91, 8, 105, 6, 105, 7, 105,
  8,
]);
const data = Marshal.parse(buf);
// => { name: 'foo', numbers: [ 1, 2, 3 ] }

API

Marshal.parse

Parses a data exported by Ruby's Marshal.load.

  • Parameters
    • buf: Uint8Array
      a binary data to parse
  • Returns
    • unknown
      the decoded value
  • Throws
    • MarshalError
      when the data contains an invalid format.

parse

Same as Marshal.parse.

MarshalError

An exception raised when loadMarshal encountered an invalid format.

  • Superclass
    • Error

Notes on conversion

Ruby's value structure doesn't correspond to that of JavaScript. Here is how @qnighy/marshal converts values:

  • Fixnums, Bignums, and Floats are all converted to numbers.
  • Strings and Symbols are all converted to strings.
    • Encoding specifications are ignored and all strings are interpreted in UTF-8.
    • Bytes invalid as UTF-8 are replaced by U+FFFD.
  • Hashes are converted to objects.
    • Only keys that are a number or a string (including ones that were Symbols) are picked.
    • Any other keys (nil, [1, 2], etc.) are discarded.
    • If it has default value, it's replaced as the special __ruby_default key.
  • Structs are converted to objects.
  • Regexps are converted to RegExps.
    • Flags are ignored in the current version.
    • Syntax errors in new RegExp(...) are propagated in the current version.
  • Plain Objects are converted to empty objects.
  • Classes and modules are converted to empty objects.
  • All instance variables and class information are discarded. Even instances of subclasses of String, Array, Hash, and Regexp will be recognized the same as instances of their base classes.
  • If two occurrences of objects pointed to the identical object in Ruby, they will be identical in JS.
    • This rule doesn't apply when the object was parsed as a primitive value in JS. Examples include Bignum, Float, and String.
  • Cyclic references are kept as-is.

License

MIT

Dependencies (1)

Dev Dependencies (15)

Package Sidebar

Install

npm i @qnighy/marshal

Weekly Downloads

101,783

Version

0.1.3

License

MIT

Unpacked Size

39.5 kB

Total Files

23

Last publish

Collaborators

  • qnighy