aboutsummaryrefslogtreecommitdiff
path: root/src/serialization/v0.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialization/v0.ts')
-rw-r--r--src/serialization/v0.ts122
1 files changed, 0 insertions, 122 deletions
diff --git a/src/serialization/v0.ts b/src/serialization/v0.ts
deleted file mode 100644
index f90eb66..0000000
--- a/src/serialization/v0.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import * as Base from 'lib/base'
-import * as Icons from 'lib/icons'
-import * as State from 'state'
-import * as Utils from 'serialization/utils'
-
-const posPrecision: number = 5
-const latLength: number = Base.encode(BigInt(`180${'0'.repeat(posPrecision)}`), Base.b2).length
-const lngLength: number = Base.encode(BigInt(`360${'0'.repeat(posPrecision)}`), Base.b2).length
-const colorLength: number = Base.encode(Base.decode('ffffff', Base.b16), Base.b2).length
-const iconLength: number = 8 // At most 255 icons
-const radiusLength: number = 5
-
-// Encoding
-
-export function encode(s: State.State): string[] {
- return s.map(encodeMarker)
-}
-
-function encodeMarker({ pos, name, color, icon, radius }: State.Marker): string {
- const lat = encodeLatOrLng(pos.lat, latLength, 180) // [-90; 90]
- const lng = encodeLatOrLng(pos.lng, lngLength, 360) // [-180; 180]
- return lat + lng + encodeColor(color) + encodeIcon(icon) + encodeRadius(radius) + encodeName(name)
-}
-
-// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
-export const uriComponentBase: string[] =
- '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_.!~*\'()%'.split('')
-
-function encodeLatOrLng(n: number, length: number, range: number): string {
- const [a, b] = Utils.mod(n + range / 2, range).toFixed(posPrecision).split('.')
- return Utils.encodeNumber(BigInt(a + b), length)
-}
-
-function encodeColor(color: string): string {
- return Utils.encodeNumber(Base.decode(color.slice(1).toLowerCase(), Base.b16), colorLength)
-}
-
-function encodeIcon(icon: string): string {
- return icon == ''
- ? '0'
- : `1${Utils.encodeNumber(BigInt(Icons.keys().indexOf(icon) + 1), iconLength)}`
-}
-
-function encodeRadius(radius: number): string {
- if (radius == 0) {
- return '0'
- } else {
- const binary = Base.encode(BigInt(radius), Base.b2)
- const binaryLength = Utils.encodeNumber(BigInt(binary.length), radiusLength)
- return `1${binaryLength}${binary}`
- }
-}
-
-function encodeName(str: string): string {
- return str == ''
- ? ''
- : Base.encode(Base.decode(encodeURIComponent(str), uriComponentBase), Base.b2)
-}
-
-// Decoding
-
-export function decode(encoded: string[]): State.State {
- return encoded.map(binary => {
- const [ lat, i1 ] = decodeLatOrLng(binary, 0, latLength, 180)
- const [ lng, i2 ] = decodeLatOrLng(binary, i1, lngLength, 360)
- const [ color, i3 ] = decodeColor(binary, i2)
- const [ icon, i4 ] = decodeIcon(binary, i3)
- const [ radius, i5 ] = decodeRadius(binary, i4)
- const name = decodeName(binary, i5)
-
- return {
- pos: { lat, lng },
- name,
- color,
- icon,
- radius,
- }
- })
-}
-
-function decodeLatOrLng(encoded: string, i: number, length: number, range: number): [number, number] {
- const slice = encoded.slice(i, i + length)
- const digits = Base.decode(slice, Base.b2).toString()
- const latOrLng = parseFloat(`${digits.slice(0, -posPrecision)}.${digits.slice(-posPrecision)}`) - range / 2
- return [ latOrLng, i + length ]
-}
-
-function decodeColor(encoded: string, i: number): [ string, number ] {
- const slice = encoded.slice(i, i + colorLength)
- const color = `#${Base.encode(Base.decode(slice, Base.b2), Base.b16)}`
- return [ color, i + colorLength ]
-}
-
-function decodeIcon(encoded: string, i: number): [ string, number ] {
- if (encoded.slice(i, i + 1) == '0') {
- return [ '', i + 1 ]
- } else {
- const slice = encoded.slice(i + 1, i + 1 + iconLength)
- const iconIndex = Number(Base.decode(slice, Base.b2)) - 1
- const icon = iconIndex < 0 ? '' : Icons.keys()[iconIndex]
- return [ icon, i + 1 + iconLength ]
- }
-}
-
-function decodeRadius(encoded: string, i: number): [ number, number ] {
- if (encoded.slice(i, i + 1) == '0') {
- return [ 0, i + 1 ]
- } else {
- const binaryLength = encoded.slice(i + 1, i + 1 + radiusLength)
- const length = Number(Base.decode(binaryLength, Base.b2))
- const binary = encoded.slice(i + 1 + radiusLength, i + 1 + radiusLength + length)
- const radius = Number(Base.decode(binary, Base.b2))
- return [ radius, i + 1 + radiusLength + length ]
- }
-}
-
-function decodeName(encoded: string, i: number): string {
- const slice = encoded.slice(i)
- return slice == ''
- ? ''
- : decodeURIComponent(Base.encode(Base.decode(slice, Base.b2), uriComponentBase))
-}