Giter VIP home page Giter VIP logo

what-the-pack's Issues

Compact helpers

Additional Optional Initialization Options

  • ignoreUndefined : boolean ignores object properties with undefined value
  • ignoreEmptyObjects : boolean ignores empty objects
  • ignoreEmptyArrays : boolean ignores empty arrays

References

Enable use of application-specific extension types

Overview

  • Transforms class instances into lower-level data structures upon encode, then back to class instances upon decode
  • On encoding, class instances are identified / recognized by using for-loop + instanceof
  • Internally automates the assigning of application-specific extension types (0 to 127)
  • Two variants:
    • class instances - when a class instance is passed directly to our encoder function
    • nested class instances - when a class instance is nested within an object or array passed to our encoder function
  • Uses an internal boolean, to check if custom extension types are used
  • Tests
const { extend } = MessagePack.initialize(2 ** 24);

class Vector {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}

// transforms class instance to msgpack-compatible data
const encodeVector = (vector) => {
  return [vector.x, vector.y];
};

// transforms data into new class instance
const decodeVector = (data) => {
  return new Vector(data[0], data[1]);
};

extend(Vector, encodeVector, decodeVector);

// `extend` parameters:
// - class (we use instanceof for recognition) : `Object`
// - encodeTransformFunction : `Function`
// - decodeTransformFunction : `Function`

Algo

  • For each classes
    • if value instanceof class
      • apply encodeTransformFunction
        • return encoded

Another use case:

  • A User class instance in client-side can be automatically encoded only using its id property
  • In the server-side its received id property can be automatically transformed back into a User class instance
  • User -> id -> encode -> transport -> decode -> id -> User

References


Breakdown

  • Uses fixext and ext format
fixext 1 11010100 0xd4
fixext 2 11010101 0xd5
fixext 4 11010110 0xd6
fixext 8 11010111 0xd7
fixext 16 11011000 0xd8
fixext 1 stores an integer and a byte array whose length is 1 byte
+--------+--------+--------+
|  0xd4  |  type  |  data  |
+--------+--------+--------+

fixext 2 stores an integer and a byte array whose length is 2 bytes
+--------+--------+--------+--------+
|  0xd5  |  type  |       data      |
+--------+--------+--------+--------+

fixext 4 stores an integer and a byte array whose length is 4 bytes
+--------+--------+--------+--------+--------+--------+
|  0xd6  |  type  |                data               |
+--------+--------+--------+--------+--------+--------+

fixext 8 stores an integer and a byte array whose length is 8 bytes
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|  0xd7  |  type  |                                  data                                 |
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+

fixext 16 stores an integer and a byte array whose length is 16 bytes
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
|  0xd8  |  type  |                                  data                                  
+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
+--------+--------+--------+--------+--------+--------+--------+--------+
                              data (cont.)                              |
+--------+--------+--------+--------+--------+--------+--------+--------+

ext 8 stores an integer and a byte array whose length is upto (2^8)-1 bytes:
+--------+--------+--------+========+
|  0xc7  |XXXXXXXX|  type  |  data  |
+--------+--------+--------+========+

ext 16 stores an integer and a byte array whose length is upto (2^16)-1 bytes:
+--------+--------+--------+--------+========+
|  0xc8  |YYYYYYYY|YYYYYYYY|  type  |  data  |
+--------+--------+--------+--------+========+

ext 32 stores an integer and a byte array whose length is upto (2^32)-1 bytes:
+--------+--------+--------+--------+--------+--------+========+
|  0xc9  |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|  type  |  data  |
+--------+--------+--------+--------+--------+--------+========+

where
* XXXXXXXX is a 8-bit unsigned integer which represents N
* YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N
* ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a big-endian 32-bit unsigned integer which represents N
* N is a length of data
* type is a signed 8-bit signed integer
* type < 0 is reserved for future extension including 2-byte type information

Replace Buffer with UInt8Array functions on browsers

Usage of Buffer isn't really necessary for browsers.

We just want simpler functions that let us encode and decode data to/from UInt8Array instances.

Looking at https://github.com/feross/buffer/blob/master/index.js the implemetation actually has internal checks and assertions which could be skipped, which could speed up our encoding and decoding process in the browser.

If this ever succeeds, we can even use these UInt8Array functions on the node implementation for speed, since UInt8Arrays can be converted to Buffer instances anyways.

Notes:

References

Encode failure for some strings with non-ascii characters

The string "WALL·E – Typeset in the Future" decodes as "W" and causes further decoding problems if it is contained by an object with other data in it.

This appears to be due to the fixstr condition in index.js, which checks if the number of characters is less than 32, rather than the number of bytes as defined by the MessagePack spec and implemented in decode(). "WALL·E – Typeset in the Future" is 30 characters long but uses 33 bytes in utf8.

Try-catch block in encode and decode

internalEncode and internalDecode must be wrapped in ONE try-catch block to catch encoding and decoding errors. Doing the try-catch block within (instead outside) will nest it recursively and will be costly.

document usage with fetch, ky(sindre), websockets & sockette(lukeed)

Overview

  • Document usage in README
  • Provide simple wrapper functions that automatically encodes parameters, and decodes responses
const { encode, decode } = //...
const response = await fetch('https://example.com', {
  method: 'POST',
  body: JSON.stringify({foo: true}),
  headers: { 'content-type': 'application/octet-stream' }
});
if (!response.ok) {
  throw new HTTPError('Fetch error:', response.statusText);
}
const parsed = decode(await response.arrayBuffer());
console.log(parsed);
//=> `{ asd: '123'}`
const headers = { 'content-type': 'application/octet-stream' };
const parsed = decode(await ky.post('https://example.com', {
  headers,
  body: encode({ some: 'data' }),
}).arrayBuffer());

References

expose Buffer object

When used with websocket clients with .binaryType = 'arraybuffer', messages received will be instances of ArrayBuffer. .decode function on the other hand always expects a Buffer instance, hence what should be called is .decode(Buffer.from(MessageEvent.data)).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.