npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@qnighy/marshal

v0.1.3

Published

Decoder for Ruby's Marshal

Downloads

553,944

Readme

@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