mapbox / pbf

A low-level, lightweight protocol buffers implementation in JavaScript.
BSD 3-Clause "New" or "Revised" License
796 stars 106 forks source link

[WIP] Handling unsafe integers #115

Open zachasme opened 4 years ago

zachasme commented 4 years ago

Hi there!

This is related to #44 and mostly intended to initiate a discussion about integers larger than MAX_SAFE_INTEGER.

It is also the result of me trying to figure out why managing a single feature (from a vector source) on my Mapbox GL map sometimes affected multiple features.

The problem, as far as I can tell, is that there is no distinction between 32bit and 64bit varint. That means subtle bugs may (silently) be introduced when (de)serializing numbers above MAX_SAFE_INTEGER (2^53 - 1).

In my case the features on my map are hexagons based on Ubers h3 hierarchical grid (represented using uint64 ids, and generated using PostGIS' ST_AsMVT). When setting feature state on some of the higher resolution hexagons, the equally check breaks and multiple cells are affected even though their ids are unique (in the protobuf).

I can't see any way to solve this without introducing a breaking change that represents 64bit integers as either strings, number arrays or BigInt.

This PR uses BigInt because it was the simplest, but as stated earlier I am mostly interested in your thoughts on the issue. My goal is to achieve support for uint64 ids Mapbox GL JS vector sources.

zachasme commented 3 years ago

BigInt support has landed in Safari.

Any thoughts on the PR?