UNPKG

badman-core

Version:

badman-core is the layer what all the badman packages depended,or can be used as a tool kit.

146 lines (145 loc) 4.66 kB
import Initializing from "../../Initializing"; import SnowflakeProperties from "./SnowflakeProperties"; export default class Snowflake implements Initializing { /** * 雪花计算方法,(1-漂移算法|2-传统算法),默认 1 */ private method; /** * 基础时间(ms 单位),不能超过当前系统时间 */ private baseTime; /** * 机器码,必须由外部设定,最大值 2^WorkerIdBitLength-1 */ private workerId; /** * 机器码位长,默认值 6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过 22) */ private workerIdBitLength; /** * 序列数位长,默认值 6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过 22) */ private seqBitLength; /** * 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值 0,表示最大序列数取最大值(2^SeqBitLength-1]) */ private maxSeqNumber; /** * 最小序列数(含),默认值 5,取值范围 [5, MaxSeqNumber],每毫秒的前 5 个序列数对应编号 0-4 是保留位,其中 1-4 是时间回拨相应预留位,0 是手工新值预留位 */ private minSeqNumber; /** * 最大漂移次数(含),默认 2000,推荐范围 500-10000(与计算能力有关) */ private topOverCostCount; /** * */ private timestampShift; /** * */ private currentSeqNumber; /** * */ private lastTimeTick; /** * 回拨次序, 支持 4 次回拨次序(避免回拨重叠导致 ID 重复) */ private turnBackTimeTick; /** * */ private turnBackIndex; /** * */ private isOverCost; /** * */ private overCostCountInOneTerm; private snowflakeProperties; /** * @param {{ * baseTime: 1577836800000, // 基础时间(ms 单位),默认2020年1月1日,不能超过当前系统时间,一旦投入使用就不能再更改,更改后产生的ID可能会和以前的重复 * WorkerId: Number, // 机器码,必须由外部设定,最大值 2^WorkerIdBitLength-1 * WorkerIdBitLength: 6, // 机器码位长,默认值 6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过 22) * SeqBitLength: 6, // 序列数位长,默认值 6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过 22) * MaxSeqNumber: 5, // 最大序列数(含),设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值 0,表示最大序列数取最大值(2^SeqBitLength-1]) * MinSeqNumber: 5, // 最小序列数(含),默认值 5,取值范围 [5, MaxSeqNumber],每毫秒的前 5 个序列数对应编号 0-4 是保留位,其中 1-4 是时间回拨相应预留位,0 是手工新值预留位 * TopOverCostCount: 2000// 最大漂移次数(含),默认 2000,推荐范围 500-10000(与计算能力有关) * }} options */ constructor(options: SnowflakeProperties); afterInitialized(): Promise<void>; /** * 当前序列号超过最大范围,开始透支使用序号号的通知事件,,本项暂未实现 * @returns */ private BeginOverCostAction; /** * 当前序列号超过最大范围,结束透支使用序号号的通知事件,,本项暂未实现 * @returns */ private EndOverCostAction; /** * 开始时间回拨通知,本项暂未实现 * @returns */ private BeginTurnBackAction; /** * 结束时间回拨通知,本项暂未实现 * @returns */ private EndTurnBackAction; /** * 雪花漂移算法 * @returns */ private NextOverCostId; /** * 常规雪花算法 * @returns */ private NextNormalId; /** * 生成ID * @param useTimeTick 时间戳 * @returns */ private CalcId; /** * 生成时间回拨ID * @returns */ private CalcTurnBackId; /** * * @returns */ private GetCurrentTimeTick; /** * * @returns */ private GetNextTimeTick; private maxId; /** * 生成ID * @returns 始终输出number类型,超过时throw error */ NextNumber(): number; /** * 生成ID * @returns 根据输出数值判断,小于number最大值时输出number类型,大于时输出bigint */ NextId(): number | bigint; /** * 生成ID * @returns 始终输出bigint类型 */ NextBigId(): bigint; }