{"_id":"@builtwithai/serverless-redis-client","name":"@builtwithai/serverless-redis-client","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@builtwithai/serverless-redis-client","version":"1.0.0","description":"TypeScript client for Serverless Redis Proxy","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","dev":"rollup -c -w","test":"jest","test:watch":"jest --watch","lint":"eslint src/**/*.ts","type-check":"tsc --noEmit","clean":"rm -rf dist"},"keywords":["redis","serverless","edge","http","client","typescript"],"repository":{"type":"git","url":"git+https://github.com/built-with-ai/serverless-redis.git","directory":"client-sdks/packages/core"},"license":"MIT","author":{"name":"Built with AI Team"},"engines":{"node":">=16"},"devDependencies":{"@types/jest":"^29.5.5","jest":"^29.7.0","rollup":"^3.29.4","rollup-plugin-typescript2":"^0.36.0","ts-jest":"^29.1.1","typescript":"^5.2.2"},"publishConfig":{"access":"public"},"_id":"@builtwithai/serverless-redis-client@1.0.0","gitHead":"d945edfe0ae36cd3a2136df2b2001db43916891e","bugs":{"url":"https://github.com/built-with-ai/serverless-redis/issues"},"homepage":"https://github.com/built-with-ai/serverless-redis#readme","_nodeVersion":"20.11.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-SNyQFaHtmIH3OpQJ0u57RZWypOUnh5g6RlKtV855PxzkZpQHiqFQA0c3g/GY9notXI0nLLeDDdVm4G6piyjU+w==","shasum":"89707d14fcb33ea39149e96576a1b92588b31166","tarball":"https://registry.npmjs.org/@builtwithai/serverless-redis-client/-/serverless-redis-client-1.0.0.tgz","fileCount":18,"unpackedSize":95541,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDaMVjlzeotM5QwSthMI9p0uzOggCgQ0ej04w6ufWFh4gIhAIJC5z/yCxR8a8AYZkf6bJYOVIkHOjU6nGZ3znVSunYa"}]},"_npmUser":{"name":"scalerllc","email":"chris.naegelin@scaler.io"},"directories":{},"maintainers":[{"name":"scalerllc","email":"chris.naegelin@scaler.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/serverless-redis-client_1.0.0_1754148933507_0.9260783581330396"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-02T15:35:33.372Z","1.0.0":"2025-08-02T15:35:33.696Z","modified":"2025-08-02T15:35:34.033Z"},"maintainers":[{"name":"scalerllc","email":"chris.naegelin@scaler.io"}],"description":"TypeScript client for Serverless Redis Proxy","homepage":"https://github.com/built-with-ai/serverless-redis#readme","keywords":["redis","serverless","edge","http","client","typescript"],"repository":{"type":"git","url":"git+https://github.com/built-with-ai/serverless-redis.git","directory":"client-sdks/packages/core"},"author":{"name":"Built with AI Team"},"bugs":{"url":"https://github.com/built-with-ai/serverless-redis/issues"},"license":"MIT","readme":"# @scaler/serverless-redis-client\n\nTypeScript client library for the Serverless Redis Proxy, providing a familiar Redis-like API optimized for serverless and edge computing environments.\n\n## Installation\n\n```bash\nnpm install @scaler/serverless-redis-client\n```\n\n## Quick Start\n\n```typescript\nimport { ServerlessRedis } from '@scaler/serverless-redis-client';\n\nconst redis = new ServerlessRedis({\n  url: 'https://your-proxy.example.com',\n  token: 'your-api-key'\n});\n\n// Basic operations\nawait redis.set('key', 'value');\nconst value = await redis.get('key');\n\n// Pipeline operations\nconst results = await redis.pipeline()\n  .set('key1', 'value1')\n  .set('key2', 'value2')\n  .mget(['key1', 'key2'])\n  .exec();\n\n// Transaction operations\nconst txResults = await redis.multi()\n  .set('counter', '0')\n  .incr('counter')\n  .exec();\n```\n\n## Features\n\n- 🚀 **Redis-like API** - Familiar interface for Redis developers\n- 📦 **Zero Dependencies** - Minimal bundle size (< 50KB)\n- 🔧 **TypeScript First** - Full type safety and IntelliSense\n- ⚡ **Edge Optimized** - Works in Node.js, browsers, and edge runtimes\n- 🔄 **Pipeline Support** - Batch operations for better performance\n- 🛡️ **Error Handling** - Proper Redis error semantics\n- 🔌 **Middleware Support** - Request/response interceptors\n- ⚙️ **Configurable** - Timeouts, retries, compression\n\n## Configuration\n\n```typescript\nconst redis = new ServerlessRedis({\n  url: 'https://your-proxy.example.com',\n  token: 'your-api-key',\n  timeout: 5000,          // Request timeout (ms)\n  retries: 3,             // Retry attempts\n  retryDelay: 100,        // Base retry delay (ms)\n  compression: true,      // Enable compression\n  db: 0,                  // Default database\n  headers: {              // Custom headers\n    'X-Custom': 'value'\n  }\n});\n```\n\n## API Reference\n\n### String Operations\n\n```typescript\nawait redis.set('key', 'value');\nawait redis.set('key', 'value', 'EX', 60); // With expiration\nconst value = await redis.get('key');\nconst values = await redis.mget('key1', 'key2', 'key3');\nawait redis.mset('key1', 'value1', 'key2', 'value2');\nawait redis.del('key1', 'key2');\nconst exists = await redis.exists('key');\nawait redis.expire('key', 60);\nconst ttl = await redis.ttl('key');\n```\n\n### Numeric Operations\n\n```typescript\nconst newValue = await redis.incr('counter');\nconst newValue = await redis.incrby('counter', 5);\nconst newValue = await redis.decr('counter');\nconst newValue = await redis.decrby('counter', 3);\n```\n\n### Hash Operations\n\n```typescript\nawait redis.hset('user:123', 'name', 'John', 'age', '30');\nconst name = await redis.hget('user:123', 'name');\nconst values = await redis.hmget('user:123', 'name', 'age');\nconst all = await redis.hgetall('user:123');\nawait redis.hdel('user:123', 'age');\nconst exists = await redis.hexists('user:123', 'name');\nconst count = await redis.hlen('user:123');\nconst keys = await redis.hkeys('user:123');\nconst values = await redis.hvals('user:123');\n```\n\n### List Operations\n\n```typescript\nawait redis.lpush('list', 'item1', 'item2');\nawait redis.rpush('list', 'item3');\nconst item = await redis.lpop('list');\nconst items = await redis.lpop('list', 2);\nconst length = await redis.llen('list');\nconst range = await redis.lrange('list', 0, -1);\n```\n\n### Set Operations\n\n```typescript\nawait redis.sadd('set', 'member1', 'member2');\nawait redis.srem('set', 'member1');\nconst members = await redis.smembers('set');\nconst count = await redis.scard('set');\nconst isMember = await redis.sismember('set', 'member1');\n```\n\n### Sorted Set Operations\n\n```typescript\nawait redis.zadd('zset', 1, 'member1', 2, 'member2');\nawait redis.zrem('zset', 'member1');\nconst range = await redis.zrange('zset', 0, -1);\nconst rangeWithScores = await redis.zrange('zset', 0, -1, true);\nconst count = await redis.zcard('zset');\nconst score = await redis.zscore('zset', 'member1');\n```\n\n### Pipeline Operations\n\n```typescript\nconst pipeline = redis.pipeline();\n\npipeline\n  .set('key1', 'value1')\n  .set('key2', 'value2')\n  .get('key1')\n  .incr('counter');\n\nconst results = await pipeline.exec();\nconsole.log(results); // ['OK', 'OK', 'value1', 1]\n\n// With detailed results\nconst detailedResults = await pipeline.execWithDetails();\nconsole.log(detailedResults.time); // Execution time\n```\n\n### Transaction Operations\n\n```typescript\nconst transaction = redis.multi();\n\ntransaction\n  .set('key1', 'value1')\n  .incr('counter')\n  .get('key1');\n\nconst results = await transaction.exec();\nconsole.log(results); // ['OK', 1, 'value1']\n```\n\n### Health & Monitoring\n\n```typescript\n// Simple ping\nconst pong = await redis.ping();\n\n// Detailed health check\nconst health = await redis.health();\nconsole.log(health.status);      // 'healthy'\nconsole.log(health.uptime);      // Server uptime\nconsole.log(health.connections); // Connection stats\nconsole.log(health.memory);      // Memory usage\n```\n\n## Middleware & Interceptors\n\n```typescript\n// Request interceptor\nredis.addRequestInterceptor(async (config) => {\n  console.log('Making request:', config.method, config.url);\n  config.headers['X-Request-ID'] = generateRequestId();\n  return config;\n});\n\n// Response interceptor\nredis.addResponseInterceptor(async (response) => {\n  console.log('Response received:', response.status);\n  return response;\n});\n```\n\n## Error Handling\n\n```typescript\nimport { \n  RedisError, \n  ConnectionError, \n  AuthenticationError,\n  TimeoutError,\n  ValidationError \n} from '@scaler/serverless-redis-client';\n\ntry {\n  await redis.get('key');\n} catch (error) {\n  if (error instanceof AuthenticationError) {\n    console.log('Invalid token');\n  } else if (error instanceof ConnectionError) {\n    console.log('Network error');\n  } else if (error instanceof RedisError) {\n    console.log('Redis command error:', error.message);\n  }\n}\n```\n\n## TypeScript Support\n\nThe client is built with TypeScript and provides full type safety:\n\n```typescript\nimport type { \n  ServerlessRedisConfig,\n  RedisValue,\n  RedisKey,\n  HealthResponse \n} from '@scaler/serverless-redis-client';\n\nconst config: ServerlessRedisConfig = {\n  url: 'https://your-proxy.example.com',\n  token: 'your-api-key'\n};\n\nconst key: RedisKey = 'user:123';\nconst value: RedisValue = { name: 'John', age: 30 };\n```\n\n## Edge Runtime Compatibility\n\nWorks in all JavaScript environments:\n\n- ✅ Node.js (16+)\n- ✅ Browsers (modern)\n- ✅ Vercel Edge Functions\n- ✅ Cloudflare Workers\n- ✅ Deno\n- ✅ Bun\n\n## Performance Tips\n\n1. **Use Pipelines**: Batch multiple operations for better performance\n2. **Enable Compression**: Reduces payload size (enabled by default)\n3. **Connection Reuse**: The client automatically reuses HTTP connections\n4. **Appropriate Timeouts**: Set timeouts based on your serverless function limits\n\n```typescript\n// Good: Use pipeline for multiple operations\nconst results = await redis.pipeline()\n  .get('user:1')\n  .get('user:2')\n  .get('user:3')\n  .exec();\n\n// Avoid: Multiple individual requests\nconst user1 = await redis.get('user:1');\nconst user2 = await redis.get('user:2');\nconst user3 = await redis.get('user:3');\n```\n\n## License\n\nMIT License - see [LICENSE](../../../LICENSE) for details.","readmeFilename":"README.md","_rev":"1-3761b806ef9bc39b52f0bbe3d3bee7e4"}