@astarship/subsecond-id 0.0.0-stage → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../Source/SsId.ts","../Source/SsLId.ts","../Source/SsUId.ts","../Source/index.ts"],"sourcesContent":["// Copyright AStarship <https://astarship.net>.\nimport { RNG, SsId, SsIdSourceBits, SsIdTickerBits,\n SsIdTickerMax, SsIdHotTimestampBits, SsIdHotMsb, SsIdHotTimestampMax,\n TimestampSeconds, SubsecondIdSourceMax } from './'\n\n//--- Variables ---//\n\n// The subsecond ticker count (0 to SsIdTickerMax = 255, 8-bit field).\nexport let SsIdTicker_ = 0\n\n// The last ID produced (for monotonicity on clock stalls).\nexport let SsIdLastId_: SsId = 0n\n\n// The stable 28-bit source identity for this minter. Set via SsIdSetSource().\n// Default 0. A server should configure a fixed source id (its identity) so\n// minted ids embed provenance: which server produced them.\nexport let SsIdSource_ = 0\n\n// Configures the 28-bit source identity used by SsIdNext (stable per minter).\nexport function SsIdSetSource(source: number): void {\n if (source < 0 || source > SubsecondIdSourceMax) {\n throw new RangeError(`SsId source out of range: ${source}`)\n }\n SsIdSource_ = source\n}\n\n// Returns the currently configured source identity.\nexport function SsIdGetSource(): number {\n return SsIdSource_\n}\n\n//--- SsId ---//\n\n//--- Calendar windowing (Hot UUID resets every 4 years) ---//\n\n// Seconds per (mean) year, used to align the window on a calendar-year\n// boundary. (A mean year avoids leap-year drift for window bookkeeping; the\n// exact filing date is recoverable from the ticker + record metadata.)\nexport const SsIdSecondsPerYear = 365.25 * 24 * 60 * 60 // 31,557,600\n\n// The 4-year Hot window length in seconds. The Hot UUID resets every 4 years.\nexport const SsIdFourYearSeconds = 4 * SsIdSecondsPerYear // 126,230,400\n\n// Aligns an absolute Unix time DOWN to the start of the 4-year window it falls\n// in, on a calendar-year basis (year floored to a multiple of 4). The Hot UUID\n// seconds field counts elapsed seconds from this window start, so it resets to\n// 0 at the top of every 4-year window (e.g. 2024, 2028, 2032).\nexport function SsIdWindowStart(now?: number): number {\n const t = now ?? TimestampSeconds()\n const Year = Math.floor(t / SsIdSecondsPerYear) // calendar year index\n const WindowYear = (Math.floor(Year / 4) * 4) * SsIdSecondsPerYear\n return Math.floor(WindowYear)\n}\n\n// Returns the 4-year window index for an absolute time (2024..2027 -> 0).\nexport function SsIdWindowCount(now?: number): number {\n const t = now ?? TimestampSeconds()\n return Math.floor(Math.floor(t / SsIdSecondsPerYear) / 4)\n}\n\n// Returns the next 64-bit SubsecondId (Hot UUID) for a case filing.\n//\n// Bit layout per Clock.md:\n// Hot UUID: [1-bit MSb | 27-bit seconds | 8-bit ticker | 28-bit source]\n//\n// The seconds field counts elapsed seconds from the start of the current\n// 4-year calendar window (year rolled down to a multiple of 4). The source\n// field is the stable configured server identity (anti-fraud provenance). The\n// ticker increments (wrapping each second) for intra-second uniqueness.\nexport function SsIdNext(_rng?: RNG): SsId {\n const Ticker_ = SsIdTicker_\n const Ticker = Ticker_ < SsIdTickerMax ?\n Ticker_ + 1 : SsIdResetTicker()\n SsIdTicker_ = Ticker\n\n // Seconds elapsed within the current 4-year window (0 .. ~1.26e8),\n // masked to the 27-bit field.\n const Seconds = (TimestampSeconds() - SsIdWindowStart()) & SsIdHotTimestampMax\n\n // Build the 64-bit ID using BigInt.\n const Id = (BigInt(SsIdHotMsb) << 63n) |\n (BigInt(Seconds) << 36n) |\n (BigInt(Ticker) << 28n) |\n BigInt(SsIdSource_)\n\n // Monotonicity must NOT corrupt the identity fields (source/seconds).\n // Within a second the ticker makes ids strictly increasing, so the only case\n // where Id <= SsIdLastId_ is a clock stall/rollback. In that case we advance\n // the TICKER (and only roll the seconds up if the ticker is exhausted),\n // preserving the source identity. We never add 1 to the whole 64-bit value\n // (which would carry into the source field and break provenance).\n if (Id <= SsIdLastId_) {\n const [LastSeconds, LastTicker] = SsIdUnpack(SsIdLastId_)\n let NewSeconds = LastSeconds\n let NewTicker = LastTicker + 1\n if (NewTicker > SsIdTickerMax) {\n NewTicker = 1\n NewSeconds = (LastSeconds + 1) & SsIdHotTimestampMax\n }\n const Stepped = (BigInt(SsIdHotMsb) << 63n) |\n (BigInt(NewSeconds) << 36n) |\n (BigInt(NewTicker) << 28n) |\n BigInt(SsIdSource_)\n SsIdLastId_ = Stepped\n SsIdTicker_ = NewTicker\n return Stepped\n }\n SsIdLastId_ = Id\n return Id\n}\n\n// Resets the 8-bit subsecond ticker and returns 1.\nexport function SsIdResetTicker(): number {\n SsIdTicker_ = 1\n return SsIdTicker_\n}\n\n// Packs a Hot UUID: [1-bit MSb | 27-bit seconds | 8-bit ticker | 28-bit source].\n// The 27-bit seconds field stores seconds elapsed from the Hot UUID epoch.\nexport function SsIdPack(timestamp: number, ticker: number, source: number): SsId {\n const sec = (timestamp & SsIdHotTimestampMax)\n return (BigInt(SsIdHotMsb) << 63n) |\n (BigInt(sec) << 36n) |\n (BigInt(ticker) << 28n) |\n BigInt(source)\n}\n\n// Unpacks a Hot UUID into [seconds, ticker, source].\nexport function SsIdUnpack(id: SsId): [number, number, number] {\n const seconds = Number((id >> 36n) & 0x7FFFFFFn)\n const ticker = Number((id >> 28n) & 0xFFn)\n const source = Number(id & 0x0FFFFFFFn)\n return [seconds, ticker, source]\n}\n\n// Extracts the 27-bit timestamp from a Hot UUID.\nexport function SsIdTimestamp(id: SsId): number {\n return SsIdUnpack(id)[0]\n}\n\n// Extracts the 8-bit subsecond ticker from a Hot UUID.\nexport function SsIdTicker(id: SsId): number {\n return SsIdUnpack(id)[1]\n}\n\n// Extracts the 28-bit source from a Hot UUID.\nexport function SsIdSource(id: SsId): number {\n return SsIdUnpack(id)[2]\n}\n\n// Returns the 1-bit MSb (Hot UUID flag) from a Hot UUID.\nexport function SsIdMsb(id: SsId): number {\n return Number((id >> 63n) & 1n)\n}\n\n//--- SsId Next Hex ---//\n\n// Returns the next 64-bit SubsecondId as a 16-character hex string.\nexport function SsIdNextHex(rng?: RNG): string {\n const HexCount = 16\n return SsIdNext(rng).toString(16).padStart(HexCount, '0')\n}\n\n//--- SsId Print ---//\n\n// Prints a Hot UUID to its canonical string form:\n// 1.27.8.28 (bit widths of the four fields)\nexport function SsIdPrint(id: SsId): string {\n const [seconds, ticker, source] = SsIdUnpack(id)\n return (\n (SsIdMsb(id)).toString().padStart(1, '0') + '.' +\n BinaryPadBits(seconds, SsIdHotTimestampBits) + '.' +\n BinaryPadBits(ticker, SsIdTickerBits) + '.' +\n BinaryPadBits(source, SsIdSourceBits)\n )\n}\n\n// Pads a number to the given bit count in binary.\nfunction BinaryPadBits(value: number, bits: number): string {\n return value.toString(2).padStart(bits, '0')\n}\n","// Copyright AStarship <https://astarship.net>.\nimport { SsLUId, TmtTickerMax, TimestampSeconds } from './'\n\n//--- Variables ---//\n\n// TMT subsecond ticker count (0 to 2^32-1).\nlet tmt_ticker: number = 0\n\n// Last time a TMT was created.\nlet tmt_timestamp: number = TimestampSeconds()\n\n//--- Functions ---//\n\n// Extracts the timestamp from a TMT (32-bit seconds).\n// The 64-bit TMT is a BigInt: (seconds << 32) | ticker.\nexport function SsLIdTimestamp(id: SsLUId): number {\n return Number(id >> 32n)\n}\n\n// Extracts the ticker count from a TMT (32-bit ticker).\nexport function SsLIdTicker(id: SsLUId): number {\n return Number(id & 0xFFFFFFFFn)\n}\n\n// Extracts the timestamp and ticker from a TMT.\nexport function SsLIdUnpack(id: SsLUId): [number, number] {\n return [SsLIdTimestamp(id), SsLIdTicker(id)]\n}\n\n// Packs a timestamp and ticker into a TMT.\n// TMT: [32-bit unsigned seconds | 32-bit subsecond ticker]\n// Uses BigInt for exact 64-bit representation.\nexport function SsLIdPack(timestamp: number, ticker: number): SsLUId {\n return (BigInt(timestamp) << 32n) | BigInt(ticker)\n}\n\n// Prints a TMT to a string.\nexport function SsLIdPrint(id: SsLUId): string {\n const [timestamp, ticker] = SsLIdUnpack(id)\n const time = new Date(timestamp * 1000)\n return 'TMT:{ ' + time.toISOString().split('T')[0] + ' tick:' + ticker + ' }'\n}\n\n// Generates the next TMT (64-bit Time Ticker).\n// Bit pattern: [32-bit unsigned seconds | 32-bit subsecond ticker]\nexport function SsLIdNext(): SsLUId {\n const timestamp = TimestampSeconds()\n let ticker = tmt_ticker\n\n if (timestamp !== tmt_timestamp) {\n tmt_timestamp = timestamp\n ticker = 0\n } else if (ticker >= TmtTickerMax) {\n // Ticker overflow: spin until next second.\n let now = timestamp\n while (now === tmt_timestamp) now = TimestampSeconds()\n tmt_timestamp = now\n ticker = 0\n }\n\n tmt_ticker = ticker + 1\n return SsLIdPack(timestamp, ticker)\n}\n\n// Generates the next TMT hex string.\nexport function SsLIdNextHex(): string {\n return SsLIdNext().toString(16).padStart(16, '0')\n}\n","// Copyright AStarship <https://astarship.net>.\nimport { SsUUId, RNG, BigIntInRange, BigIntToBuffer,\n SsUIdTimestampBits, SsUIdTickerBits, SsUIdSourceBits,\n SsUIdTickerMax, TimestampSeconds, TimestampSecondsNext, SsIdRng } from './'\n\n//--- Variables ---//\n\n// 76-bit random source id (generated on first use).\nlet uid_source: bigint = 0n\n\n// 16-bit subsecond ticker.\nlet uid_ticker: number = 0\n\n// Last time a SsUId was created.\nlet uid_timestamp: number = TimestampSeconds()\n\n// The last SSE produced (for monotonicity on clock stalls).\nlet uid_last_id: SsUUId = 0n\n\n//--- Functions ---//\n\n// Extracts the timestamp from a SSE (36-bit unsigned seconds).\nexport function SsUIdTimestamp(subsec_id: SsUUId): bigint {\n const shift = BigInt(SsUIdSourceBits + SsUIdTickerBits)\n return subsec_id >> shift\n}\n\n// Extracts the ticker count from a SSE (16-bit).\nexport function SsUIdTicker(subsec_id: SsUUId): bigint {\n const sourceBits = BigInt(SsUIdSourceBits)\n const mask = (1n << BigInt(SsUIdTickerBits)) - 1n\n return (subsec_id >> sourceBits) & mask\n}\n\n// Extracts the 76-bit random source id from a SSE.\nexport function SsUIdSource(subsec_id: SsUUId): bigint {\n const mask = (1n << BigInt(SsUIdSourceBits)) - 1n\n return subsec_id & mask\n}\n\n// Packs a timestamp, ticker, and source into a SSE.\n// SSE: [36-bit unsigned seconds | 16-bit subsecond ticker | 76-bit random id]\nexport function SsUIdPack(timestamp: bigint | number, ticker: bigint | number,\n source: bigint): SsUUId {\n const ts = BigInt(timestamp)\n const tk = BigInt(ticker)\n const shift = BigInt(SsUIdTickerBits + SsUIdSourceBits)\n return (ts << shift) | (tk << BigInt(SsUIdSourceBits)) | source\n}\n\n// Extracts the timestamp, ticker, and source from a SSE.\nexport function SsUIdUnpack(subsec_id: SsUUId): [bigint, bigint, bigint] {\n return [SsUIdTimestamp(subsec_id), SsUIdTicker(subsec_id), SsUIdSource(subsec_id)]\n}\n\n// Prints a SSE to a string.\nexport function SsUIdPrint(subsec_id: SsUUId): string {\n const [timestamp, ticker, source] = SsUIdUnpack(subsec_id)\n const time = new Date(Number(timestamp) * 1000)\n return 'SSE:{ timestamp: ' + time.toISOString().split('T')[0] +\n '\\n tick :' + ticker.toString() +\n '\\n source :' + source.toString(16) + ' }'\n}\n\n// Gets the current 76-bit source id.\nexport function SsUIdSourceId(): bigint {\n return uid_source\n}\n\n// Generates a cryptographically-secure random 76-bit source id.\n// Uses the module-level RNG (set via SsIdSetRng).\nexport function SsUIdSourceNext(rng?: RNG): void {\n const Rng = rng ?? SsIdRng\n let source = 0n\n while (source === 0n) {\n source = BigIntInRange(Rng, 1n, (1n << BigInt(SsUIdSourceBits)) - 1n)\n }\n uid_source = source\n}\n\n// Increments the source id (for collision recovery).\nexport function SsUIdSourceIncrement(): void {\n const max = (1n << BigInt(SsUIdSourceBits)) - 1n\n if (uid_source >= max) {\n uid_source = 1n\n } else {\n uid_source = uid_source + 1n\n }\n}\n\n/* Generates the next 128-bit SSE.\n Bit pattern: [36-bit unsigned seconds | 16-bit subsecond ticker | 76-bit random id]\n Uses the module-level RNG (set via SsIdSetRng). Pass a custom RNG\n as an argument to override for a single call. */\nexport function SsUIdNext(rng?: RNG): SsUUId {\n const Rng = rng ?? SsIdRng\n const timestamp = TimestampSeconds()\n let ticker = uid_ticker\n\n if (timestamp !== uid_timestamp) {\n uid_timestamp = timestamp\n ticker = 0\n } else if (ticker >= SsUIdTickerMax) {\n const next = TimestampSecondsNext()\n uid_timestamp = next\n ticker = 0\n }\n\n uid_ticker = ticker + 1\n\n if (uid_source === 0n) {\n SsUIdSourceNext(Rng)\n }\n\n const id = SsUIdPack(timestamp, ticker, uid_source)\n\n // Monotonicity: if the clock stalled or wrapped, ensure the ID\n // is at least last + 1. Without this, a second-boundary crossing\n // (ticker reset to 0) produces an ID lower than the previous one.\n if (id <= uid_last_id) {\n uid_last_id = uid_last_id + 1n\n return uid_last_id\n }\n uid_last_id = id\n return id\n}\n\n// Generates the next SSE as a hex string (32 hex chars = 128 bits).\nexport function SsUIdNextHex(rng?: RNG, dest: string = ''): string {\n return dest + SsUIdNext(rng).toString(16).padStart(32, '0')\n}\n\n/* Generates the next SSE as a Buffer (16 bytes = 128 bits).\n @return A Buffer containing the 16 bytes of the 128-bit id. */\nexport function SsUIdNextBuffer(rng?: RNG): Buffer {\n const id = SsUIdNext(rng)\n const buf = Buffer.alloc(16)\n for (let i = 0; i < 16; i++) {\n buf[i] = Number((id >> BigInt(i * 8)) & 0xFFn)\n }\n return buf\n}\n","// Copyright AStarship <https://astarship.net>.\n\nexport * from './SsId'\nexport * from './SsLId'\nexport * from './SsUId'\n\n//--- Types ---//\n\n// A 64-bit Subsecond Id.\nexport type SsId = bigint\n\n/* A 64-bit Subsecond Locally Unique Id. */\nexport type SsLUId = bigint\n\n// A 128-bit Subsecond Universally Unique Id.\nexport type SsUUId = bigint\n\n/* A function pointer type for recycling random numbers. */\nexport type NumberIOFun = (a: number) => number\n\n// Cryptographically-secure Random Number Generator function type.\nexport type RNG = (min: number, max: number) => number\n\n// The module-level RNG, used by SsIdNext, SsUIdNext, and friends.\n// Defaults to crypto.randomInt (cryptographically secure).\n// Call SsIdSetRng() to swap in a custom RNG (e.g. LSTMRNG).\n//\n// The RNG type is (min, max) => number, returning a value in [min, max].\n// The default wraps crypto.randomInt which is exclusive of max, so we\n// add 1. For ranges near 2^48 (the largest used by BigIntInRange),\n// max + 1 can reach 2^48 which exceeds crypto.randomInt's limit.\n// We handle this by generating the value in [0, 2^48) and offsetting.\nimport { randomInt as _cryptoRng } from 'crypto'\nexport let SsIdRng: RNG = (min: number, max: number): number => {\n // crypto.randomInt(min, max) is exclusive of max, and (max - min)\n // must be <= 2^48 - 1. Our RNG type is inclusive of max, so we\n // normally call _cryptoRng(min, max + 1).\n if (max + 1 < 2 ** 48) {\n return _cryptoRng(min, max + 1)\n }\n // max + 1 >= 2^48: the range exceeds crypto.randomInt's limit.\n // Generate 48 bits as two 24-bit halves (use * NOT << since\n // JS << wraps mod 32).\n const hi = _cryptoRng(0, 2 ** 24)\n const lo = _cryptoRng(0, 2 ** 24)\n const val = hi * (2 ** 24) + lo\n // If min > 0, offset into [min, min + 2^48) then clamp to max.\n // In practice min is always 0 for the 48-bit range calls.\n return Math.min(min + val, max)\n}\n\n// Swaps the module-level RNG. Pass a function that takes (min, max)\n// and returns a random integer in [min, max].\nexport function SsIdSetRng(rng: RNG): void {\n SsIdRng = rng\n}\n\n// Stores two sin-cos polar probability values -1 < x < 1.\nexport type Chance = {\n u: number,\n v: number\n}\n\n//--- Constants ---//\n\n// Number of bits in a JS number.\nexport const NumberMantissaBits = 53\n\n//--- SSD: 64-bit Subsecond Id (per Clock.md) ---//\n\n// Hot UUID: [1-bit MSb | 27-bit seconds | 8-bit ticker | 28-bit source]\nexport const SsIdSourceBits = 28\nexport const SsIdTickerBits = 8\nexport const SsIdHotTimestampBits = 27\nexport const SsIdHotMsb = 1\n\n// The combined ticker + source width (used for shifting).\nexport const SsIdTickerSourceBits = SsIdSourceBits + SsIdTickerBits\n\n// The maximum 27-bit Hot timestamp value (seconds elapsed from epoch).\nexport const SsIdHotTimestampMax = (1 << SsIdHotTimestampBits) - 1\n\n// Cold UUID: [0-bit MSb | 34-bit seconds | 29-bit ticker]\nexport const SsIdColdTimestampBits = 34\nexport const SsIdColdTickerBits = 29\nexport const SsIdColdMsb = 0\n\n// Hot Anonymous UUID: [27-bit seconds | 31-bit random]\n// Seconds >= 126,230,400 (4 years) and < 130,424,704 (4y + 2^22).\nexport const SsIdAnonymousTimestampBits = 27\nexport const SsIdAnonymousRandomBits = 31\nexport const SsIdAnonymousSecondsMin = 126230400\nexport const SsIdAnonymousSecondsMax = 130424704\n\n// The maximum value the 64-bit SubsecondId ticker (Hot), which is also the mask.\nexport const SsIdTickerMax = (1 << SsIdTickerBits) - 1\n\nexport const SubsecondIdSourceMax = (1 << SsIdSourceBits) - 1\n\n// 64-bit Time Ticker (TMT): [32-bit seconds | 32-bit subsecond ticker]\nexport const TmtTimestampBits = 32\nexport const TmtTickerBits = 32\n// Use 2**32 NOT (1 << 32): JS shift counts wrap mod 32, so 1 << 32 === 1.\nexport const TmtTickerMax = 2 ** TmtTickerBits - 1\n\n//--- SSE: 128-bit Subsecond Id (per Clock.md) ---//\n\n// [36-bit unsigned seconds | 16-bit subsecond ticker | 76-bit random id]\nexport const SsUIdSourceBits = 76\nexport const SsUIdTickerBits = 16\nexport const SsUIdTimestampBits = 36\n// The maximum value the 128-bit SubsecondId ticker, which is also the mask.\nexport const SsUIdTickerMax = (1n << BigInt(SsUIdTickerBits)) - 1n\n\n/*--- Utilities ---*/\n\n// Converts a bigint to a 2-byte hex string.\nexport function NumberToHex(value: number, dest: string = ''): string {\n let hex = value.toString(16)\n if(value < 10) return dest + '0' + hex\n return dest + hex\n}\n\n// Converts a hex character string to a byte as a number.\nexport function PrintHexByte(input: number, dest: string = ''): string {\n if(input < 0n || input > 15n) return dest\n return dest + NumberToHex(input & 0xf) + NumberToHex((input >> 4) & 0xf)\n}\n\n// Counts the number of bits in a byte.\nexport function ByteCountBits(value: number) {\n if(value < 16) {\n if(value < 4) {\n if(value < 2) {\n if (value < 1) return 0\n else return 1\n }\n else return 2\n } else {\n if (value < 8) return 3\n else return 4\n }\n } else {\n if (value < 64) {\n if (value < 32) return 5\n else return 6\n } else\n if (value < 128) return 7\n }\n return 8\n}\n\nexport function CountAssertedBits(value: number): number {\n let count = 0\n while(value < 64) {\n count += value & 1\n value >>= 1\n }\n return count\n}\n\nexport function CountLeadingOnes(value: number): number {\n let count = 0\n while(count < 64) {\n if(!(value >> (63 - count++) & 1)) break\n }\n return count\n}\n\nexport function CountLeadingZeros(value: number): number {\n let count = 0\n while(count < 64) {\n if(value >> (63 - count++) & 1) break\n }\n return count\n}\n\n// Returns the number of bytes in a number.\nexport function NumberCountBytes(value: number): number {\n if (value <= 0xffffffff) {\n if (value <= 0xffff) {\n if(value <= 0xff)\n return 1\n else\n return 2\n } else {\n if (value <= 0xffffff)\n return 3\n else\n return 4\n }\n } else {\n if (value <= 0xffffffffffff) {\n if (value <= 0xffffffffff)\n return 5\n else\n return 6\n }\n }\n return 7\n}\n\n// Returns the number of bits in a number.\n// For 0, returns 1 to match 0.toString(2).length === 1.\nexport function NumberCountBits(value: number): number {\n if (value === 0) return 1\n const Bits = (NumberCountBytes(value) - 1) << 3 // << 3 to * 8\n let msb = (value < 1 << 30) ? value >> Bits\n : Number(BigInt(value) >> BigInt(Bits))\n return Bits + ByteCountBits(msb)\n}\n\n// Left pads and prints a number with the given character count.\nexport function NumberPrint(value: number, char_count: number,\n pad: string = ' ') {\n const Value = value.toString()\n if(char_count <= 3) return '0'.repeat(char_count)\n if(Value.length > char_count)\n return Value.substring(0, char_count - 3) + '...'\n return pad.repeat(char_count - Value.length) + Value\n}\n\n// Left pads and prints a bigint or number with the given character count.\nexport function BigIntPrint(value: number | bigint, char_count: number,\n pad: string = ' ') {\n const Value = value.toString()\n if(char_count <= 3) return '0'.repeat(char_count)\n if(Value.length > char_count)\n return Value.substring(0, char_count - 3) + '...'\n return pad.repeat(char_count - Value.length) + Value\n}\n\n// Returns the number of bits in a bigint or number.\n// For 0, returns 1 to match 0.toString(2).length === 1.\nexport function BinaryCount(value: bigint | number): number {\n const v = BigInt(value)\n if (v === 0n) return 1\n return v.toString(2).length\n}\n\n// Returns the number of bytes in a bigint.\nexport function BigIntCountBytes(value: bigint): number {\n const Bits = BinaryCount(value)\n return (Bits >> 3) + (Bits & 0x7 ? 1 : 0)\n}\n\n// Returns the number of bytes in a bigint.\nexport function BigIntCountBits(value: bigint): number {\n const ByteCount = BigIntCountBytes(value)\n\n return ((ByteCount - 1) << 3) + NumberCountBits(Number(value))\n}\n\n// Counts the number of decimals in a number.\nexport function NumberCountDecimals(value:number): number {\n // 2^53 = 9.007199254740992e15\n if(value < 0) value *= -1\n \n if(value < 100000000) {\n if (value < 10000) {\n if (value < 100) {\n if(value < 10)\n return 1\n else\n return 2\n } else {\n if (value < 1000)\n return 3\n else\n return 4\n }\n } else {\n if (value < 1000000) {\n if (value < 100000)\n return 5\n else\n return 6\n } else {\n if (value < 10000000)\n return 7\n else\n return 8\n }\n }\n } else {\n if (value < 1000000000000) {\n if (value < 10000000000) {\n if (value < 1000000000)\n return 9\n else\n return 10\n } else {\n if (value < 100000000000)\n return 11\n else\n return 12\n }\n } else {\n if (value < 100000000000000) {\n if (value < 10000000000000)\n return 13\n else\n return 14\n } else {\n if (value < 1000000000000000)\n return 15\n else\n return 16\n }\n }\n }\n}\n\n// Prints amd pads a number to a string to the given character count.\nexport function NumberPad(value: number, digit_count: number, \n pad:string = ' ') {\n const DecimalCount = NumberCountDecimals(value)\n if(DecimalCount > digit_count) {\n if(digit_count <= 3) return '.'.repeat(digit_count)\n return value.toString().substring(0, digit_count - 3) + '...'\n }\n return pad.repeat(digit_count - DecimalCount) + value\n}\n\n// Counts the number of decimals in a string, number, or bigint.\n// @warning Untested!\nexport function CountDecimals(value: bigint | number | string): number {\n switch(typeof value) {\n case 'bigint': return BigIntCountDecimals(BigInt(value))\n case 'number': return NumberCountDecimals(Number(value))\n }\n const Value = String(value)\n let i = 0\n let c = Value.charCodeAt(i)\n let leading_zero_count = 0\n if(c == '0'.charCodeAt(0)) {\n c = Value.charCodeAt(++i)\n while(c == '0'.charCodeAt(0)) c = Value.charCodeAt(++i)\n leading_zero_count = i\n }\n while(c != undefined && c >= '0'.charCodeAt(0) && c <= '9'.charCodeAt(0))\n c = Value.charCodeAt(++i)\n return i - leading_zero_count\n}\n\n// Counts the number of decimals in a bigint.\nexport function BigIntCountDecimals(value:bigint): number {\n if(value < 0n) value *= -1n\n let decimal_count = 0\n const B53DecimalMax = 1000000000000000n\n while(value >= B53DecimalMax) {\n decimal_count += 15\n value /= B53DecimalMax\n }\n return decimal_count + NumberCountDecimals(Number(value))\n}\n\n/* Converts a BigInt to a Buffer.\n@todo Improve to copy bigint, which I've read is hacky with Node & CJS and\nmay require another function pointer type hack.\n@return A Buffer containing [lid_source_lsw, SubsecondIdNextMSW()]. */\nexport function BigIntToBuffer(value: bigint) {\n const ByteCount = BigIntCountBytes(value)\n //console.log('value:' + value + ' ByteCount:' + ByteCount)\n const Buf = Buffer.alloc(ByteCount)\n for(let index = 0; index < ByteCount; ++index) {\n Buf[index] = Number((value >> BigInt(index << 3)) & 0xffn)\n }\n return Buf\n}\n\nexport function NumberToBuffer(value: number) {\n const ByteCount = NumberCountBytes(value)\n //console.log('value:' + value + ' ByteCount:' + ByteCount)\n const Buf = Buffer.alloc(ByteCount)\n for(let index = 0; index < ByteCount; ++index) {\n Buf[index] = (value >> (index << 3)) & 0xff\n }\n return Buf\n}\n\n// Prints amd pads a number to a string to the given character count.\nexport function BigIntPad(value: bigint, decimals_max: number, \n pad:string = ' ') {\n const DecimalCount = BigIntCountDecimals(value)\n if(DecimalCount > decimals_max) {\n if(decimals_max <= 3) return pad.repeat(decimals_max)\n return value.toString().substring(0, decimals_max - 3) + '...'\n }\n return pad.repeat(decimals_max - DecimalCount) + value\n}\n\n// Pads a binary string with leading zeros aligned to a bit boundary.\n// @warning Does not check if the value string is not a binary string.\nexport function BinaryPad(value: string | number | bigint | undefined,\n bit_count: number = 64, prefix: string = '0b',\n pad: string = '0') { \n if(bit_count <= 0) return ''\n const str = (typeof value === 'string')\n ? String(value)\n : value == undefined\n ? ''\n : value.toString(2)\n if(bit_count < str.length) {\n if (bit_count < 3) return prefix + '.'.repeat(bit_count)\n return prefix + str.substring(0, bit_count - 3) + '...'\n }\n return prefix + pad.repeat(bit_count - str.length) + str\n}\n\nexport function BinaryPadBits(value: string | number | bigint | undefined,\n bit_count: number = 64, prefix: string = '0b') { \n return BinaryPad(value, bit_count, prefix) + ':' + \n (typeof value === 'string' \n ? String(value).length : BigInt(value ?? 0n).toString(2).length)\n}\n\n// Converts a Buffer to a BigInt.\nexport function BufferToBigInt(buf: Buffer): bigint {\n //console.log('buf:\"' + buf.toString() + '\":' + buf.length)\n let result = 0n\n for(let i = 0; i < buf.length; ++i)\n result |= BigInt(buf[i] ?? 0) << BigInt(i << 3)\n return result\n}\n\n// Converts a Buffer to a BigInt.\nexport function BufferToHex(buf: Buffer): string {\n let result = ''\n for(let i = 0; i < buf.length; ++i)\n result = PrintHexByte(buf[i] ?? 0, result)\n return result\n}\n\n// Pads a hex value with leading zeros aligned to n-bit boundary.\n// @warning Does not check if the value string is not a hex string.\nexport function HexPad(value: string | number | bigint | undefined, \n bit_count: number = 64, prefix: string = '0x', pad: string = '0'): string\n{\n if(bit_count <= 0) return ''\n const HexCount = (bit_count >> 2) + ((bit_count & 0x3) ? 1 : 0)\n let hex = typeof value === 'string'\n ? String(value)\n : value == undefined\n ? ''\n : value.toString(16)\n if(hex.length > HexCount) {\n if (HexCount < 3) return prefix + '.'.repeat(HexCount)\n return prefix + hex.substring(0, HexCount - 3) + '...'\n }\n return prefix + pad.repeat(HexCount - hex.length) + hex\n}\n\n// Pads a hex value with leading zeros aligned to n-bit boundary \n// followed by the bit count.\nexport function HexPadBits(value: string | number | bigint | undefined,\n bit_count: number = 64, prefix: string = '0x') { \n return HexPad(value, bit_count, prefix, ) + ':' + \n (typeof value === 'string' ? String(value).length \n : BinaryCount(BigInt(value ?? 0n)))\n}\n\n// Converts a hex character string to a number.\nexport function HexToNibble(input: string | undefined): number {\n if (input == undefined) return -1\n let c = input.charCodeAt(0)\n if(c < '0'.charCodeAt(0) || c > 'z'.charCodeAt(0)) return -1\n if(c <= '9'.charCodeAt(0))\n return c - '0'.charCodeAt(0)\n if(c >= 'a'.charCodeAt(0))\n return c - 'a'.charCodeAt(0) + 10\n if(c < 'A'.charCodeAt(0) || c > 'Z'.charCodeAt(0))\n return -1\n return c - 'A'.charCodeAt(0) + 10\n}\n\n// Converts a hex string to an bigint.\nexport function HexToBigInt(hex: string): bigint {\n let result = 0n\n let length = hex.length\n if(hex == undefined || length == 0) return result\n let i = 0\n while(--length >= 0)\n result |= BigInt(HexToNibble(hex[i++]) << (length << 2))\n return result\n}\n\n// Converts a hex string to an number.\nexport function HexToNumber(hex: string): number {\n let result = 0\n let length = hex.length\n if(hex == undefined || length == 0) return result\n let i = 0\n while(--length >= 0)\n result |= HexToNibble(hex[i++]) << (length << 2)\n return result\n}\n\n// Converts a hex string to a Buffer.\nexport function HexToBuffer(hex: string): Buffer {\n //console.log ('::HexToBuffer(hex):\"' + hex + '\"')\n let length = hex.length\n let j = 0\n let nibble = hex[j]\n while(nibble == '0') nibble = hex[++j]\n let count = length - j\n const LSb = count & 0x1\n const ByteCount = (count >> 1) + LSb // >> 1 to / 2\n const Buf = Buffer.alloc(ByteCount)\n if(ByteCount <= 0) return Buf\n let i = ByteCount - 1\n let a = HexToNibble(nibble)\n if(a < 0) return Buf\n if(LSb == 1) {\n Buf[i--] = a\n a = HexToNibble(hex[++j])\n if(a < 0) return Buf\n }\n while (a >= 0) {\n let b = HexToNibble(hex[++j])\n //console.log('a:' + a + ' b:' + b)\n if(b < 0) {\n Buf[i] = a\n return Buf\n }\n Buf[i--] = (a << 4) | b\n a = HexToNibble(hex[++j])\n }\n return Buf\n}\n\n// Generates a random bigint in the given min:max range.\nexport function BigIntInRange(rng: RNG, \n min: bigint | number = 0,\n max: bigint | number = 0xffffffffffff): bigint {\n if(min > max) return 0n\n if(min == max) return BigInt(min)\n // Generate a random number in the given range.\n const Max = BigInt(max)\n const Min = BigInt(min)\n const Range = Max - Min // 5-(-8)=13\n const RangeBits = BigInt(BinaryCount(Range))\n //console.log('BigIntInRange: Min:' + Min + ':' + Min.toString(2).length +\n // ' Max:' + Max + ':' + Max.toString(2).length + \n // ' RangeBits:' + RangeBits)\n let result = 0n\n let count = RangeBits - 1n\n while(count > 48n) {\n count -= 48n\n result |= BigInt(rng(0, 0xffffffffffff)) << count\n //console.log('count:' + count + ' result:0b' + BinaryPad(result) +\n // ':' + result.toString(2).length)\n }\n // Generate the last 48 or less bits\n const Shift = (RangeBits - count)\n const Remainder = Number(Range >> Shift)\n if(Remainder != 0)\n result |= BigInt(rng(0, Remainder)) << Shift\n /*\n console.log('RangeBits:' + RangeBits + ' count:' + count + \n ' Remainder: ' + Remainder + \n ' result.bit_count:' + result.toString(2).length)\n */\n return Min + result\n}\n\nexport function NumberInRange(rng: RNG,\n min: number = 0,\n max: number = 0xffffffffffff): number {\n return Number(BigIntInRange(rng, min, max))\n}\n\n// Generates a cryptographically secure bigint.\nexport function BigIntInBitRange(rng: RNG, bit_min: bigint | number = 1,\n bit_max: bigint | number = 64): bigint {\n if(bit_min <= 0 || bit_max <= 0 || bit_min > bit_max) return 0n\n const Max = (1n << BigInt(bit_max)) - 1n\n const Min = bit_min == 1n ? 0n : (1n << (BigInt(bit_min) - 1n))\n //console.log('bit_min:' + bit_min + ' bit_max:' + bit_max + ' Min:' + \n // Min + ' Max:' + Max)\n return BigIntInRange(rng, Min, Max)\n}\n\n// Generates a random number in the given range of bits.\nexport function NumberInBitRange(rng: RNG, bit_min: number, bit_max: number) {\n if(bit_min <= 0 || bit_max <= 0 || bit_min > bit_max || bit_max > 52) return 0\n const Max = (1 << bit_max) - 1\n const Min = bit_min == 1 ? 0 : (1 << (bit_min - 1))\n //console.log('bit_min:' + bit_min + ' bit_max:' + bit_max + ' Min:' + \n // Min + ' Max:' + Max)\n return NumberInRange(rng, Min, Max)\n}\n\n// Returns the maximum and one integer below the minimum value of the given bit \n// range.\n// Examples: bit_min: 1 bit_max: 1 -> -1 < value <= 1\n// bit_min: 1 bit_max: 2 -> -1 < value <= 3\n// bit_min: 2 bit_max: 2 -> 1 < value <= 3\n// bit_min: 2 bit_max: 3 -> 1 < value <= 7\n// bit_min: 3 bit_max: 3 -> 3 < value <= 7\n// bit_min: 3 bit_max: 4 -> 3 < value <= 7\nexport function BitRangeMinMax(bit_min: bigint | number = 0,\n bit_max: bigint | number = 64) : [number, number] {\n const Max = (1n << BigInt(bit_max)) - 1n\n const Min = bit_min <= 1n ? -1n : (1n << (BigInt(bit_min) - 1n)) - 1n\n return [Number(Min), Number(Max)]\n}\n\n// Checks to see if a BigInt is in the given range.\nexport function BigIntIsInBitRange(value: bigint | number,\n bit_min: bigint | number = 0, bit_max: bigint | number = 64): boolean {\n const V = BigInt(value)\n const Max = (1n << BigInt(bit_max)) - 1n\n // For bit_min == 1: values with 1 bit are just 1, so Min = 0.\n // For bit_min > 1: Min = 2^(bit_min-1) (smallest value with bit_min bits).\n const Min = bit_min <= 1n ? 0n : (1n << (BigInt(bit_min) - 1n))\n /*\n console.log('BigIntIsInBitRange: value:0x' + value.toString(16) + ':' + \n value.toString(2).length + ' bit_min:' + bit_min + \n ' bit_max:' + bit_max + \n ' Min:0x' + Min.toString(16) + ':' + Min.toString(2).length +\n ' Max:0x' + Max.toString(16) + ':' + Max.toString(2).length)\n */\n return V >= Min && V <= Max\n}\n\n// Generates a cryptographically secure bigint.\nexport function BigIntRandom(rng: RNG, \n bit_count: bigint | number = 64): bigint {\n return BigIntInBitRange(rng, 0, bit_count)\n}\n\nexport function NumberRandom(rng: RNG): number {\n return rng(Number.MIN_VALUE, Number.MAX_VALUE)\n}\n\nexport function NumberNZ(rng: RNG, min: number = Number.MIN_VALUE, \n max: number = Number.MAX_VALUE): number {\n let generated = 0.0\n if(min >= max || (max - min) == generated) return generated\n while(generated == 0.0) {\n generated = rng(Number.MIN_VALUE, Number.MAX_VALUE)\n }\n return generated\n}\n\n// Generates the next non-zero random number between -1 and 1.\nexport function NumberNZFromNeg1To1(rng: RNG): number {\n let generated = 0.0\n while(generated == 0.0) {\n generated = rng(-1, 1)\n }\n return generated\n}\n\n// Gets the current date-time in seconds as a bigint.\nexport function TimestampSeconds(): number {\n return Math.floor(new Date().getTime() / 1000)\n}\n\n// Spin waits until the next second.\nexport function TimestampSecondsNext() {\n let time_start = TimestampSeconds()\n let now = time_start\n while(now == time_start) now = TimestampSeconds()\n return now\n}\n\n// Gets the current date-time in seconds as a bigint.\nexport function TimestampSecondsNextBigInt(): bigint {\n return BigInt(TimestampSecondsNext())\n}\n\n// Gets the current date-time in seconds as a number.\nexport function TimestampSecondsAsBigInt(): bigint {\n return BigInt(TimestampSeconds())\n}\n"],"mappings":"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","names":["SsUIdTimestampBits","BigIntToBuffer","BinaryPadBits"]}
package/package.json CHANGED
@@ -1,6 +1,81 @@
1
1
  {
2
2
  "name": "@astarship/subsecond-id",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.5.0",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "./dist/index.js",
9
+ "module": "./dist/index.mjs",
10
+ "files": [
11
+ "dist",
12
+ "LICENSE",
13
+ "README.md"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.mjs",
19
+ "require": "./dist/index.js"
20
+ }
21
+ },
22
+ "types": "./dist/index.d.ts",
23
+ "sideEffects": false,
24
+ "engines": {
25
+ "node": ">=18.0.0"
26
+ },
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "git+https://github.com/AStarStarship/SubsecondId.git"
30
+ },
31
+ "homepage": "https://github.com/AStarStarship/SubsecondId",
32
+ "readme": "../README.md",
33
+ "keywords": [
34
+ "bit-twiddling",
35
+ "64-bit",
36
+ "128-bit",
37
+ "id generation",
38
+ "id generator",
39
+ "id",
40
+ "identifier",
41
+ "sql",
42
+ "sharding",
43
+ "database",
44
+ "distributed systems",
45
+ "high performance",
46
+ "high-performance",
47
+ "hpc",
48
+ "low latency",
49
+ "low-latency",
50
+ "time-based",
51
+ "monotonic",
52
+ "high throughput",
53
+ "high-throughput",
54
+ "performance",
55
+ "optimization",
56
+ "uid",
57
+ "unique id",
58
+ "unique identifier",
59
+ "unique identifiers",
60
+ "uuid",
61
+ "naming",
62
+ "name server"
63
+ ],
64
+ "scripts": {
65
+ "build": "tsup ./Source/index.ts --format cjs,esm --dts",
66
+ "test": "jest",
67
+ "prepublishOnly": "npm run build && npm test",
68
+ "prepack": "npm run build"
69
+ },
70
+ "devDependencies": {
71
+ "@changesets/cli": "^2.29.7",
72
+ "@jest/globals": "^30.2.0",
73
+ "@types/jest": "^29.5.14",
74
+ "@types/node": "^20.19.23",
75
+ "jest": "^29.7.0",
76
+ "ts-jest": "^29.4.5",
77
+ "ts-node": "^10.9.2",
78
+ "tsup": "^8.5.0",
79
+ "typescript": "^4.9.5"
80
+ }
81
+ }