@windrun-huaiin/backend-core 11.0.3 → 13.0.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.
- package/dist/_virtual/_commonjs-dynamic-modules.js +7 -0
- package/dist/_virtual/_commonjs-dynamic-modules.mjs +5 -0
- package/dist/_virtual/_commonjsHelpers.js +10 -0
- package/dist/_virtual/_commonjsHelpers.mjs +7 -0
- package/dist/_virtual/aes.js +5 -0
- package/dist/_virtual/aes.mjs +3 -0
- package/dist/_virtual/blowfish.js +5 -0
- package/dist/_virtual/blowfish.mjs +3 -0
- package/dist/_virtual/cipher-core.js +5 -0
- package/dist/_virtual/cipher-core.mjs +3 -0
- package/dist/_virtual/core.js +5 -0
- package/dist/_virtual/core.mjs +3 -0
- package/dist/_virtual/enc-base64.js +5 -0
- package/dist/_virtual/enc-base64.mjs +3 -0
- package/dist/_virtual/enc-base64url.js +5 -0
- package/dist/_virtual/enc-base64url.mjs +3 -0
- package/dist/_virtual/enc-utf16.js +5 -0
- package/dist/_virtual/enc-utf16.mjs +3 -0
- package/dist/_virtual/evpkdf.js +5 -0
- package/dist/_virtual/evpkdf.mjs +3 -0
- package/dist/_virtual/format-hex.js +5 -0
- package/dist/_virtual/format-hex.mjs +3 -0
- package/dist/_virtual/hmac.js +5 -0
- package/dist/_virtual/hmac.mjs +3 -0
- package/dist/_virtual/index.js +7 -0
- package/dist/_virtual/index.mjs +5 -0
- package/dist/_virtual/index2.js +9 -0
- package/dist/_virtual/index2.mjs +7 -0
- package/dist/_virtual/index3.js +5 -0
- package/dist/_virtual/index3.mjs +3 -0
- package/dist/_virtual/lib-typedarrays.js +5 -0
- package/dist/_virtual/lib-typedarrays.mjs +3 -0
- package/dist/_virtual/md5.js +5 -0
- package/dist/_virtual/md5.mjs +3 -0
- package/dist/_virtual/mode-cfb.js +5 -0
- package/dist/_virtual/mode-cfb.mjs +3 -0
- package/dist/_virtual/mode-ctr-gladman.js +5 -0
- package/dist/_virtual/mode-ctr-gladman.mjs +3 -0
- package/dist/_virtual/mode-ctr.js +5 -0
- package/dist/_virtual/mode-ctr.mjs +3 -0
- package/dist/_virtual/mode-ecb.js +5 -0
- package/dist/_virtual/mode-ecb.mjs +3 -0
- package/dist/_virtual/mode-ofb.js +5 -0
- package/dist/_virtual/mode-ofb.mjs +3 -0
- package/dist/_virtual/pad-ansix923.js +5 -0
- package/dist/_virtual/pad-ansix923.mjs +3 -0
- package/dist/_virtual/pad-iso10126.js +5 -0
- package/dist/_virtual/pad-iso10126.mjs +3 -0
- package/dist/_virtual/pad-iso97971.js +5 -0
- package/dist/_virtual/pad-iso97971.mjs +3 -0
- package/dist/_virtual/pad-nopadding.js +5 -0
- package/dist/_virtual/pad-nopadding.mjs +3 -0
- package/dist/_virtual/pad-zeropadding.js +5 -0
- package/dist/_virtual/pad-zeropadding.mjs +3 -0
- package/dist/_virtual/pbkdf2.js +5 -0
- package/dist/_virtual/pbkdf2.mjs +3 -0
- package/dist/_virtual/rabbit-legacy.js +5 -0
- package/dist/_virtual/rabbit-legacy.mjs +3 -0
- package/dist/_virtual/rabbit.js +5 -0
- package/dist/_virtual/rabbit.mjs +3 -0
- package/dist/_virtual/rc4.js +5 -0
- package/dist/_virtual/rc4.mjs +3 -0
- package/dist/_virtual/ripemd160.js +5 -0
- package/dist/_virtual/ripemd160.mjs +3 -0
- package/dist/_virtual/sha1.js +5 -0
- package/dist/_virtual/sha1.mjs +3 -0
- package/dist/_virtual/sha224.js +5 -0
- package/dist/_virtual/sha224.mjs +3 -0
- package/dist/_virtual/sha256.js +5 -0
- package/dist/_virtual/sha256.mjs +3 -0
- package/dist/_virtual/sha3.js +5 -0
- package/dist/_virtual/sha3.mjs +3 -0
- package/dist/_virtual/sha384.js +5 -0
- package/dist/_virtual/sha384.mjs +3 -0
- package/dist/_virtual/sha512.js +5 -0
- package/dist/_virtual/sha512.mjs +3 -0
- package/dist/_virtual/tripledes.js +5 -0
- package/dist/_virtual/tripledes.mjs +3 -0
- package/dist/_virtual/x64-core.js +5 -0
- package/dist/_virtual/x64-core.mjs +3 -0
- package/dist/index.js +46 -0
- package/dist/index.mjs +7 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +46 -0
- package/dist/lib/index.mjs +7 -0
- package/dist/lib/upstash/index.d.ts +7 -0
- package/dist/lib/upstash/index.d.ts.map +1 -0
- package/dist/lib/upstash/qstash.d.ts +36 -0
- package/dist/lib/upstash/qstash.d.ts.map +1 -0
- package/dist/lib/upstash/qstash.js +130 -0
- package/dist/lib/upstash/qstash.mjs +124 -0
- package/dist/lib/upstash/redis-counter.d.ts +17 -0
- package/dist/lib/upstash/redis-counter.d.ts.map +1 -0
- package/dist/lib/upstash/redis-counter.js +55 -0
- package/dist/lib/upstash/redis-counter.mjs +50 -0
- package/dist/lib/upstash/redis-favorite.d.ts +21 -0
- package/dist/lib/upstash/redis-favorite.d.ts.map +1 -0
- package/dist/lib/upstash/redis-favorite.js +74 -0
- package/dist/lib/upstash/redis-favorite.mjs +68 -0
- package/dist/lib/upstash/redis-like.d.ts +21 -0
- package/dist/lib/upstash/redis-like.d.ts.map +1 -0
- package/dist/lib/upstash/redis-like.js +74 -0
- package/dist/lib/upstash/redis-like.mjs +68 -0
- package/dist/lib/upstash/redis-lock.d.ts +13 -0
- package/dist/lib/upstash/redis-lock.d.ts.map +1 -0
- package/dist/lib/upstash/redis-lock.js +75 -0
- package/dist/lib/upstash/redis-lock.mjs +71 -0
- package/dist/lib/upstash/redis-structures.d.ts +63 -0
- package/dist/lib/upstash/redis-structures.d.ts.map +1 -0
- package/dist/lib/upstash/redis-structures.js +211 -0
- package/dist/lib/upstash/redis-structures.mjs +195 -0
- package/dist/lib/upstash-config.d.ts +11 -0
- package/dist/lib/upstash-config.d.ts.map +1 -0
- package/dist/lib/upstash-config.js +53 -0
- package/dist/lib/upstash-config.mjs +50 -0
- package/dist/node_modules/.pnpm/@upstash_lock@0.2.1_typescript@5.9.3/node_modules/@upstash/lock/dist/index.js +191 -0
- package/dist/node_modules/.pnpm/@upstash_lock@0.2.1_typescript@5.9.3/node_modules/@upstash/lock/dist/index.mjs +189 -0
- package/dist/node_modules/.pnpm/@upstash_qstash@2.8.4/node_modules/@upstash/qstash/chunk-RQPZUJXG.js +1419 -0
- package/dist/node_modules/.pnpm/@upstash_qstash@2.8.4/node_modules/@upstash/qstash/chunk-RQPZUJXG.mjs +1403 -0
- package/dist/node_modules/.pnpm/@upstash_redis@1.36.1/node_modules/@upstash/redis/chunk-LLI2WIYN.js +4691 -0
- package/dist/node_modules/.pnpm/@upstash_redis@1.36.1/node_modules/@upstash/redis/chunk-LLI2WIYN.mjs +4686 -0
- package/dist/node_modules/.pnpm/@upstash_redis@1.36.1/node_modules/@upstash/redis/nodejs.js +115 -0
- package/dist/node_modules/.pnpm/@upstash_redis@1.36.1/node_modules/@upstash/redis/nodejs.mjs +113 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.js +248 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.mjs +246 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.js +485 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.mjs +483 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.js +906 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.mjs +904 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.js +818 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.mjs +816 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.js +146 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.mjs +144 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.js +158 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.mjs +156 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.js +159 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.mjs +157 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.js +146 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.mjs +144 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.js +77 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.mjs +75 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.js +153 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.mjs +151 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.js +62 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.mjs +60 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.js +86 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.mjs +84 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.js +278 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.mjs +276 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.js +91 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.mjs +89 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.js +127 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.mjs +125 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.js +69 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.mjs +67 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.js +51 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.mjs +49 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.js +65 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.mjs +63 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.js +60 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.mjs +58 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.js +55 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.mjs +53 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.js +51 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.mjs +49 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.js +41 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.mjs +39 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.js +58 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.mjs +56 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.js +157 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.mjs +155 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.js +204 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.mjs +202 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.js +206 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.mjs +204 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.js +153 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.mjs +151 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.js +277 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.mjs +275 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.js +160 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.mjs +158 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.js +91 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.mjs +89 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.js +209 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.mjs +207 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.js +337 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.mjs +335 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.js +95 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.mjs +93 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.js +337 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.mjs +335 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.js +793 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.mjs +791 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.js +314 -0
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.mjs +312 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/compact/verify.js +26 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/compact/verify.mjs +24 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/flattened/verify.js +127 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/flattened/verify.mjs +125 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jwt/verify.js +20 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jwt/verify.mjs +18 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/key/import.js +31 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/key/import.mjs +29 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/buffer_utils.js +18 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/buffer_utils.mjs +14 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/check_key_type.js +82 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/check_key_type.mjs +80 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/crypto_key.js +103 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/crypto_key.mjs +101 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/epoch.js +5 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/epoch.mjs +3 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/invalid_key_input.js +38 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/invalid_key_input.mjs +33 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_disjoint.js +25 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_disjoint.mjs +23 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_jwk.js +21 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_jwk.mjs +16 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_object.js +20 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_object.mjs +18 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/jwt_claims_set.js +109 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/jwt_claims_set.mjs +107 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/secs.js +59 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/secs.mjs +57 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_algorithms.js +14 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_algorithms.mjs +12 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_crit.js +38 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_crit.mjs +36 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/base64url.js +15 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/base64url.mjs +13 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/check_key_length.js +21 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/check_key_length.mjs +19 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/dsa_digest.js +28 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/dsa_digest.mjs +26 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_named_curve.js +58 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_named_curve.mjs +56 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_sign_verify_key.js +33 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_sign_verify_key.mjs +31 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/hmac_digest.js +18 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/hmac_digest.mjs +16 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_like.js +15 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_like.mjs +10 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_object.js +26 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_object.mjs +5 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/jwk_to_key.js +12 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/jwk_to_key.mjs +10 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/node_key.js +113 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/node_key.mjs +111 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/sign.js +40 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/sign.mjs +19 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/verify.js +52 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/verify.mjs +31 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/webcrypto.js +32 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/webcrypto.mjs +7 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/util/errors.js +69 -0
- package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/util/errors.mjs +60 -0
- package/dist/node_modules/.pnpm/neverthrow@7.2.0/node_modules/neverthrow/dist/index.es.js +422 -0
- package/dist/node_modules/.pnpm/neverthrow@7.2.0/node_modules/neverthrow/dist/index.es.mjs +415 -0
- package/dist/node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.web.js +6 -0
- package/dist/node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.web.mjs +4 -0
- package/package.json +14 -11
- package/src/lib/index.ts +2 -0
- package/src/lib/upstash/index.ts +6 -0
- package/src/lib/upstash/qstash.ts +157 -0
- package/src/lib/upstash/redis-counter.ts +51 -0
- package/src/lib/upstash/redis-favorite.ts +75 -0
- package/src/lib/upstash/redis-like.ts +75 -0
- package/src/lib/upstash/redis-lock.ts +85 -0
- package/src/lib/upstash/redis-structures.ts +249 -0
- package/src/lib/upstash-config.ts +54 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { getRedis } from '../upstash-config';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Increment a counter (e.g. views, forwards). Returns null if Redis is unavailable.
|
|
5
|
+
*/
|
|
6
|
+
export const incrCounter = async (key: string, delta = 1): Promise<number | null> => {
|
|
7
|
+
const redis = getRedis();
|
|
8
|
+
if (!redis) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return redis.incrby(key, delta);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get a counter value. Returns null if Redis is unavailable.
|
|
16
|
+
*/
|
|
17
|
+
export const getCounter = async (key: string): Promise<number | null> => {
|
|
18
|
+
const redis = getRedis();
|
|
19
|
+
if (!redis) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const value = await redis.get<number>(key);
|
|
23
|
+
return value ?? 0;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Increment a unique counter via SET (e.g. unique views). Returns null if Redis is unavailable.
|
|
28
|
+
*/
|
|
29
|
+
export const incrUniqueCounter = async (setKey: string, memberId: string): Promise<number | null> => {
|
|
30
|
+
const redis = getRedis();
|
|
31
|
+
if (!redis) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const added = await redis.sadd(setKey, memberId);
|
|
36
|
+
if (added === 1) {
|
|
37
|
+
return redis.scard(setKey);
|
|
38
|
+
}
|
|
39
|
+
return redis.scard(setKey);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get unique counter value (SET cardinality). Returns null if Redis is unavailable.
|
|
44
|
+
*/
|
|
45
|
+
export const getUniqueCounter = async (setKey: string): Promise<number | null> => {
|
|
46
|
+
const redis = getRedis();
|
|
47
|
+
if (!redis) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return redis.scard(setKey);
|
|
51
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getRedis } from '../upstash-config';
|
|
2
|
+
|
|
3
|
+
const favoriteTargetKey = (targetId: string): string => `favorite:target:${targetId}`;
|
|
4
|
+
const favoriteUserKey = (userId: string): string => `favorite:user:${userId}`;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Favorite a target. Returns true if added, false if already favorited, null if Redis is unavailable.
|
|
8
|
+
*/
|
|
9
|
+
export const addFavorite = async (targetId: string, userId: string): Promise<boolean | null> => {
|
|
10
|
+
const redis = getRedis();
|
|
11
|
+
if (!redis) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const added = await redis.sadd(favoriteTargetKey(targetId), userId);
|
|
16
|
+
if (added === 1) {
|
|
17
|
+
await redis.sadd(favoriteUserKey(userId), targetId);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Remove a favorite. Returns true if removed, false if not found, null if Redis is unavailable.
|
|
25
|
+
*/
|
|
26
|
+
export const removeFavorite = async (targetId: string, userId: string): Promise<boolean | null> => {
|
|
27
|
+
const redis = getRedis();
|
|
28
|
+
if (!redis) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const removed = await redis.srem(favoriteTargetKey(targetId), userId);
|
|
33
|
+
if (removed === 1) {
|
|
34
|
+
await redis.srem(favoriteUserKey(userId), targetId);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check whether a user has favorited a target. Returns null if Redis is unavailable.
|
|
42
|
+
*/
|
|
43
|
+
export const isFavorited = async (targetId: string, userId: string): Promise<boolean | null> => {
|
|
44
|
+
const redis = getRedis();
|
|
45
|
+
if (!redis) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const result = await redis.sismember(favoriteTargetKey(targetId), userId);
|
|
50
|
+
return result === 1;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get favorite count for a target. Returns null if Redis is unavailable.
|
|
55
|
+
*/
|
|
56
|
+
export const getFavoriteCount = async (targetId: string): Promise<number | null> => {
|
|
57
|
+
const redis = getRedis();
|
|
58
|
+
if (!redis) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return redis.scard(favoriteTargetKey(targetId));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get target ids favorited by a user. Returns null if Redis is unavailable.
|
|
67
|
+
*/
|
|
68
|
+
export const getUserFavorites = async (userId: string): Promise<string[] | null> => {
|
|
69
|
+
const redis = getRedis();
|
|
70
|
+
if (!redis) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return redis.smembers<string[]>(favoriteUserKey(userId));
|
|
75
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getRedis } from '../upstash-config';
|
|
2
|
+
|
|
3
|
+
const likeTargetKey = (targetId: string): string => `like:target:${targetId}`;
|
|
4
|
+
const likeUserKey = (userId: string): string => `like:user:${userId}`;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Like a target. Returns true if the like was added, false if it already existed, null if Redis is unavailable.
|
|
8
|
+
*/
|
|
9
|
+
export const likeTarget = async (targetId: string, userId: string): Promise<boolean | null> => {
|
|
10
|
+
const redis = getRedis();
|
|
11
|
+
if (!redis) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const added = await redis.sadd(likeTargetKey(targetId), userId);
|
|
16
|
+
if (added === 1) {
|
|
17
|
+
await redis.sadd(likeUserKey(userId), targetId);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Unlike a target. Returns true if removed, false if it didn't exist, null if Redis is unavailable.
|
|
25
|
+
*/
|
|
26
|
+
export const unlikeTarget = async (targetId: string, userId: string): Promise<boolean | null> => {
|
|
27
|
+
const redis = getRedis();
|
|
28
|
+
if (!redis) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const removed = await redis.srem(likeTargetKey(targetId), userId);
|
|
33
|
+
if (removed === 1) {
|
|
34
|
+
await redis.srem(likeUserKey(userId), targetId);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check whether a user liked a target. Returns null if Redis is unavailable.
|
|
42
|
+
*/
|
|
43
|
+
export const isTargetLiked = async (targetId: string, userId: string): Promise<boolean | null> => {
|
|
44
|
+
const redis = getRedis();
|
|
45
|
+
if (!redis) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const result = await redis.sismember(likeTargetKey(targetId), userId);
|
|
50
|
+
return result === 1;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get like count for a target (unique by user). Returns null if Redis is unavailable.
|
|
55
|
+
*/
|
|
56
|
+
export const getTargetLikeCount = async (targetId: string): Promise<number | null> => {
|
|
57
|
+
const redis = getRedis();
|
|
58
|
+
if (!redis) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return redis.scard(likeTargetKey(targetId));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get target ids liked by a user. Returns null if Redis is unavailable.
|
|
67
|
+
*/
|
|
68
|
+
export const getUserLikedTargets = async (userId: string): Promise<string[] | null> => {
|
|
69
|
+
const redis = getRedis();
|
|
70
|
+
if (!redis) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return redis.smembers<string[]>(likeUserKey(userId));
|
|
75
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Lock } from '@upstash/lock';
|
|
2
|
+
import type { Redis } from '@upstash/redis';
|
|
3
|
+
import { getRedis } from '../upstash-config';
|
|
4
|
+
|
|
5
|
+
type UpstashLock = {
|
|
6
|
+
acquire: (key: string, ttlMs: number) => Promise<string | null>;
|
|
7
|
+
release: (key: string, token: string) => Promise<boolean>;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
let cachedLock: UpstashLock | null = null;
|
|
11
|
+
let lockInitAttempted = false;
|
|
12
|
+
|
|
13
|
+
const createLock = (redis: Redis): UpstashLock => {
|
|
14
|
+
const LockCtor = Lock as unknown as new (...args: any[]) => UpstashLock;
|
|
15
|
+
try {
|
|
16
|
+
return new LockCtor({ redis });
|
|
17
|
+
} catch {
|
|
18
|
+
return new LockCtor(redis);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const getLock = (): UpstashLock | null => {
|
|
23
|
+
if (cachedLock) {
|
|
24
|
+
return cachedLock;
|
|
25
|
+
}
|
|
26
|
+
if (lockInitAttempted) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
lockInitAttempted = true;
|
|
30
|
+
|
|
31
|
+
const redis = getRedis();
|
|
32
|
+
if (!redis) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
cachedLock = createLock(redis);
|
|
37
|
+
return cachedLock;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Acquire a distributed lock. Returns the lock token or null when unavailable.
|
|
42
|
+
*/
|
|
43
|
+
export const acquireLock = async (key: string, ttlMs: number): Promise<string | null> => {
|
|
44
|
+
const lock = getLock();
|
|
45
|
+
if (!lock) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return lock.acquire(key, ttlMs);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Release a distributed lock. Returns false when the lock client is unavailable.
|
|
53
|
+
*/
|
|
54
|
+
export const releaseLock = async (key: string, token: string): Promise<boolean> => {
|
|
55
|
+
const lock = getLock();
|
|
56
|
+
if (!lock) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return lock.release(key, token);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Run a function under a distributed lock. Returns null when the lock is unavailable.
|
|
64
|
+
*/
|
|
65
|
+
export const withLock = async <T>(
|
|
66
|
+
key: string,
|
|
67
|
+
ttlMs: number,
|
|
68
|
+
fn: () => Promise<T> | T
|
|
69
|
+
): Promise<T | null> => {
|
|
70
|
+
const lock = getLock();
|
|
71
|
+
if (!lock) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const token = await lock.acquire(key, ttlMs);
|
|
76
|
+
if (!token) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
return await fn();
|
|
82
|
+
} finally {
|
|
83
|
+
await lock.release(key, token);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { getRedis } from '../upstash-config';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Set a plain string value with optional TTL (seconds).
|
|
5
|
+
*/
|
|
6
|
+
export const setString = async (
|
|
7
|
+
key: string,
|
|
8
|
+
value: string,
|
|
9
|
+
ttlSec?: number
|
|
10
|
+
): Promise<boolean> => {
|
|
11
|
+
const redis = getRedis();
|
|
12
|
+
if (!redis) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (ttlSec && ttlSec > 0) {
|
|
17
|
+
await redis.set(key, value, { ex: ttlSec });
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
await redis.set(key, value);
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get a plain string value. Returns null if Redis is unavailable or key missing.
|
|
27
|
+
*/
|
|
28
|
+
export const getString = async (key: string): Promise<string | null> => {
|
|
29
|
+
const redis = getRedis();
|
|
30
|
+
if (!redis) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return redis.get<string>(key);
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Store an object as JSON string with optional TTL (seconds).
|
|
39
|
+
*/
|
|
40
|
+
export const setJson = async <T>(
|
|
41
|
+
key: string,
|
|
42
|
+
value: T,
|
|
43
|
+
ttlSec?: number
|
|
44
|
+
): Promise<boolean> => {
|
|
45
|
+
const redis = getRedis();
|
|
46
|
+
if (!redis) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const payload = JSON.stringify(value);
|
|
51
|
+
if (ttlSec && ttlSec > 0) {
|
|
52
|
+
await redis.set(key, payload, { ex: ttlSec });
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
await redis.set(key, payload);
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Get an object stored as JSON string. Returns null if missing or invalid JSON.
|
|
62
|
+
*/
|
|
63
|
+
export const getJson = async <T>(key: string): Promise<T | null> => {
|
|
64
|
+
const redis = getRedis();
|
|
65
|
+
if (!redis) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const payload = await redis.get<string>(key);
|
|
70
|
+
if (!payload) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(payload) as T;
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Delete a key. Returns false if Redis is unavailable.
|
|
83
|
+
*/
|
|
84
|
+
export const deleteKey = async (key: string): Promise<boolean> => {
|
|
85
|
+
const redis = getRedis();
|
|
86
|
+
if (!redis) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const deleted = await redis.del(key);
|
|
91
|
+
return deleted > 0;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Set a hash field value.
|
|
96
|
+
*/
|
|
97
|
+
export const setHashField = async (key: string, field: string, value: string): Promise<boolean> => {
|
|
98
|
+
const redis = getRedis();
|
|
99
|
+
if (!redis) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const result = await redis.hset(key, { [field]: value });
|
|
104
|
+
return result > 0;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get a hash field value.
|
|
109
|
+
*/
|
|
110
|
+
export const getHashField = async (key: string, field: string): Promise<string | null> => {
|
|
111
|
+
const redis = getRedis();
|
|
112
|
+
if (!redis) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return redis.hget<string>(key, field);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Store a hash field as JSON string.
|
|
121
|
+
*/
|
|
122
|
+
export const setHashJson = async <T>(
|
|
123
|
+
key: string,
|
|
124
|
+
field: string,
|
|
125
|
+
value: T
|
|
126
|
+
): Promise<boolean> => {
|
|
127
|
+
const redis = getRedis();
|
|
128
|
+
if (!redis) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const payload = JSON.stringify(value);
|
|
133
|
+
const result = await redis.hset(key, { [field]: payload });
|
|
134
|
+
return result > 0;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Get a hash field stored as JSON string.
|
|
139
|
+
*/
|
|
140
|
+
export const getHashJson = async <T>(key: string, field: string): Promise<T | null> => {
|
|
141
|
+
const redis = getRedis();
|
|
142
|
+
if (!redis) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const payload = await redis.hget<string>(key, field);
|
|
147
|
+
if (!payload) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
try {
|
|
152
|
+
return JSON.parse(payload) as T;
|
|
153
|
+
} catch {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Get all hash fields.
|
|
160
|
+
*/
|
|
161
|
+
export const getHashAll = async (key: string): Promise<Record<string, string> | null> => {
|
|
162
|
+
const redis = getRedis();
|
|
163
|
+
if (!redis) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const result = await redis.hgetall<Record<string, string>>(key);
|
|
168
|
+
return result ?? {};
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Remove a hash field.
|
|
173
|
+
*/
|
|
174
|
+
export const deleteHashField = async (key: string, field: string): Promise<boolean> => {
|
|
175
|
+
const redis = getRedis();
|
|
176
|
+
if (!redis) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const removed = await redis.hdel(key, field);
|
|
181
|
+
return removed > 0;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
type ListDirection = 'left' | 'right';
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Push values to a list. Returns list length or null if Redis is unavailable.
|
|
188
|
+
*/
|
|
189
|
+
export const pushList = async (
|
|
190
|
+
key: string,
|
|
191
|
+
values: string[],
|
|
192
|
+
direction: ListDirection = 'right'
|
|
193
|
+
): Promise<number | null> => {
|
|
194
|
+
const redis = getRedis();
|
|
195
|
+
if (!redis) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (values.length === 0) {
|
|
200
|
+
return redis.llen(key);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return direction === 'left'
|
|
204
|
+
? redis.lpush(key, ...values)
|
|
205
|
+
: redis.rpush(key, ...values);
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Pop a value from a list.
|
|
210
|
+
*/
|
|
211
|
+
export const popList = async (
|
|
212
|
+
key: string,
|
|
213
|
+
direction: ListDirection = 'right'
|
|
214
|
+
): Promise<string | null> => {
|
|
215
|
+
const redis = getRedis();
|
|
216
|
+
if (!redis) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return direction === 'left' ? redis.lpop<string>(key) : redis.rpop<string>(key);
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Get a range from a list.
|
|
225
|
+
*/
|
|
226
|
+
export const rangeList = async (
|
|
227
|
+
key: string,
|
|
228
|
+
start = 0,
|
|
229
|
+
stop = -1
|
|
230
|
+
): Promise<string[] | null> => {
|
|
231
|
+
const redis = getRedis();
|
|
232
|
+
if (!redis) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return redis.lrange<string>(key, start, stop);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Get list length.
|
|
241
|
+
*/
|
|
242
|
+
export const listLength = async (key: string): Promise<number | null> => {
|
|
243
|
+
const redis = getRedis();
|
|
244
|
+
if (!redis) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return redis.llen(key);
|
|
249
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Redis } from '@upstash/redis';
|
|
2
|
+
import { Client as QstashClient } from '@upstash/qstash';
|
|
3
|
+
|
|
4
|
+
let cachedRedis: Redis | null = null;
|
|
5
|
+
let cachedQstash: QstashClient | null = null;
|
|
6
|
+
let redisInitAttempted = false;
|
|
7
|
+
let qstashInitAttempted = false;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Get the Upstash Redis client. Returns null when required env vars are missing.
|
|
11
|
+
*/
|
|
12
|
+
export const getRedis = (): Redis | null => {
|
|
13
|
+
if (cachedRedis) {
|
|
14
|
+
return cachedRedis;
|
|
15
|
+
}
|
|
16
|
+
if (redisInitAttempted) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
redisInitAttempted = true;
|
|
21
|
+
const { UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN } = process.env;
|
|
22
|
+
if (!UPSTASH_REDIS_REST_URL || !UPSTASH_REDIS_REST_TOKEN) {
|
|
23
|
+
console.warn('[Upstash Config] Redis Missed configration UPSTASH_REDIS_REST_URL or UPSTASH_REDIS_REST_TOKEN, then disabled');
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
cachedRedis = new Redis({
|
|
28
|
+
url: UPSTASH_REDIS_REST_URL,
|
|
29
|
+
token: UPSTASH_REDIS_REST_TOKEN,
|
|
30
|
+
});
|
|
31
|
+
return cachedRedis;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get the Upstash QStash client. Returns null when required env vars are missing.
|
|
36
|
+
*/
|
|
37
|
+
export const getQstash = (): QstashClient | null => {
|
|
38
|
+
if (cachedQstash) {
|
|
39
|
+
return cachedQstash;
|
|
40
|
+
}
|
|
41
|
+
if (qstashInitAttempted) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
qstashInitAttempted = true;
|
|
46
|
+
const { QSTASH_TOKEN } = process.env;
|
|
47
|
+
if (!QSTASH_TOKEN) {
|
|
48
|
+
console.warn('[Upstash Config] QStash Missed configration QSTASH_TOKEN, then disabled');
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
cachedQstash = new QstashClient({ token: QSTASH_TOKEN });
|
|
53
|
+
return cachedQstash;
|
|
54
|
+
};
|