@electric-sql/d2mini
Version:
D2Mini is a minimal implementation of Differential Dataflow for performing in-memory incremental view maintenance.
87 lines • 2.73 kB
JavaScript
import murmurhash from 'murmurhash-js';
/**
* A map that returns a default value for keys that are not present.
*/
export class DefaultMap extends Map {
defaultValue;
constructor(defaultValue, entries) {
super(entries);
this.defaultValue = defaultValue;
}
get(key) {
if (!this.has(key)) {
this.set(key, this.defaultValue());
}
return super.get(key);
}
/**
* Update the value for a key using a function.
*/
update(key, updater) {
const value = this.get(key);
const newValue = updater(value);
this.set(key, newValue);
return newValue;
}
}
// JS engines have various limits on how many args can be passed to a function
// with a spread operator, so we need to split the operation into chunks
// 32767 is the max for Chrome 14, all others are higher
// TODO: investigate the performance of this and other approaches
const chunkSize = 30000;
export function chunkedArrayPush(array, other) {
if (other.length <= chunkSize) {
array.push(...other);
}
else {
for (let i = 0; i < other.length; i += chunkSize) {
const chunk = other.slice(i, i + chunkSize);
array.push(...chunk);
}
}
}
const hashCache = new WeakMap();
/**
* Replacer function for JSON.stringify that converts unsupported types to strings
*/
function hashReplacer(_key, value) {
if (typeof value === 'bigint') {
return String(value);
}
else if (typeof value === 'symbol') {
return String(value);
}
else if (typeof value === 'function') {
return String(value);
}
else if (value === undefined) {
return 'undefined';
}
else if (value instanceof Map) {
return `Map(${JSON.stringify(Array.from(value.entries()), hashReplacer)})`;
}
else if (value instanceof Set) {
return `Set(${JSON.stringify(Array.from(value.values()), hashReplacer)})`;
}
return value;
}
/**
* A hash method that caches the hash of a value in a week map
*/
export function hash(data) {
if (data === null ||
data === undefined ||
(typeof data !== 'object' && typeof data !== 'function')) {
// Can't be cached in the weak map because it's not an object
const serialized = JSON.stringify(data, hashReplacer);
return murmurhash.murmur3(serialized).toString(16);
}
if (hashCache.has(data)) {
return hashCache.get(data);
}
const serialized = JSON.stringify(data, hashReplacer);
const hashValue = murmurhash.murmur3(JSON.stringify(serialized)).toString(16);
hashCache.set(data, hashValue);
return hashValue;
}
//# sourceMappingURL=utils.js.map