0.1.3 • Published 4 years ago
@qnighy/marshal v0.1.3
@qnighy/marshal
Parses data exported by Ruby's Marshal.dump.
Quickstart
npm install --save @qnighy/marshal
# OR
yarn add @qnighy/marshalimport { 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:Uint8Arraya binary data to parse
- Returns
unknownthe decoded value
- Throws
MarshalErrorwhen 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, andFloats are all converted tonumbers.Strings andSymbols are all converted tostrings.- 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 toobjects.- Only keys that are a
numberor astring(including ones that wereSymbols) are picked. - Any other keys (
nil,[1, 2], etc.) are discarded. - If it has default value, it's replaced as the special
__ruby_defaultkey.
- Only keys that are a
Structs are converted toobjects.Regexps are converted toRegExps.- 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, andRegexpwill 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, andString.
- This rule doesn't apply when the object was parsed as a primitive value in JS.
Examples include
- Cyclic references are kept as-is.
License
MIT