From edc068ce09ddd759280719351d1d71f6319e531c Mon Sep 17 00:00:00 2001 From: Delirium Date: Wed, 3 Apr 2024 11:07:29 +0200 Subject: [PATCH] fix tracker speed up redux plugin hashing (#2027) * feat tracker update redux plugin to speed up state hashing * feat tracker update redux plugin to speed up state hashing --- tracker/tracker-redux/bun.lockb | Bin 0 -> 221409 bytes tracker/tracker-redux/package.json | 5 +- tracker/tracker-redux/src/index.ts | 35 +++- .../src/syncod-v2}/chars.ts | 0 .../src/syncod-v2}/decoder.ts | 0 .../src/syncod-v2}/encoder.ts | 0 .../src/syncod-v2}/index.ts | 0 .../src/syncod-v2}/mur.ts | 0 .../src/{syncod => syncod-v2}/sha1.ts | 0 .../tracker-redux/src/syncod-v2/types.d.ts | 20 +++ tracker/tracker-redux/src/syncod/index.ts | 5 - tracker/tracker-redux/tsconfig.json | 7 +- tracker/tracker-zustand/package.json | 6 +- tracker/tracker-zustand/src/index.ts | 2 +- .../src/syncod-v2}/chars.ts | 2 +- .../tracker-zustand/src/syncod-v2/decoder.ts | 79 +++++++++ .../src/syncod-v2}/encoder.ts | 126 ++------------ .../tracker-zustand/src/syncod-v2/index.ts | 6 + tracker/tracker-zustand/src/syncod-v2/mur.ts | 162 ++++++++++++++++++ .../src/syncod-v2/{src => }/sha1.ts | 0 tracker/tracker/src/main/tsconfig.json | 2 +- 21 files changed, 324 insertions(+), 133 deletions(-) create mode 100755 tracker/tracker-redux/bun.lockb rename tracker/{tracker-zustand/src/syncod-v2/src => tracker-redux/src/syncod-v2}/chars.ts (100%) rename tracker/{tracker-zustand/src/syncod-v2/src => tracker-redux/src/syncod-v2}/decoder.ts (100%) rename tracker/{tracker-zustand/src/syncod-v2/src => tracker-redux/src/syncod-v2}/encoder.ts (100%) rename tracker/{tracker-zustand/src/syncod-v2/src => tracker-redux/src/syncod-v2}/index.ts (100%) rename tracker/{tracker-zustand/src/syncod-v2/src => tracker-redux/src/syncod-v2}/mur.ts (100%) rename tracker/tracker-redux/src/{syncod => syncod-v2}/sha1.ts (100%) create mode 100644 tracker/tracker-redux/src/syncod-v2/types.d.ts delete mode 100644 tracker/tracker-redux/src/syncod/index.ts rename tracker/{tracker-redux/src/syncod => tracker-zustand/src/syncod-v2}/chars.ts (84%) create mode 100644 tracker/tracker-zustand/src/syncod-v2/decoder.ts rename tracker/{tracker-redux/src/syncod => tracker-zustand/src/syncod-v2}/encoder.ts (59%) create mode 100644 tracker/tracker-zustand/src/syncod-v2/index.ts create mode 100644 tracker/tracker-zustand/src/syncod-v2/mur.ts rename tracker/tracker-zustand/src/syncod-v2/{src => }/sha1.ts (100%) diff --git a/tracker/tracker-redux/bun.lockb b/tracker/tracker-redux/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..11aa2cfad5019ab47afebfadf4573028f0ce1dc7 GIT binary patch literal 221409 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 literal 0 HcmV?d00001 diff --git a/tracker/tracker-redux/package.json b/tracker/tracker-redux/package.json index 399832d15..c7222d84e 100644 --- a/tracker/tracker-redux/package.json +++ b/tracker/tracker-redux/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-redux", "description": "Tracker plugin for Redux state recording", - "version": "3.5.1", + "version": "3.6.1-beta.2", "keywords": [ "redux", "logging", @@ -21,9 +21,8 @@ "build-cjs": "rm -Rf cjs && tsc --project tsconfig-cjs.json && echo '{ \"type\": \"commonjs\" }' > cjs/package.json && replace-in-files cjs/* --string='@openreplay/tracker' --replacement='@openreplay/tracker/cjs'", "prepublishOnly": "npm run build" }, - "dependencies": {}, "peerDependencies": { - "@openreplay/tracker": ">=3.5.0", + "@openreplay/tracker": ">=12.0.6", "redux": "^4.0.0" }, "devDependencies": { diff --git a/tracker/tracker-redux/src/index.ts b/tracker/tracker-redux/src/index.ts index dfc092d9c..ba9f101c0 100644 --- a/tracker/tracker-redux/src/index.ts +++ b/tracker/tracker-redux/src/index.ts @@ -1,11 +1,15 @@ import { App, Messages } from '@openreplay/tracker'; -import { Encoder, sha1 } from './syncod/index.js'; +import { Encoder, murmur } from './syncod-v2/index.js'; export interface Options { actionFilter: (action: any) => boolean; actionTransformer: (action: any) => any; // null will be ignored actionType: (action: any) => any; // empty string and non-string will be ignored stateTransformer: (state: any) => any; + stateUpdateBatching: { + enabled: boolean; + throttle: number; + } } export default function(opts: Partial = {}) { @@ -15,6 +19,10 @@ export default function(opts: Partial = {}) { actionTransformer: action => action, actionType: action => action.type, stateTransformer: state => state, + stateUpdateBatching: { + enabled: true, + throttle: 50, + } }, opts, ); @@ -22,10 +30,24 @@ export default function(opts: Partial = {}) { if (app === null) { return () => next => action => next(action); } - const encoder = new Encoder(sha1, 50); + const encoder = new Encoder(murmur, 50); app.attachStopCallback(() => { encoder.clear() }) + + let lastCommit: number; + let lastState: string | null = null; + + const batchEncoding = (state: Record) => { + if (!lastState || !lastCommit || Date.now() - lastCommit > options.stateUpdateBatching.throttle) { + const _state = encoder.encode(options.stateTransformer(state)); + lastCommit = Date.now(); + lastState = _state; + return _state; + } else { + return lastState + } + } return ({ getState }) => next => action => { if (!app.active() || !options.actionFilter(action)) { return next(action); @@ -39,10 +61,15 @@ export default function(opts: Partial = {}) { app.send(Messages.StateAction(type)); } const _action = encoder.encode(options.actionTransformer(action)); - const _state = encoder.encode(options.stateTransformer(getState())); + let _currState: string + if (options.stateUpdateBatching.enabled) { + _currState = batchEncoding(getState()); + } else { + _currState = encoder.encode(options.stateTransformer(getState())); + } const _table = encoder.commit(); for (let key in _table) app.send(Messages.OTable(key, _table[key])); - app.send(Messages.Redux(_action, _state, duration)); + app.send(Messages.Redux(_action, _currState, duration)); } catch { encoder.clear(); } diff --git a/tracker/tracker-zustand/src/syncod-v2/src/chars.ts b/tracker/tracker-redux/src/syncod-v2/chars.ts similarity index 100% rename from tracker/tracker-zustand/src/syncod-v2/src/chars.ts rename to tracker/tracker-redux/src/syncod-v2/chars.ts diff --git a/tracker/tracker-zustand/src/syncod-v2/src/decoder.ts b/tracker/tracker-redux/src/syncod-v2/decoder.ts similarity index 100% rename from tracker/tracker-zustand/src/syncod-v2/src/decoder.ts rename to tracker/tracker-redux/src/syncod-v2/decoder.ts diff --git a/tracker/tracker-zustand/src/syncod-v2/src/encoder.ts b/tracker/tracker-redux/src/syncod-v2/encoder.ts similarity index 100% rename from tracker/tracker-zustand/src/syncod-v2/src/encoder.ts rename to tracker/tracker-redux/src/syncod-v2/encoder.ts diff --git a/tracker/tracker-zustand/src/syncod-v2/src/index.ts b/tracker/tracker-redux/src/syncod-v2/index.ts similarity index 100% rename from tracker/tracker-zustand/src/syncod-v2/src/index.ts rename to tracker/tracker-redux/src/syncod-v2/index.ts diff --git a/tracker/tracker-zustand/src/syncod-v2/src/mur.ts b/tracker/tracker-redux/src/syncod-v2/mur.ts similarity index 100% rename from tracker/tracker-zustand/src/syncod-v2/src/mur.ts rename to tracker/tracker-redux/src/syncod-v2/mur.ts diff --git a/tracker/tracker-redux/src/syncod/sha1.ts b/tracker/tracker-redux/src/syncod-v2/sha1.ts similarity index 100% rename from tracker/tracker-redux/src/syncod/sha1.ts rename to tracker/tracker-redux/src/syncod-v2/sha1.ts diff --git a/tracker/tracker-redux/src/syncod-v2/types.d.ts b/tracker/tracker-redux/src/syncod-v2/types.d.ts new file mode 100644 index 000000000..5c028d7c9 --- /dev/null +++ b/tracker/tracker-redux/src/syncod-v2/types.d.ts @@ -0,0 +1,20 @@ +declare type HashFunction = (str: string) => string; +declare type Dict = { [key: string]: string }; + +export class Encoder { + constructor(hash: HashFunction, slen?: number); + commit(): Dict; + encode(obj: any): string; + clear(): void; +} + +export class Decoder { + constructor(); + set(ref: string, enc: string): void; + assign(dict: Dict): void; + decode(enc: string): any; + clear(): void; +} + +export const sha1: HashFunction; +export const murmur: HashFunction; diff --git a/tracker/tracker-redux/src/syncod/index.ts b/tracker/tracker-redux/src/syncod/index.ts deleted file mode 100644 index de6f7c64c..000000000 --- a/tracker/tracker-redux/src/syncod/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -// TODO: SSR solution for all asayer libraries -import Encoder from "./encoder.js"; -import sha1 from "./sha1.js"; - -export { Encoder, sha1 }; diff --git a/tracker/tracker-redux/tsconfig.json b/tracker/tracker-redux/tsconfig.json index ce07a685b..8e9021fe0 100644 --- a/tracker/tracker-redux/tsconfig.json +++ b/tracker/tracker-redux/tsconfig.json @@ -3,10 +3,11 @@ "noImplicitThis": true, "strictNullChecks": true, "alwaysStrict": true, - "target": "es6", + "target": "es2020", "module": "es6", - "moduleResolution": "node", + "moduleResolution": "nodenext", "declaration": true, - "outDir": "./lib" + "outDir": "./lib", + "lib": ["es2020", "dom"] } } diff --git a/tracker/tracker-zustand/package.json b/tracker/tracker-zustand/package.json index 9922e0884..a1c4dfa93 100644 --- a/tracker/tracker-zustand/package.json +++ b/tracker/tracker-zustand/package.json @@ -1,7 +1,7 @@ { "name": "@openreplay/tracker-zustand", "description": "Tracker plugin for Zustand state recording", - "version": "1.1.0", + "version": "1.1.1", "keywords": [ "zustand", "state", @@ -22,7 +22,9 @@ "build-cjs": "rm -Rf cjs && tsc --project tsconfig-cjs.json && echo '{ \"type\": \"commonjs\" }' > cjs/package.json && replace-in-files cjs/* --string='@openreplay/tracker' --replacement='@openreplay/tracker/cjs'", "prepublishOnly": "npm run build" }, - "dependencies": { "zustand": "^4.5.2" }, + "dependencies": { + "zustand": "^4.5.2" + }, "peerDependencies": { "@openreplay/tracker": ">=12.0.0" }, diff --git a/tracker/tracker-zustand/src/index.ts b/tracker/tracker-zustand/src/index.ts index 085273fb2..4e8fb43e7 100644 --- a/tracker/tracker-zustand/src/index.ts +++ b/tracker/tracker-zustand/src/index.ts @@ -1,5 +1,5 @@ import { App, Messages } from "@openreplay/tracker"; -import { Encoder, murmur } from "./syncod-v2/src/index.js"; +import { Encoder, murmur } from "./syncod-v2/index.js"; import { StateCreator, StoreMutatorIdentifier } from "zustand"; export type StateLogger = < diff --git a/tracker/tracker-redux/src/syncod/chars.ts b/tracker/tracker-zustand/src/syncod-v2/chars.ts similarity index 84% rename from tracker/tracker-redux/src/syncod/chars.ts rename to tracker/tracker-zustand/src/syncod-v2/chars.ts index ed0d4d0c5..446daec5f 100644 --- a/tracker/tracker-redux/src/syncod/chars.ts +++ b/tracker/tracker-zustand/src/syncod-v2/chars.ts @@ -1,4 +1,4 @@ -const chars = {}; +const chars: Record = {}; [ "DEL", diff --git a/tracker/tracker-zustand/src/syncod-v2/decoder.ts b/tracker/tracker-zustand/src/syncod-v2/decoder.ts new file mode 100644 index 000000000..e4575c72a --- /dev/null +++ b/tracker/tracker-zustand/src/syncod-v2/decoder.ts @@ -0,0 +1,79 @@ +import _ from "./chars.js"; + +export default class Decoder { + _dict: Map; + constructor() { + this._dict = new Map(); + } + + set(ref, enc) { + this._dict.set(ref, enc); + } + + assign(dict) { + for (let ref in dict) { + this._dict.set(ref, dict[ref]); + } + } + + clear() { + this._dict.clear(); + } + + _unref_str(str) { + let s = this._dict.get(str); + if (s !== undefined) { + return s; + } + return str; + } + + decode(enc) { + const p = enc[0], + b = enc.slice(1); + switch (p) { + case _.UNDEF: + return undefined; + case _.TRUE: + return true; + case _.FALSE: + return false; + case _.FUNCTION: + return Function.prototype; + case _.NUMBER: + return parseFloat(b); + case _.BIGINT: + return BigInt(b); + case _.STRING: + return this._unref_str(b); + case _.SYMBOL: + return Symbol(this._unref_str(b)); + case _.NULL: + return null; + } + const unref = this._dict.get(b); + if (unref === undefined) { + throw "index missing code"; + } + if (typeof unref === "object") { + return unref; + } + const args = unref.length === 0 ? [] : unref.split(_.DEL); + switch (p) { + case _.ARRAY: + this._dict.set(b, args); + for (let i = 0; i < args.length; i++) { + args[i] = this.decode(args[i]); + } + return args; + case _.OBJECT: + const obj = {}; + this._dict.set(b, obj); + for (let i = 0; i < args.length; i += 2) { + obj[this._unref_str(args[i])] = this.decode(args[i + 1]); + } + return obj; + } + throw "unrecognized prefix"; + } +} diff --git a/tracker/tracker-redux/src/syncod/encoder.ts b/tracker/tracker-zustand/src/syncod-v2/encoder.ts similarity index 59% rename from tracker/tracker-redux/src/syncod/encoder.ts rename to tracker/tracker-zustand/src/syncod-v2/encoder.ts index db531a0b2..cdfae2158 100644 --- a/tracker/tracker-redux/src/syncod/encoder.ts +++ b/tracker/tracker-zustand/src/syncod-v2/encoder.ts @@ -1,220 +1,120 @@ import _ from "./chars.js"; -// @ts-ignore -// @ts-ignore +type HashFunction = (str: string) => string; + export default class Encoder { -// @ts-ignore - constructor(hash, slen = Infinity) { -// @ts-ignore + _hash: HashFunction; + _slen: number; + _refmap: Map; + _refset: Set; + + constructor(hash: HashFunction, slen = Infinity) { this._hash = hash; -// @ts-ignore this._slen = slen; -// @ts-ignore this._refmap = new Map(); -// @ts-ignore this._refset = new Set(); -// @ts-ignore } -// @ts-ignore -// @ts-ignore _ref_str(str) { -// @ts-ignore - if (str.length < this._slen && str.indexOf(_.DEL) === -1) { -// @ts-ignore + if (str.length < this._slen && !str.includes(_.DEL)) { return str; -// @ts-ignore } -// @ts-ignore let ref = this._refmap.get(str); -// @ts-ignore if (ref === undefined) { -// @ts-ignore ref = this._hash(str); -// @ts-ignore this._refmap.set(str, ref); -// @ts-ignore } -// @ts-ignore return ref; -// @ts-ignore } -// @ts-ignore -// @ts-ignore _encode_prim(obj) { -// @ts-ignore - switch (typeof obj) { -// @ts-ignore + const type = typeof obj; + switch (type) { case "undefined": -// @ts-ignore return _.UNDEF; -// @ts-ignore case "boolean": -// @ts-ignore return obj ? _.TRUE : _.FALSE; -// @ts-ignore case "number": -// @ts-ignore return _.NUMBER + obj.toString(); -// @ts-ignore case "bigint": -// @ts-ignore return _.BIGINT + obj.toString(); -// @ts-ignore case "function": -// @ts-ignore return _.FUNCTION; -// @ts-ignore case "string": -// @ts-ignore return _.STRING + this._ref_str(obj); -// @ts-ignore case "symbol": -// @ts-ignore return _.SYMBOL + this._ref_str(obj.toString().slice(7, -1)); -// @ts-ignore } -// @ts-ignore if (obj === null) { -// @ts-ignore return _.NULL; -// @ts-ignore } -// @ts-ignore } -// @ts-ignore -// @ts-ignore _encode_obj(obj, ref = this._refmap.get(obj)) { -// @ts-ignore return (Array.isArray(obj) ? _.ARRAY : _.OBJECT) + ref; -// @ts-ignore } -// @ts-ignore -// @ts-ignore _encode_term(obj) { -// @ts-ignore return this._encode_prim(obj) || this._encode_obj(obj); -// @ts-ignore } -// @ts-ignore -// @ts-ignore _encode_deep(obj, depth) { -// @ts-ignore const enc = this._encode_prim(obj); -// @ts-ignore if (enc !== undefined) { -// @ts-ignore return enc; -// @ts-ignore } -// @ts-ignore const ref = this._refmap.get(obj); -// @ts-ignore switch (typeof ref) { -// @ts-ignore case "number": -// @ts-ignore return (depth - ref).toString(); -// @ts-ignore case "string": -// @ts-ignore return this._encode_obj(obj, ref); -// @ts-ignore } -// @ts-ignore this._refmap.set(obj, depth); -// @ts-ignore + const hash = this._hash( -// @ts-ignore (Array.isArray(obj) -// @ts-ignore ? obj.map(v => this._encode_deep(v, depth + 1)) -// @ts-ignore : Object.keys(obj) -// @ts-ignore .sort() -// @ts-ignore .map( -// @ts-ignore k => -// @ts-ignore this._ref_str(k) + _.DEL + this._encode_deep(obj[k], depth + 1) -// @ts-ignore ) -// @ts-ignore ).join(_.DEL) -// @ts-ignore ); -// @ts-ignore + this._refmap.set(obj, hash); -// @ts-ignore return this._encode_obj(obj, hash); -// @ts-ignore } -// @ts-ignore -// @ts-ignore encode(obj) { -// @ts-ignore return this._encode_deep(obj, 0); -// @ts-ignore } -// @ts-ignore -// @ts-ignore commit() { -// @ts-ignore const dict = {}; -// @ts-ignore this._refmap.forEach((ref, obj) => { -// @ts-ignore if (this._refset.has(ref)) { -// @ts-ignore return; -// @ts-ignore } -// @ts-ignore this._refset.add(ref); -// @ts-ignore if (typeof obj !== "string") { -// @ts-ignore obj = (Array.isArray(obj) -// @ts-ignore ? obj.map(v => this._encode_term(v)) -// @ts-ignore : Object.keys(obj).map( -// @ts-ignore k => this._ref_str(k) + _.DEL + this._encode_term(obj[k]) -// @ts-ignore ) -// @ts-ignore ).join(_.DEL); -// @ts-ignore } -// @ts-ignore dict[ref] = obj; -// @ts-ignore }); -// @ts-ignore this._refmap.clear(); -// @ts-ignore return dict; -// @ts-ignore } -// @ts-ignore -// @ts-ignore clear() { -// @ts-ignore this._refmap.clear(); -// @ts-ignore this._refset.clear(); -// @ts-ignore } -// @ts-ignore } -// @ts-ignore diff --git a/tracker/tracker-zustand/src/syncod-v2/index.ts b/tracker/tracker-zustand/src/syncod-v2/index.ts new file mode 100644 index 000000000..05beb0cb7 --- /dev/null +++ b/tracker/tracker-zustand/src/syncod-v2/index.ts @@ -0,0 +1,6 @@ +import Encoder from "./encoder.js"; +import Decoder from "./decoder.js"; +import sha1 from "./sha1.js"; +import murmur from "./mur.js"; + +export { Encoder, Decoder, sha1, murmur }; diff --git a/tracker/tracker-zustand/src/syncod-v2/mur.ts b/tracker/tracker-zustand/src/syncod-v2/mur.ts new file mode 100644 index 000000000..62b956c38 --- /dev/null +++ b/tracker/tracker-zustand/src/syncod-v2/mur.ts @@ -0,0 +1,162 @@ +function murmurhash3_32_rp(key, seed) { + var keyLength, tailLength, tailLength4, bodyLength, bodyLength8, h1, k1, i, c1_low, c1_high, c2_low, c2_high, k1B, c3; + keyLength = key.length; + tailLength = keyLength & 3; + bodyLength = keyLength - tailLength; + tailLength4 = bodyLength & 7; + bodyLength8 = bodyLength - tailLength4; + h1 = seed; + + //c1 = 0xcc9e2d51; + c1_low = 0x2d51; + c1_high = 0xcc9e0000; + + //c2 = 0x1b873593; + c2_low = 0x3593; + c2_high = 0x1b870000; + + c3 = 0xe6546b64; + + + //---------- + // body + + i = 0; + + while (i < bodyLength8) { + + k1 = + ((key.charCodeAt(i) & 0xff)) | + ((key.charCodeAt(++i) & 0xff) << 8) | + ((key.charCodeAt(++i) & 0xff) << 16) | + ((key.charCodeAt(++i) & 0xff) << 24); + + k1B = + ((key.charCodeAt(++i) & 0xff)) | + ((key.charCodeAt(++i) & 0xff) << 8) | + ((key.charCodeAt(++i) & 0xff) << 16) | + ((key.charCodeAt(++i) & 0xff) << 24); + + ++i; + + + //k1 *= c1; + k1 = (c1_high * k1 | 0) + (c1_low * k1); + //k1 = ROTL32(k1,15); + k1 = (k1 << 15) | (k1 >>> 17); + //k1 *= c2; + k1 = (c2_high * k1 | 0) + (c2_low * k1); + + //h1 ^= k1; + h1 ^= k1; + //h1 = ROTL32(h1,13); + h1 = (h1 << 13) | (h1 >>> 19); + //h1 = h1*5+0xe6546b64; + h1 = h1 * 5 + c3; + + + //k1 *= c1; + k1B = (c1_high * k1B | 0) + (c1_low * k1B); + //k1 = ROTL32(k1,15); + k1B = (k1B << 15) | (k1B >>> 17); + //k1 *= c2; + k1B = (c2_high * k1B | 0) + (c2_low * k1B); + + //h1 ^= k1; + h1 ^= k1B; + //h1 = ROTL32(h1,13); + h1 = (h1 << 13) | (h1 >>> 19); + //h1 = h1*5+0xe6546b64; + h1 = h1 * 5 + c3; + + } //while (i < bodyLength8) { + + + if (tailLength4) { + + k1 = + ((key.charCodeAt(i) & 0xff)) | + ((key.charCodeAt(++i) & 0xff) << 8) | + ((key.charCodeAt(++i) & 0xff) << 16) | + ((key.charCodeAt(++i) & 0xff) << 24); + + ++i; + + //k1 *= c1; + k1 = (c1_high * k1 | 0) + (c1_low * k1); + //k1 = ROTL32(k1,15); + k1 = (k1 << 15) | (k1 >>> 17); + //k1 *= c2; + k1 = (c2_high * k1 | 0) + (c2_low * k1); + + //h1 ^= k1; + h1 ^= k1; + //h1 = ROTL32(h1,13); + h1 = (h1 << 13) | (h1 >>> 19); + //h1 = h1*5+0xe6546b64; + h1 = h1 * 5 + c3; + + } //if (tailLength4) { + + + //---------- + // tail + + k1 = 0; + + switch (tailLength) { + + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; + case 1: k1 ^= (key.charCodeAt(i) & 0xff); + + //k1 *= c1; + k1 = (c1_high * k1 | 0) + (c1_low * k1); + //k1 = ROTL32(k1,15); + k1 = (k1 << 15) | (k1 >>> 17); + //k1 *= c2; + k1 = (c2_high * k1 | 0) + (c2_low * k1); + //h1 ^= k1; + h1 ^= k1; + + } //switch (tailLength) { + + + //---------- + // finalization + + h1 ^= keyLength; + + //h1 = fmix32(h1); + { + //h ^= h >> 16; + h1 ^= h1 >>> 16; + //h1 *= 0x85ebca6b; + h1 = (0x85eb0000 * h1 | 0) + (0xca6b * h1); + //h ^= h >> 13; + h1 ^= h1 >>> 13; + //h1 *= 0xc2b2ae35; + h1 = (0xc2b20000 * h1 | 0) + (0xae35 * h1); + //h ^= h >> 16; + h1 ^= h1 >>> 16; + } + + + return h1 >>> 0; //convert to unsigned int + +} + + +function murmurHash3ToBase64(key, seed = 0) { + let hashValue = murmurhash3_32_rp(key, seed); + return hashToBase64(hashValue); +} + +function hashToBase64(hash) { + let buffer = new ArrayBuffer(4); // 32 bits for hash + let view = new DataView(buffer); + view.setUint32(0, hash, false); // Use big-endian + return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer))); +} + +export default murmurHash3ToBase64; diff --git a/tracker/tracker-zustand/src/syncod-v2/src/sha1.ts b/tracker/tracker-zustand/src/syncod-v2/sha1.ts similarity index 100% rename from tracker/tracker-zustand/src/syncod-v2/src/sha1.ts rename to tracker/tracker-zustand/src/syncod-v2/sha1.ts diff --git a/tracker/tracker/src/main/tsconfig.json b/tracker/tracker/src/main/tsconfig.json index b28794fe5..4a55e8b55 100644 --- a/tracker/tracker/src/main/tsconfig.json +++ b/tracker/tracker/src/main/tsconfig.json @@ -2,7 +2,7 @@ "extends": "../../tsconfig-base.json", "compilerOptions": { "allowSyntheticDefaultImports": true, - "lib": ["es2017", "dom"], + "lib": ["es2020", "dom"], "declaration": true }, "references": [{ "path": "../common" }]