UNPKG

datum-focus

Version:

Data shape, model, metadata, JSON, JSON Schema, GraphQL, MongoDB query and aggregations, iterator generators

54 lines (48 loc) 1.29 kB
import { ObjectId } from "bson"; import { hexSeconds } from "./object-id-timestamp"; export const cyrb53 = function (str: string, seed = 0) { let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; for (let i = 0, ch; i < str.length; i++) { ch = str.charCodeAt(i); h1 = Math.imul(h1 ^ ch, 2654435761); h2 = Math.imul(h2 ^ ch, 1597334677); } h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909); h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909); return 4294967296 * (2097151 & h2) + (h1 >>> 0); }; export const cloneObjectId = ( _id: ObjectId, timestamp?: number | string ): ObjectId => { if (!timestamp) { timestamp = Date.now(); } return new ObjectId(hexSeconds(timestamp) + _id.toHexString().substr(8)); }; export const createObjectId = ( key: string, timestamp?: number | string ): ObjectId => { if (!timestamp) { timestamp = Date.now(); } return new ObjectId( hexSeconds(timestamp) + cyrb53(key).toString(16).padStart(16, "0") ); }; export const OBJECT_ID_MASK = { $bit: { _id: { and: 0x00000000ffffffffffffffff, }, }, }; export const filterObjectId = (key: string) => ({ $eq: [cyrb53(key), OBJECT_ID_MASK], });