yasi - yet another snowflake implementation

yasi is a Deno library for generating unique, roughly time-ordered IDs across distributed systems. The library is based on Twitter’s Snowflake, a network service for generating unique ID numbers at high scale with some simple guarantees.

This project aims to be a lightweight, uncoordinated, and distributed unique ID generator, capable of producing unique 64-bit integer IDs.

Features

  • Lightweight: A single tiny external dependency which will be removed in the future
  • Unique ID generation: Generates unique IDs across distributed systems
  • Uncoordinated: No need for system-wide coordination
  • Roughly time-ordered: IDs generated are roughly ordered over time

Installation

import { Snowflake } from "https://deno.land/x/yasi@v0.0.1/mod.ts";

Usage

const snowflake = Snowflake.get({ nodeID: 1234, timeOffset: Date.now() });
const id = await snowflake.genNewID();

API

For detailed API documentation, please check the source code.

Future development

  • Custom Epoch: Allow setting a custom epoch. This could help save some bits for either the sequence number or the machine ID, depending on requirements.
  • Benchmarks: Include benchmark tests to determine how many IDs can be generated in a certain timeframe.
  • More safety checks: Include safety checks, such as checking if the machine/node ID exceeds the maximum number that can be held in the assigned bits.
  • Configurable bits for each segment: Allow configuring the number of bits for each segment of the ID (timestamp, node ID, sequence).
  • Multi-node tests: Simulate the generation of IDs across multiple nodes to ensure that the IDs are indeed unique across nodes and are roughly ordered.

Contributing

Contributions are welcome! Please feel free to submit a pull request.

License

MIT © Claudiu Ceia