Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/v3xlabs/sunflake
Zero dependency, lightweight, snowflake generator
https://github.com/v3xlabs/sunflake
npm snowflake
Last synced: 26 days ago
JSON representation
Zero dependency, lightweight, snowflake generator
- Host: GitHub
- URL: https://github.com/v3xlabs/sunflake
- Owner: v3xlabs
- License: other
- Created: 2022-01-01T14:06:24.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2023-03-27T21:26:10.000Z (almost 2 years ago)
- Last Synced: 2024-11-10T18:51:18.300Z (about 2 months ago)
- Topics: npm, snowflake
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/sunflake
- Size: 1.37 MB
- Stars: 22
- Watchers: 3
- Forks: 2
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![lvksh sunflake](./assets/banner.png)
[![MINIFIED SIZE](https://img.shields.io/bundlephobia/min/sunflake.svg)]()
[![COVERAGE](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)]()
[![LANGUAGES](https://img.shields.io/github/languages/top/lvkdotsh/sunflake)]()
[![DEPENDENCIRES](https://img.shields.io/badge/dependencies-0-brightgreen.svg)]()
[![NPM](https://img.shields.io/npm/dt/sunflake)]()Zero dependency, lightweight, snowflake generator.
This library follows the Twitter [Snowflake ID](https://en.wikipedia.org/wiki/Snowflake_ID) specification, which is currently what is utilized by platforms such as [Discord](https://discord.com/developers/docs/reference#snowflakes), [Twitter](https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake), [Instagram](https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c) and [Blizzard](https://techcrunch.com/2010/10/12/twitter-snowflake/) just to name a few.
## How it works
Sunflake takes a 42 bit unix timestamp, 10 bits of machine id and 12 bits of sequence number. Sunflake generates id in string format (which easily can be casted into a 64 bit bigint in databases), as javascript is limited to 53 bit integer precision.
| 111111111111111111111111111111111111111111 | 1111111111 | 111111111111 | |
| ------------------------------------------ | ---------- | ------------ | --- |
| 64 | 22 | 12 | 0 |
###
| FIELD | BITS | DESCRIPTION | RETRIEVAL |
| ---------- | ---- | --------------------------------------------------------- | ---------------------------- |
| Timestamp | 42 | Milliseconds since given Epoch | (snowflake >> 22) + epoch |
| Machine Id | 10 | | (snowflake & 0x3FF000) >> 12 |
| Increment | 12 | Increments for every id created
in the same timestamp. | snowflake & 0xFFF |- (snowflake >> 22) + epoch: We right shift with 22 (64 - 42). This grabs the 42 first bits which is the time since the epoch. We then add the epoch to it and we have a unix timestamp in milliseconds.
- (snowflake & 0x3FF000) >> 12: We start by offset `0x3FF000`, which in binary is `0b1111111111000000000000` which is 22 bits long. This extracts the 10 bits after the 12 bits from the right, and then we remove those 12 bits from the right that we don't need. This is our Machine Id.
- snowflake & 0xFFF: Grabs everything after the offset `0xFFF` which is `111111111111` in binary which is 12 bits long. We start at the 12th bit (start of increament).## Installation
Using `npm`:
```sh
npm install sunflake
```or if you prefer to use the `yarn` package manager:
```sh
yarn add sunflake
```## Usage
```ts
import { generateSunflake } from 'sunflake';export const SnowflakeGen = generateSunflake({
machineId: 1, // Machine id
epoch: 1640995200000, // January 1st, 2022
});
```Now you can use that function easily
```ts
const id1 = SnowflakeGen();
const id2 = SnowflakeGen();
```## Contributors
[![](https://contrib.rocks/image?repo=lvkdotsh/sunflake)](https://github.com/lvkdotsh/sunflake/graphs/contributors)
## LICENSE
This package is licensed under the [GNU Lesser General Public License](https://www.gnu.org/licenses/lgpl-3.0).