• Stars
    star
    170
  • Rank 223,357 (Top 5 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 5 years ago
  • Updated 6 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

JavaScript Object like api, backed by an arraybuffer

ObjectBuffer: object-like API, backed by a [shared]arraybuffer

npm version Coverage Status Gitpod Ready-to-Code

For Modern browsers and node.

Save, read and update plain javascript objects into ArrayBuffer, using regular javascript object api, without intermediate serialization/deserialization.

No pre-defined schema is required. In other words, It's a user-land implementation of javascript objects, using a single ArrayBuffer as the heap.

That's enables us to transfer or share objects with a WebWorker or other, same-origin, browsing contexts without data duplication or full serialization.

๐Ÿ‰๐Ÿ‰๐Ÿ‰ Adventurers Beware ๐Ÿ‰๐Ÿ‰๐Ÿ‰

Using this library, and workers in general, will not necessarily make you code runs faster.
First be sure where your bottlenecks are, and if you don't have a better and more simple workaround.
I personally also really like what's going on around the main thread scheduling proposal and react userland scheduler that powers concurrent react

Quick example

import { createObjectBuffer, getUnderlyingArrayBuffer } from "@bnaya/objectbuffer";

const initialValue = {
  foo: { bar: new Date(), arr: [1], nesting:{ WorksTM: true } }
};
// ArrayBuffer is created under the hood
const myObject = createObjectBuffer(
  // size in bytes
  1024,
  initialValue
);

myObject.additionalProp = "new Value";
myObject.arr.push(2);

const arrayBuffer = getUnderlyingArrayBuffer(myObject);

Play with it (codesandbox)

See also main.js for shared memory example. to run it: clone the repo, yarn install and yarn browser-playground

Getting involved

Participants is Adhere to the Code of Conduct.
The quickest way to get up and running is via Gitpod Ready-to-Code and to run the tests.

Go over the contributing document.
Pick an issue with "good first" or "help wanted", or do some cool by your own!

Feel free to open an issue, or contact me directly at [email protected]

API reference

link

Why

Exchanging plain objects with WebWorkers is done by serializing and copying the data to the other side.
for some use-cases, it's slow and memory expensive.
ArrayBuffer can be transferred without a copy, and SharedArrayBuffer can be directly shared, but out of the box, it's hard to use ArrayBuffer as more than a TypedArray.

Disclaimer / Motivation

I'm working on it mostly from personal interest, It's not in use in any production use-case.
Before putting any eggs in the basket, please go over the implementation details document

What's working

  • strings
  • number
  • objects (with nesting and all)
  • arrays
  • Date
  • BigInt
  • Internal references (foo.bar2 = foo.bar will not create a copy, but a reference)
  • Automatic reference counting, to dispose a value you need to use the disposeWrapperObject or to have WeakRef support
  • Internal equality between objects (foo.bar === foo.bar will be true)
  • global lock for shared memory using Atomics (I hope its really working)

Caveats & Limitations

  • Need to specify size for the ArrayBuffer. When exceed that size, exception will be thrown. (Can be extended later with a utility function, but not automatically)
  • Size must be multiplication of 8
  • Set, Map, Object keys can be only string or numbers. no symbols or other things
  • No prototype chain. no methods on the objects
  • Adding getters, setters, will not work/break the library
  • deleting/removing the current key of Map/Set while iteration will make you skip the next key #60

What's not working yet, but can be

  • bigint bigger than 64 bit

What's probably never going to work

  • Anything that cannot go into JSON.stringify
  • Symbol

If you came this far, you better also look at:

More Repositories

1

typescript-monorepo-toolkit

CLI tool to automate typescript mono-repo management
TypeScript
38
star
2

ts-composite-babel-loader-webpack

Example project how to setup babel to build your typescript with project references, and keep good DX
TypeScript
7
star
3

sticky-eurovision

Sticky Eurovision: Technology Demonstrator for css sticky, dom virtualization, and react hooks
TypeScript
7
star
4

typescript3p8-prettier-eslint-example

Example integration of typescript 3.8 syntax features, prettier, eslint, React
TypeScript
5
star
5

use-dispose-uncommitted

Provide eventual callback for when react decides not to commit rendered component
TypeScript
5
star
6

CrossRequire

Use AMD & requirejs on Crossrider platform
JavaScript
4
star
7

nameless-router

Nameless Router - Routing micro library
TypeScript
4
star
8

Scrollormance

Scrollormance: Custom scrollbar with uber performance
JavaScript
4
star
9

PhpIcqClient

PHP
2
star
10

vagrant-webdriver-collection

vagrant webdriver collection
JavaScript
2
star
11

anyway-polygons-inserter

JavaScript
1
star
12

anyway-data-service

Anyway data service
TypeScript
1
star
13

bnaya-jsil-typescript-june-2018

TypeScript
1
star
14

alps-H958-mods

Star B92/HDC GALAXY S3EX modded roms & Modding tools
Shell
1
star
15

nt-challenge

New Testament Challenge
TypeScript
1
star
16

my-wow-classic-addons

1
star
17

webpack5-twice-compile-why

JavaScript
1
star
18

gig-typescript-project-refs-babel

TypeScript
1
star
19

streaming-json-parsing-and-processing

streaming json parsing and processing
TypeScript
1
star
20

travis-vm-virt-test

VM Virtualization in Travis CI - A Test Build
1
star
21

demo-mongoose-implementation-nest-crud

Created with CodeSandbox
TypeScript
1
star