{"_id":"@dreamystify/kestrel","_rev":"9-be0612ee98adb8e2490e9d2a27d1f08a","name":"@dreamystify/kestrel","dist-tags":{"latest":"1.3.1"},"versions":{"1.0.0":{"name":"@dreamystify/kestrel","version":"1.0.0","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.0.0","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"68d59939ea21a075d08201c76ec9b68e88acbf8e","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.0.0.tgz","fileCount":7,"integrity":"sha512-mm0l0ykSJvmFsS7At6zH9PoU9IOTiYO/QlFUI+xbdeLTi86jdQT/xFQg0nuICv8EVK7QcAiezSVz1PdBRmiKCw==","signatures":[{"sig":"MEQCID5eQ3MPs8ZxzSvkMED5vwxAM6foh0GBuf1W1j03FmtwAiBUpz1ZBthLV3OrH5goGMUbQdfyf0CzANfDmlJ9JZxmfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79371},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js"}},"gitHead":"2512b4cf0fc04350920e6f815f692745a4257327","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && npm run build:esbuild && npm run build:types","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","build:types":"tsc -p tsconfig.build.json","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","build:esbuild":"npm run clean && npx tsx esbuild.config.ts","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","tsx":"^4.20.6","jest":"^30.2.0","esbuild":"^0.25.10","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.0.0_1759189370729_0.1497403473307266","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dreamystify/kestrel","version":"1.0.1","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.0.1","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"f478c1d6491811afa0bc8715035f52a9aad15279","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.0.1.tgz","fileCount":7,"integrity":"sha512-E3UGBzyLibHsPbLo7S9m5O91aAJuOwoxELoGvDOwUcOj3VM5mf0gOv/F4wPrCo1AO4eR7r78Gd2z3rfyYIBU7A==","signatures":[{"sig":"MEUCIDEj8ahe2VCi3w+nRsfu6qrtB/i98Dyn7WWiw7qcoY/AAiEApmrmW8MRnZMzFg19kc3EHRVIpCdnqqwOxc024FKV1QI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79369},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js"}},"gitHead":"e5abdbe9336be758397126065391000ae55d752c","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && npm run build:esbuild && npm run build:types","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","build:types":"tsc -p tsconfig.build.json","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","build:esbuild":"npm run clean && npx tsx esbuild.config.ts","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","tsx":"^4.20.6","jest":"^30.2.0","esbuild":"^0.25.10","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.0.1_1759190684373_0.8494780146214138","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@dreamystify/kestrel","version":"1.1.0","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.1.0","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"af31e17c8a60372c3be6a413829aea65b7f754b1","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.1.0.tgz","fileCount":8,"integrity":"sha512-oCoT/Ah7VOkVe+u+RuxN3U2crZMlvQ3cmcQXZVxU1cDYdOaw3JtG6mZ8UYw5WSERrbSwF0t29Gi+lFNEKvpAwA==","signatures":[{"sig":"MEUCIQDWzWGz7j7ppbDbJKApeE2LmJ9MftcWDJuvDfO1DHvINgIgKHTQTF4vs1hPtUat6gXKBber43lA+xHMYcg9Td731EU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85670},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"b974553829c3e9963dfd569e2fe99bdd89f26926","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && tsup","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","jest":"^30.2.0","tsup":"^8.5.0","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.1.0_1761619538167_0.7129283471544328","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@dreamystify/kestrel","version":"1.1.1","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.1.1","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"88c36b8397d9984be7c847f87585983410775a63","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.1.1.tgz","fileCount":8,"integrity":"sha512-ICX1hqa483CtGcISRaLVBpSHnSkCzwtd5DnBRxsljqeU9PtfPxTFemNCanIsSX8AZvi9QRao+B2NkKJw0+n5UA==","signatures":[{"sig":"MEUCIQCiv0Bcf7h7WILDdqyU3aug2pOIOCu6SAx/f8+epljZ9gIgSW8X/1Y5/UMAsHdPdBF1gyEhACd0onTEj/k5z14bFR4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85133},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"f71b9f8b1a3f5c3d11913b862c9623bbc6511c83","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && tsup","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","jest":"^30.2.0","tsup":"^8.5.0","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.1.1_1761633390507_0.4697021588708623","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@dreamystify/kestrel","version":"1.1.2","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.1.2","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"3cceedfe8080ead9811655294e93666f1367c13d","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.1.2.tgz","fileCount":8,"integrity":"sha512-tsLtIl3qpVIJXNwbhQDE83lGFSs6y4AQ5ALEIhBghdlxkaK6R3OI40j95daiETFb+case5+VlfL4I80cSI3H0A==","signatures":[{"sig":"MEYCIQCnAyajmGxMG3ZBNgsIC/q38UyP+I6reuAYAdiOEAvSawIhAIrHQNWpkpluebKlli9Q7sF5tx4wZAR9VYN7HuXJ4yMF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85448},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.js","require":"./lib/index.js"}},"gitHead":"b44059b873bf587ed30edcfb281b4651ff76e2a5","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && tsup","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","jest":"^30.2.0","tsup":"^8.5.0","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/exec":"^7.1.0","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.1.2_1761634253199_0.13498710756888","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@dreamystify/kestrel","version":"1.2.0","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.2.0","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"dcfb3c0ff3cf7601e45dc133a7af882e08c0bbd7","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.2.0.tgz","fileCount":10,"integrity":"sha512-hrnCk1t0SBzVcfV/lRxs9QS8rF+gj2Ep+p3Pa+XnKDnLSxWcd5Q4dc7nO1Z1Y1IuvrR/yGrkVNffIFKG7ATHfQ==","signatures":[{"sig":"MEUCIQDV0+fGnBLESv8y/hLHQ0PpMZ61TjFFcB0eglRDo4bDawIgB5bw0wtvXhpgZLEVPaFkPh8GH/T1ENuyt/hh5kBMrr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144467},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.mjs","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.mjs","require":"./lib/index.js"}},"gitHead":"b619e773cc8767db9235b359d4ae4ad764496d16","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && tsup","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","jest":"^30.2.0","tsup":"^8.5.0","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/exec":"^7.1.0","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.2.0_1763329300074_0.18284416736276232","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@dreamystify/kestrel","version":"1.2.1","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.2.1","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"95ce387155879af14b66d5972c513ee24deadde2","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.2.1.tgz","fileCount":9,"integrity":"sha512-nSMASFHbp63fZX2994Wtx3PdBl//OThiJSyTNyZMMjTDKCzGPXVxCsdOLiF7uPmegil/Pkhmhf62ezImrII3nA==","signatures":[{"sig":"MEQCIG4zonF/kXhAmF8E1yw56msfftdsDhOQbWhJGHPWiuPnAiA+v8xkve1Vm+qVrZuBzBsgB2WWx5QBQ7xG1vgj8Wi5Kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150092},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.mjs","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.mjs","require":"./lib/index.js"}},"gitHead":"f55d4d2a9923b487fac349306769c05708d8447b","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && tsup","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","jest":"^30.2.0","tsup":"^8.5.0","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/exec":"^7.1.0","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.2.1_1763456186797_0.731509314600512","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@dreamystify/kestrel","version":"1.3.0","keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","_id":"@dreamystify/kestrel@1.3.0","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"homepage":"https://github.com/Dreamystify/kestrel#readme","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"dist":{"shasum":"46cbf7fcfc11df04c653f890e507b3266539499a","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.3.0.tgz","fileCount":9,"integrity":"sha512-rfHwxSDrRJxGVmSOWaHZCwF1B7sErUCqOMuji7Efqemb1Q6NrlDnyG3JhajGKnViMkKJtq78CrVq1y5BnEXJbQ==","signatures":[{"sig":"MEUCIExanXKW2lHfePSsnHwSmBVDsJMiMO0DibHFC/mYENnCAiEAxkSR0VmU+RacwthQPC8VoPfDl3Gg6zmcXrLEzu5PY/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178774},"jest":{"roots":["tests"],"preset":"ts-jest/presets/default-esm","forceExit":true,"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"clearMocks":true,"testTimeout":10000,"collectCoverage":true,"testEnvironment":"node","coverageProvider":"v8","moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"lines":85,"branches":75,"functions":75,"statements":85}},"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"coveragePathIgnorePatterns":["/node_modules/"]},"main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.mjs","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.mjs","require":"./lib/index.js"}},"gitHead":"2a1db15e336d3a180966cfa615e7cd19e5738b3b","scripts":{"lint":"npm run lint:md && npm run lint:mdc","test":"jest","build":"npm run clean && tsup","clean":"rm -rf lib","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","coverage":"jest --coverage","lint:mdc":"markdownlint '**/*.mdc' --fix","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc:check":"markdownlint '**/*.mdc'","prepublishOnly":"npm run build"},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"repository":{"url":"git+https://github.com/Dreamystify/kestrel.git","type":"git"},"_npmVersion":"10.9.3","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"redis":"^5.8.2","ioredis":"^5.4.2","big-integer":"^1.6.51"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^17.1.0","jest":"^30.2.0","tsup":"^8.5.0","ts-jest":"^29.2.5","ts-node":"^10.9.1","prettier":"^3.6.2","typescript":"^5.1.6","@types/jest":"^30.0.0","@types/node":"^24.6.0","markdownlint-cli":"^0.45.0","semantic-release":"^24.2.7","source-map-support":"^0.5.21","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","@semantic-release/exec":"^7.1.0","@semantic-release/github":"^11.0.3","@semantic-release/changelog":"^6.0.3","@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.0.3"},"_npmOperationalInternal":{"tmp":"tmp/kestrel_1.3.0_1764410112203_0.9999230592077262","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@dreamystify/kestrel","version":"1.3.1","description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","main":"lib/index.js","module":"lib/index.mjs","types":"lib/index.d.ts","exports":{".":{"types":"./lib/index.d.ts","import":"./lib/index.mjs","require":"./lib/index.js"}},"publishConfig":{"access":"public"},"scripts":{"prepublishOnly":"npm run build","build":"npm run clean && tsup","example:decode":"npm run build && node examples/decode-typescript.mjs","lint":"npm run lint:md && npm run lint:mdc","lint:md":"markdownlint 'docs/**/*.md' 'README.md' --fix","lint:md:check":"markdownlint 'docs/**/*.md' 'README.md'","lint:mdc":"markdownlint '**/*.mdc' --fix","lint:mdc:check":"markdownlint '**/*.mdc'","format":"prettier --write --log-level silent \"**/*.md\" \"**/*.mdc\"","format:md":"prettier --write --log-level silent \"**/*.md\"","format:mdc":"prettier --write \"**/*.mdc\"","format:check":"prettier --check \"**/*.md\" \"**/*.mdc\"","clean":"rm -rf lib","test":"jest","coverage":"jest --coverage"},"repository":{"type":"git","url":"git+https://github.com/Dreamystify/kestrel.git"},"keywords":["k-sortable","id","generator","bigint"],"author":{"name":"Dreamystify"},"license":"MIT","bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"homepage":"https://github.com/Dreamystify/kestrel#readme","devDependencies":{"@istanbuljs/nyc-config-typescript":"^1.0.2","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/exec":"^7.1.0","@semantic-release/git":"^10.0.1","@semantic-release/github":"^11.0.3","@semantic-release/npm":"^12.0.2","@semantic-release/release-notes-generator":"^14.0.3","@types/jest":"^30.0.0","@types/node":"^24.6.0","jest":"^30.2.0","markdownlint-cli":"^0.45.0","nyc":"^17.1.0","prettier":"^3.6.2","semantic-release":"^24.2.7","source-map-support":"^0.5.21","ts-jest":"^29.2.5","ts-node":"^10.9.1","tsup":"^8.5.0","typescript":"^5.1.6"},"dependencies":{"big-integer":"^1.6.51","ioredis":"^5.4.2","redis":"^5.8.2"},"jest":{"preset":"ts-jest/presets/default-esm","extensionsToTreatAsEsm":[".ts"],"testEnvironment":"node","testTimeout":10000,"roots":["tests"],"clearMocks":true,"coverageProvider":"v8","collectCoverage":true,"collectCoverageFrom":["src/**/*.ts","!src/**/*.d.ts"],"coveragePathIgnorePatterns":["/node_modules/"],"coverageDirectory":"coverage","coverageReporters":["json","text","lcov","clover"],"coverageThreshold":{"global":{"branches":75,"functions":75,"lines":85,"statements":85}},"testMatch":["<rootDir>/tests/**/*.spec.ts"],"transform":{"^.+\\.ts$":["ts-jest",{"useESM":true,"tsconfig":"<rootDir>/tsconfig.jest.json"}]},"moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1"},"forceExit":false},"_id":"@dreamystify/kestrel@1.3.1","gitHead":"66440905c8e9fc1424a057c205dfdd783d878231","_nodeVersion":"24.5.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-EljGpOnTMTdreFTeINma1p5HiUQiPP06vchMyLpuTXzoIZ9m/ME2qNsH22LOX0HUph6XOH+iTXW84LmXoHXdsw==","shasum":"169ea24d6c55fb8f6e45f4aa8779d00cbafd4de1","tarball":"https://registry.npmjs.org/@dreamystify/kestrel/-/kestrel-1.3.1.tgz","fileCount":9,"unpackedSize":184947,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCtftjwxi0ZMcrM+CxX9kviwMk+Zbe/zII8GWRp03iMjQIgfl5H7E7Pg8anmTv3sPJiFeXebERNLzNU7ShTEaIGKtw="}]},"_npmUser":{"name":"corey_lylyk","email":"support@dreamystify.com"},"directories":{},"maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kestrel_1.3.1_1766109895403_0.40043956452136253"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-29T23:42:50.655Z","modified":"2025-12-19T02:04:55.761Z","1.0.0":"2025-09-29T23:42:50.965Z","1.0.1":"2025-09-30T00:04:44.583Z","1.1.0":"2025-10-28T02:45:38.337Z","1.1.1":"2025-10-28T06:36:30.701Z","1.1.2":"2025-10-28T06:50:53.385Z","1.2.0":"2025-11-16T21:41:40.269Z","1.2.1":"2025-11-18T08:56:26.983Z","1.3.0":"2025-11-29T09:55:12.402Z","1.3.1":"2025-12-19T02:04:55.545Z"},"bugs":{"url":"https://github.com/Dreamystify/kestrel/issues"},"author":{"name":"Dreamystify"},"license":"MIT","homepage":"https://github.com/Dreamystify/kestrel#readme","keywords":["k-sortable","id","generator","bigint"],"repository":{"type":"git","url":"git+https://github.com/Dreamystify/kestrel.git"},"description":"A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.","maintainers":[{"name":"corey_lylyk","email":"support@dreamystify.com"}],"readme":"<div align=\"center\">\n  <br/>\n  <img src=\"./img/kestrel.png\" width=\"200\" />\n  <h1>Kestrel</h1>\n  <p>\n    A distributed, k-sortable unique ID generation system using Redis and Lua, inspired by Icicle.\n  </p>\n  <p>\n  <a href=\"https://badge.fury.io/js/@dreamystify%2Fkestrel\">\n    <img src=\"https://badge.fury.io/js/@dreamystify%2Fkestrel.svg\" alt=\"npm version\" height=\"18\">\n  </a>\n  <a href='https://coveralls.io/github/Dreamystify/kestrel ?branch=main'>\n    <img src='https://coveralls.io/repos/github/Dreamystify/kestrel/badge.svg?branch=main'\n         alt='Coverage Status' height=\"18\"/>\n  </a>\n\n  </p>\n</div>\n\n## Overview\n\nKestrel is for teams that want **globally unique, time-sortable IDs** in a Redis-backed system *and* want those IDs to be useful later in analytics.\n\nIt’s a good fit for:\n\n- **API + data platform teams**: generate IDs at write-time, then decode them in your warehouse/ETL jobs for time-based partitioning and debugging.\n- **Distributed systems**: multiple app instances can generate IDs without database round-trips, while preserving ordering by creation time.\n\nWhat you get:\n\n- **K-sortable 64-bit IDs**: IDs sort by creation time (milliseconds since a custom epoch).\n- **Embedded metadata**: each ID encodes:\n  - timestamp (ms)\n  - logical shard id\n  - per-millisecond sequence (0–4095)\n- **Decoding utilities**: `Kestrel.decodeId()` / `Kestrel.decodeIds()` to extract timestamp/shard/sequence for:\n  - **data warehousing** (e.g., derive `created_at`, partition keys, time-window rollups)\n  - **ETL/observability** (e.g., detect hot shards, analyze write bursts, investigate gaps)\n\nSee [`examples/`](./examples) for decode-focused scripts you can drop into warehouse/ETL workflows.\n\n## Getting started\n\n### Prerequisites\n\n- Node.js v20+ (ES modules support required)\n- Redis v7+ (standalone), or Redis Sentinel / Redis Cluster (optional modes)\n- Docker + Docker Compose (for the included local Sentinel/Cluster test stacks)\n\n```sh\n# Initialize the repo (if applicable)\n./.scripts/init.sh\n```\n\n## Installation\n\n```sh\nnpm install @dreamystify/kestrel\n```\n\nTo build the package locally with esbuild, run:\n\n```sh\nahoy build\n```\n\n## ES Modules Support\n\nThis package is built as an ES module and requires Node.js v18+ with ES modules\nsupport. When using this package:\n\n- Use `import` statements instead of `require()`\n- Ensure your `package.json` has `\"type\": \"module\"` or use `.mjs` file\n  extensions\n- The package exports are optimized for ES module resolution\n\n## Usage\n\nThe Kestrel library supports three connection modes: standalone, Sentinel, and\nCluster. Below are examples for each mode.\n\n### Standalone Mode\n\n```javascript\nimport { Kestrel } from '@dreamystify/kestrel';\n\n(async () => {\n  // Initialize Kestrel with standalone Redis\n  const kestrel = await Kestrel.initialize({\n    host: 'localhost',\n    port: 6379,\n    username: 'yourUsername', // if using authentication\n    password: 'yourPassword', // if using authentication\n    database: 0,\n  });\n\n  // Generate a single unique ID\n  const id = await kestrel.getId();\n  console.log('Generated ID:', id);\n\n  // Generate a batch of 3 IDs\n  const ids = await kestrel.getIds(3);\n  console.log('Generated IDs:', ids);\n})();\n```\n\n### Sentinel Mode\n\n```javascript\nimport { Kestrel } from '@dreamystify/kestrel';\n\n(async () => {\n  // Initialize Kestrel using Redis Sentinel\n  const kestrel = await Kestrel.initialize({\n    sentinels: [\n      { host: 'sentinel1', port: 26379 },\n      { host: 'sentinel2', port: 26379 },\n    ],\n    name: 'mymaster', // name of your master instance\n    username: 'yourUsername', // for the master\n    password: 'yourPassword', // for the master\n    sentinelUsername: 'sentinelUser', // if your Sentinel requires authentication\n    sentinelPassword: 'sentinelPassword', // if your Sentinel requires authentication\n    database: 0,\n  });\n\n  const id = await kestrel.getId();\n  console.log('Generated ID:', id);\n})();\n```\n\n### Cluster Mode\n\n```javascript\nimport { Kestrel } from '@dreamystify/kestrel';\n\n(async () => {\n  // Initialize Kestrel using Redis Cluster\n  const kestrel = await Kestrel.initialize({\n    clusterNodes: [\n      { host: 'redis-cluster-node1', port: 6379 },\n      { host: 'redis-cluster-node2', port: 6379 },\n      { host: 'redis-cluster-node3', port: 6379 },\n    ],\n    username: 'yourUsername', // for cluster authentication\n    password: 'yourPassword', // for cluster authentication\n    database: 0,\n  });\n\n  const id = await kestrel.getId();\n  console.log('Generated ID:', id);\n})();\n```\n\n### Sharding Configuration\n\n```javascript\nimport { Kestrel } from '@dreamystify/kestrel';\n\n(async () => {\n  // Initialize Kestrel with a custom shard configuration (for standalone mode)\n  const kestrel = await Kestrel.initialize({\n    host: 'localhost',\n    port: 6379,\n    username: 'yourUsername',\n    password: 'yourPassword',\n    database: 0,\n    // Optionally set a fixed shard ID via environment variable:\n    // KESTREL_SHARD_ID_KEY: '{kestrel}-shard-id',\n    // KESTREL_SHARD_ID: '1',\n  });\n\n  const id = await kestrel.getId();\n  console.log('Generated ID:', id);\n})();\n```\n\nIn Cluster mode, the library automatically assigns shard IDs to master nodes\nbased on the cluster topology. You can later query each node (using redis-cli)\nto see the assigned shard IDs:\n\n```sh\ndocker run -it --rm --network redis_cluster redis:7.0.2 redis-cli -a yourPassword --cluster call redis-cluster-node1:6379 GET '{kestrel}-shard-id'\n```\n\n### Decoding IDs\n\nKestrel IDs can be decoded back into their component parts, allowing you to\nextract information like when the ID was created, which shard generated it,\nand the sequence number.\n\n```javascript\nimport { Kestrel } from '@dreamystify/kestrel';\n\n(async () => {\n  const kestrel = await Kestrel.initialize({\n    host: 'localhost',\n    port: 6379,\n    username: 'yourUsername',\n    password: 'yourPassword',\n  });\n\n  // Generate an ID\n  const id = await kestrel.getId();\n\n  // Decode a single ID\n  const decoded = Kestrel.decodeId(id);\n  console.log('Timestamp (ms since Unix epoch):', decoded.timestampMs);\n  console.log('Timestamp (ms since custom epoch):', decoded.timestamp);\n  console.log('Logical Shard ID:', decoded.logicalShardId); // 0-1023\n  console.log('Sequence:', decoded.sequence); // 0-4095\n  console.log('Created At:', decoded.createdAt); // JavaScript Date object\n\n  // Decode multiple IDs\n  const ids = await kestrel.getIds(5);\n  const decodedIds = Kestrel.decodeIds(ids);\n  decodedIds.forEach((d, index) => {\n    console.log(`ID ${index + 1}:`);\n    console.log(`  Created: ${d.createdAt.toISOString()}`);\n    console.log(`  Shard: ${d.logicalShardId}, Sequence: ${d.sequence}`);\n  });\n})();\n```\n\nThe `decodeId` method accepts IDs as `bigint`, `string`, or `number`, making it\neasy to decode IDs from various sources (databases, APIs, etc.).\n\n## Error Handling\n\nKestrel emits events for errors. It is designed to let your application handle\nlogging and error processing in a way that suits your needs. For example:\n\n```javascript\nkestrel.on('error', error => {\n  console.error('Kestrel error:', error.error);\n});\n\nkestrel.on('connect', () => {\n  console.log('Kestrel connected to Redis');\n});\n```\n\n## Events\n\n| Event Constant                  | Event String                  | Description                                                                                       |\n| ------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------- |\n| `CLIENT_CREATED`                | `clientCreated`               | Emitted when the Redis client instance is successfully created.                                   |\n| `CONNECTED`                     | `connected`                   | Emitted when the client has successfully connected to Redis.                                      |\n| `SCRIPT_LOADED`                 | `scriptLoaded`                | Emitted when a Lua script is successfully loaded on a Redis node.                                 |\n| `NODE_ADDED`                    | `nodeAdded`                   | Emitted when a new node is detected in a cluster.                                                 |\n| `NODE_REMOVED`                  | `nodeRemoved`                 | Emitted when a node is removed from a cluster.                                                    |\n| `CLUSTER_NODE_ADDED`            | `+node`                       | Emitted when a new cluster node is added (internal cluster topology event).                       |\n| `CLUSTER_NODE_REMOVED`          | `-node`                       | Emitted when a cluster node is removed (internal cluster topology event).                         |\n| `ERROR`                         | `error`                       | Emitted when an error occurs within the Kestrel library.                                          |\n| **Redis Connection Events**     |                               |                                                                                                   |\n| `CONNECT`                       | `connect`                     | Emitted when a connection is established.                                                         |\n| `CONNECTING`                    | `connecting`                  | Emitted when the client is attempting to establish a connection.                                  |\n| `RECONNECTING`                  | `reconnecting`                | Emitted when the client is attempting to reconnect after a disconnect or error.                   |\n| `DISCONNECTED`                  | `disconnected`                | Emitted when the client has been disconnected.                                                    |\n| `WAIT`                          | `wait`                        | Emitted when the client is waiting (typically during retry/backoff).                              |\n| `READY`                         | `ready`                       | Emitted when the client is ready to accept commands.                                              |\n| `CLOSE`                         | `close`                       | Emitted when the connection is closed.                                                            |\n| `END`                           | `end`                         | Emitted when the connection has ended.                                                            |\n| `RECONNECTED`                   | `reconnected`                 | Emitted when the client has successfully reconnected.                                             |\n| `RECONNECTION_ATTEMPTS_REACHED` | `reconnectionAttemptsReached` | Emitted when the maximum number of reconnection attempts is reached and no further retries occur. |\n\n## Testing\n\n```sh\n# Start the testing environment\nahoy start\n\n# Run the tests with coverage\nahoy test\n\n# Run tests with coverage reporting\nahoy coverage\n\n# Stop the testing environment\nahoy stop\n```\n\n### Testing Sentinel and Cluster\n\n```sh\n# Start Redis containers (standalone + sentinel + cluster) and wait until they're ready\nahoy start\n\n# Run the Sentinel harness (uses tests/sentinel.js)\nahoy sentinel\n\n# Run the Cluster harness (uses tests/cluster.js)\nahoy cluster\n\n# Inspect harness container logs (if needed)\nahoy logs\n\n# Stop containers\nahoy stop\n```\n\n## Kudos\n\nThe project was inspired by [Icicle](https://github.com/intenthq/icicle), just\nsetup for node.js.\n","readmeFilename":"README.md"}