{"_id":"@builtwithai/serverless-redis-vercel","name":"@builtwithai/serverless-redis-vercel","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@builtwithai/serverless-redis-vercel","version":"1.0.0","description":"Vercel Edge Functions integration for Serverless Redis Client","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","dev":"rollup -c -w","test":"jest","lint":"eslint src/**/*.ts","type-check":"tsc --noEmit","clean":"rm -rf dist"},"keywords":["vercel","edge-functions","redis","serverless","client"],"repository":{"type":"git","url":"git+https://github.com/built-with-ai/serverless-redis.git","directory":"client-sdks/packages/vercel"},"license":"MIT","author":{"name":"Built with AI Team"},"dependencies":{"@builtwithai/serverless-redis-client":"^1.0.0"},"peerDependencies":{"@vercel/edge":">=0.1.0"},"devDependencies":{"@types/node":"^20.0.0","@vercel/edge":"^1.1.1","rollup":"^3.29.4","rollup-plugin-typescript2":"^0.36.0","typescript":"^5.2.2"},"publishConfig":{"access":"public"},"_id":"@builtwithai/serverless-redis-vercel@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-3T6F7Pd/wdrg9BxDzjjBiFiQp5ZxBSnjeyhZGK9x9SAxch0Q8ODUCata6SXuyM1P4Nm6vMkeP3xsPOaA1MyHHA==","shasum":"0197ec1cd342474888648bcdec44e54ed272683d","tarball":"https://registry.npmjs.org/@builtwithai/serverless-redis-vercel/-/serverless-redis-vercel-1.0.0.tgz","fileCount":2,"unpackedSize":9693,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICCaSK2fuTxo7oTPBgbDzae+Yu8HUwnIW5jwuk421vkMAiEAs/LZiKjIyTWwHa4r0iKNVPm5/00bTBJtJyHYSpnFDzU="}]},"_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-vercel_1.0.0_1754148981481_0.9005311197169434"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-02T15:36:21.369Z","1.0.0":"2025-08-02T15:36:21.680Z","modified":"2025-08-02T15:36:22.001Z"},"maintainers":[{"name":"scalerllc","email":"chris.naegelin@scaler.io"}],"description":"Vercel Edge Functions integration for Serverless Redis Client","homepage":"https://github.com/built-with-ai/serverless-redis#readme","keywords":["vercel","edge-functions","redis","serverless","client"],"repository":{"type":"git","url":"git+https://github.com/built-with-ai/serverless-redis.git","directory":"client-sdks/packages/vercel"},"author":{"name":"Built with AI Team"},"bugs":{"url":"https://github.com/built-with-ai/serverless-redis/issues"},"license":"MIT","readme":"# @scaler/serverless-redis-vercel\n\nVercel Edge Functions integration for the Serverless Redis Client, optimized for Vercel's edge runtime and deployment model.\n\n## Installation\n\n```bash\nnpm install @scaler/serverless-redis-vercel\n```\n\n## Quick Start\n\n### Edge Functions\n\n```typescript\n// api/redis-example.ts\nimport { withRedis } from '@scaler/serverless-redis-vercel';\n\nexport default withRedis(async (redis, request) => {\n  const url = new URL(request.url);\n  const key = url.searchParams.get('key') || 'default';\n  \n  if (request.method === 'GET') {\n    const value = await redis.get(key);\n    return { key, value };\n  }\n  \n  if (request.method === 'POST') {\n    const { value } = await request.json();\n    await redis.set(key, value);\n    return { success: true, key, value };\n  }\n  \n  return new Response('Method not allowed', { status: 405 });\n});\n\nexport const config = {\n  runtime: 'edge',\n};\n```\n\n### API Routes (Node.js)\n\n```typescript\n// api/users/[id].ts\nimport { getServerlessRedis } from '@scaler/serverless-redis-vercel';\nimport type { NextApiRequest, NextApiResponse } from 'next';\n\nexport default async function handler(req: NextApiRequest, res: NextApiResponse) {\n  const redis = getServerlessRedis();\n  const { id } = req.query;\n  \n  if (req.method === 'GET') {\n    const user = await redis.hgetall(`user:${id}`);\n    res.json(user);\n  } else if (req.method === 'PUT') {\n    await redis.hset(`user:${id}`, ...Object.entries(req.body).flat());\n    res.json({ success: true });\n  }\n}\n```\n\n## Features\n\n- 🚀 **Edge Runtime Optimized** - Works seamlessly in Vercel Edge Functions\n- ⚡ **Auto-Configuration** - Detects runtime and applies optimal settings\n- 🌍 **Environment Detection** - Automatically configures for production/preview/development\n- 🔧 **TypeScript First** - Full type safety for Vercel environments\n- 📦 **Zero Config** - Works with standard Vercel environment variables\n- 🛡️ **CORS Helpers** - Built-in CORS handling utilities\n\n## Configuration\n\n### Environment Variables\n\nSet these in your Vercel project settings or `.env.local`:\n\n```bash\nREDIS_PROXY_URL=https://your-redis-proxy.example.com\nREDIS_TOKEN=your-api-key-or-jwt\nREDIS_TIMEOUT=3000  # Optional: timeout in ms (default: 3000 for edge, 5000 for nodejs)\nREDIS_RETRIES=1     # Optional: retry attempts (default: 1 for edge, 3 for nodejs)\nREDIS_DB=0          # Optional: Redis database number\n```\n\n### Programmatic Configuration\n\n```typescript\nimport { createServerlessRedis, VercelRedisUtils } from '@scaler/serverless-redis-vercel';\n\nconst redis = createServerlessRedis({\n  url: 'https://your-proxy.example.com',\n  token: 'your-api-key',\n  timeout: 3000,\n  retries: 1,\n  compression: true,\n  headers: {\n    'X-Custom-Header': 'value'\n  }\n});\n\n// Or use optimized configuration for current environment\nconst optimizedRedis = createServerlessRedis(\n  VercelRedisUtils.getOptimizedConfig({\n    url: process.env.REDIS_PROXY_URL,\n    token: process.env.REDIS_TOKEN,\n  })\n);\n```\n\n## API Reference\n\n### Functions\n\n#### `createServerlessRedis(config?)`\n\nCreates a new Redis client instance optimized for Vercel.\n\n```typescript\nconst redis = createServerlessRedis({\n  url: 'https://your-proxy.example.com',\n  token: 'your-api-key',\n  timeout: 3000,    // Shorter timeout for edge functions\n  retries: 1,       // Fewer retries for edge functions\n  compression: true // Enable compression\n});\n```\n\n#### `getServerlessRedis(config?)`\n\nGets or creates a global Redis client instance (recommended for performance).\n\n```typescript\nconst redis = getServerlessRedis();\n```\n\n#### `withRedis(handler)`\n\nWraps an Edge Function handler with Redis client injection and error handling.\n\n```typescript\nexport default withRedis(async (redis, request) => {\n  const data = await redis.get('key');\n  return { data };\n});\n```\n\n#### `createRedisMiddleware(config?)`\n\nCreates middleware that adds Redis client to request objects.\n\n```typescript\nconst { redis, middleware } = createRedisMiddleware();\n```\n\n### Utilities\n\n#### `VercelRedisUtils`\n\nUtility functions for Vercel-specific functionality:\n\n```typescript\nimport { VercelRedisUtils } from '@scaler/serverless-redis-vercel';\n\n// Runtime detection\nVercelRedisUtils.isEdgeRuntime();    // true if running in Edge Runtime\nVercelRedisUtils.isNodeRuntime();    // true if running in Node.js runtime\n\n// Environment detection\nVercelRedisUtils.isProduction();     // true if VERCEL_ENV=production\nVercelRedisUtils.isPreview();        // true if VERCEL_ENV=preview\nVercelRedisUtils.isDevelopment();    // true if VERCEL_ENV=development\n\n// Get current Vercel URL\nconst url = VercelRedisUtils.getVercelUrl();\n\n// Get optimized config for current environment\nconst config = VercelRedisUtils.getOptimizedConfig({\n  url: process.env.REDIS_PROXY_URL,\n  token: process.env.REDIS_TOKEN,\n});\n\n// Create config from environment variables\nconst envConfig = VercelRedisUtils.createConfigFromEnvironment();\n```\n\n#### CORS Helpers\n\n```typescript\nimport { corsResponse, handleCors } from '@scaler/serverless-redis-vercel';\n\nexport default async function handler(request: Request) {\n  // Handle CORS preflight\n  const corsResult = handleCors(request);\n  if (corsResult) return corsResult;\n  \n  // Your logic here\n  const data = { message: 'Hello' };\n  \n  // Return CORS-enabled response\n  return corsResponse(data);\n}\n```\n\n## Examples\n\n### User Session Management\n\n```typescript\n// api/session.ts\nimport { withRedis } from '@scaler/serverless-redis-vercel';\n\nexport default withRedis(async (redis, request) => {\n  const { searchParams } = new URL(request.url);\n  const sessionId = searchParams.get('sessionId');\n  \n  if (!sessionId) {\n    return new Response('Session ID required', { status: 400 });\n  }\n  \n  if (request.method === 'GET') {\n    const sessionData = await redis.hgetall(`session:${sessionId}`);\n    return { sessionData };\n  }\n  \n  if (request.method === 'POST') {\n    const data = await request.json();\n    await redis.hset(`session:${sessionId}`, ...Object.entries(data).flat());\n    await redis.expire(`session:${sessionId}`, 3600); // 1 hour TTL\n    return { success: true };\n  }\n  \n  if (request.method === 'DELETE') {\n    await redis.del(`session:${sessionId}`);\n    return { success: true };\n  }\n});\n\nexport const config = { runtime: 'edge' };\n```\n\n### Rate Limiting\n\n```typescript\n// api/rate-limit.ts\nimport { withRedis } from '@scaler/serverless-redis-vercel';\n\nexport default withRedis(async (redis, request) => {\n  const clientIP = request.headers.get('x-forwarded-for') || 'unknown';\n  const key = `rate_limit:${clientIP}`;\n  \n  const current = await redis.incr(key);\n  \n  if (current === 1) {\n    await redis.expire(key, 60); // 1 minute window\n  }\n  \n  if (current > 10) { // 10 requests per minute\n    return new Response('Rate limit exceeded', { \n      status: 429,\n      headers: {\n        'Retry-After': '60'\n      }\n    });\n  }\n  \n  return {\n    message: 'API call successful',\n    remaining: 10 - current,\n    resetIn: await redis.ttl(key)\n  };\n});\n\nexport const config = { runtime: 'edge' };\n```\n\n### Cached API Proxy\n\n```typescript\n// api/proxy/[...path].ts\nimport { withRedis } from '@scaler/serverless-redis-vercel';\n\nexport default withRedis(async (redis, request) => {\n  const url = new URL(request.url);\n  const path = url.pathname.replace('/api/proxy/', '');\n  const cacheKey = `proxy:${path}:${url.search}`;\n  \n  // Try cache first\n  const cached = await redis.get(cacheKey);\n  if (cached) {\n    return JSON.parse(cached);\n  }\n  \n  // Fetch from upstream API\n  const response = await fetch(`https://api.example.com/${path}${url.search}`);\n  const data = await response.json();\n  \n  // Cache for 5 minutes\n  await redis.setex(cacheKey, 300, JSON.stringify(data));\n  \n  return data;\n});\n\nexport const config = { runtime: 'edge' };\n```\n\n## Runtime Optimization\n\nThe package automatically optimizes settings based on the Vercel runtime:\n\n### Edge Runtime\n- Shorter timeouts (3000ms default)\n- Fewer retries (1 default)\n- Compression enabled\n- Minimal memory footprint\n\n### Node.js Runtime\n- Standard timeouts (5000ms default)\n- Standard retries (3 default)\n- Full feature set available\n\n## Deployment\n\n1. **Install the package**:\n   ```bash\n   npm install @scaler/serverless-redis-vercel\n   ```\n\n2. **Set environment variables** in Vercel dashboard:\n   - `REDIS_PROXY_URL`\n   - `REDIS_TOKEN`\n\n3. **Deploy your functions**:\n   ```bash\n   vercel deploy\n   ```\n\nThe package handles the rest automatically!\n\n## License\n\nMIT License - see [LICENSE](../../../LICENSE) for details.","readmeFilename":"README.md","_rev":"1-9cd4acdea6776f1a70acf2e85adf08a8"}