{"_id":"@arrteann/rahochah-sdk","name":"@arrteann/rahochah-sdk","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"@arrteann/rahochah-sdk","version":"2.0.0","description":"TypeScript SDK for RahoChah Backend API","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","dev":"tsc --watch","test":"jest","test:watch":"jest --watch","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","clean":"rimraf dist","prepublishOnly":"npm run clean && npm run build"},"keywords":["rahochah","market-research","analysis","api","sdk","typescript","websocket"],"author":{"name":"RahoChah Team"},"license":"MIT","private":false,"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/rahochah/rahochah-backend.git"},"dependencies":{"axios":"^1.6.2","ws":"^8.14.2"},"devDependencies":{"@types/jest":"^29.5.8","@types/node":"^20.10.4","@types/ws":"^8.5.10","@typescript-eslint/eslint-plugin":"^6.13.1","@typescript-eslint/parser":"^6.13.1","eslint":"^8.54.0","jest":"^29.7.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","typescript":"^5.3.3"},"peerDependencies":{"typescript":">=4.5.0"},"engines":{"node":">=16.0.0"},"_id":"@arrteann/rahochah-sdk@2.0.0","gitHead":"8acfc368727adb6d0451f75fdc5ceb8f7ed75b3d","bugs":{"url":"https://github.com/rahochah/rahochah-backend/issues"},"homepage":"https://github.com/rahochah/rahochah-backend#readme","_nodeVersion":"22.13.1","_npmVersion":"11.0.0","dist":{"integrity":"sha512-SvuzQQ84lmO8TRHDTs0A5W5kNgX5ltzu79TPQDZsZ254TOFr26m1oChySi2YGKopw9j/5z4+T6f01Ax1yhh+Cw==","shasum":"73bb87b410a4c9bdbd6cc0c1c10adbf03d708072","tarball":"https://registry.npmjs.org/@arrteann/rahochah-sdk/-/rahochah-sdk-2.0.0.tgz","fileCount":34,"unpackedSize":130775,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD3J034KWfy6vMpHHNw6TMsdVzJzlVXRUPv0Hx37ZYeSgIgR4Vbx0Wh4Ip7zSGAsO8mpwQDqGzqGnJj749x/RuL0Ag="}]},"_npmUser":{"name":"arrteann","email":"arrteann@gmail.com"},"directories":{},"maintainers":[{"name":"arrteann","email":"arrteann@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rahochah-sdk_2.0.0_1758972238387_0.9155905692126356"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-27T11:23:58.313Z","2.0.0":"2025-09-27T11:23:58.615Z","modified":"2025-09-27T11:23:58.890Z"},"maintainers":[{"name":"arrteann","email":"arrteann@gmail.com"}],"description":"TypeScript SDK for RahoChah Backend API","homepage":"https://github.com/rahochah/rahochah-backend#readme","keywords":["rahochah","market-research","analysis","api","sdk","typescript","websocket"],"repository":{"type":"git","url":"git+https://github.com/rahochah/rahochah-backend.git"},"author":{"name":"RahoChah Team"},"bugs":{"url":"https://github.com/rahochah/rahochah-backend/issues"},"license":"MIT","readme":"# RahoChah TypeScript SDK\n\nOfficial TypeScript/JavaScript SDK for the RahoChah Backend API.\n\n## Installation\n\n```bash\nnpm install @rahochah/sdk\n# or\nyarn add @rahochah/sdk\n```\n\n## Quick Start\n```typescript\nimport { RahoChahSDK } from '@rahochah/sdk';\n\n// Initialize SDK\nconst sdk = RahoChahSDK.createDevelopment();\n\n// Login\nawait sdk.login('user@example.com', 'password');\n\n// Start analysis\nconst job = await sdk.analysis.startMarketAnalysis(projectId);\n\n// Listen for progress\nsdk.onAnalysisProgress((data) => {\n  console.log(`Progress: ${data.data.progress}%`);\n});\n\n// Get results when complete\nsdk.onAnalysisCompleted(async (data) => {\n  const results = await sdk.analysis.getAnalysisResults(\n    data.data.projectId,\n    data.data.moduleType\n  );\n  console.log('Analysis results:', results);\n});\n```\n\n## Configuration\n\n### Development\n```typescript\nconst sdk = RahoChahSDK.createDevelopment();\n```\n\n### Production\n```typescript\nconst sdk = RahoChahSDK.createProduction('your-api-key');\n```\n\n### Custom Configuration\n```typescript\nconst sdk = new RahoChahSDK({\n  baseURL: 'https://api.rahochah.com',\n  websocketURL: 'wss://api.rahochah.com/ws',\n  timeout: 30000,\n});\n```\n\n## Authentication\n\n### Login\n```typescript\ntry {\n  await sdk.login('user@example.com', 'password');\n  console.log('Logged in successfully');\n} catch (error) {\n  console.error('Login failed:', error.message);\n}\n```\n\n### Register\n```typescript\ntry {\n  await sdk.register('John Doe', 'john@example.com', 'password');\n  console.log('Registration successful');\n} catch (error) {\n  console.error('Registration failed:', error.message);\n}\n```\n\n### Token Management\n```typescript\n// Set token manually\nsdk.setToken('your-jwt-token');\n\n// Get current token\nconst token = sdk.getToken();\n\n// Check authentication status\nif (sdk.isAuthenticated()) {\n  console.log('User is authenticated');\n}\n\n// Logout\nsdk.logout();\n```\n\n## Analysis Services\n\n### Start Analysis\n```typescript\n// Start idea validation\nconst job = await sdk.analysis.startIdeaValidation(projectId, {\n  depth: 'advanced',\n  dateRange: '90d'\n});\n\n// Start market analysis\nconst job = await sdk.analysis.startMarketAnalysis(projectId, {\n  depth: 'advanced',\n  sources: ['crunchbase', 'industry_reports'],\n  dateRange: '90d'\n});\n\n// Start competitor analysis\nconst job = await sdk.analysis.startCompetitorAnalysis(projectId);\n\n// Start persona generation\nconst job = await sdk.analysis.startPersonaGeneration(projectId);\n\n// Start trend analysis\nconst job = await sdk.analysis.startTrendAnalysis(projectId);\n```\n\n### Monitor Progress\n```typescript\n// Get status\nconst status = await sdk.analysis.getAnalysisStatus(projectId, 'market_analysis');\nconsole.log(`Status: ${status.status}, Progress: ${status.progress?.percentage}%`);\n\n// Wait for completion (polling)\ntry {\n  const results = await sdk.analysis.waitForCompletion(projectId, 'market_analysis', {\n    pollInterval: 5000,\n    timeout: 600000,\n    onProgress: (status) => {\n      console.log(`Progress: ${status.progress?.percentage}%`);\n    }\n  });\n  console.log('Analysis completed:', results);\n} catch (error) {\n  console.error('Analysis failed:', error.message);\n}\n```\n\n### Get Results\n```typescript\n// Get specific analysis results\nconst results = await sdk.analysis.getAnalysisResults(projectId, 'market_analysis');\n\n// Get all analyses for a project\nconst allAnalyses = await sdk.analysis.getAllAnalyses(projectId);\n```\n\n## Real-time Updates (WebSocket)\n\n### Connection Management\n```typescript\n// Connect WebSocket (automatic with authentication)\nawait sdk.connectWebSocket();\n\n// Check connection status\nif (sdk.isWebSocketConnected()) {\n  console.log('WebSocket connected');\n}\n\n// Disconnect\nsdk.disconnectWebSocket();\n```\n\n### Project Rooms\n```typescript\n// Join project room for real-time updates\nsdk.joinProject(projectId);\n\n// Leave project room\nsdk.leaveProject(projectId);\n```\n\n### Event Listeners\n```typescript\n// Analysis progress updates\nconst unsubscribe = sdk.onAnalysisProgress((message) => {\n  const { projectId, moduleType, progress, message: progressMsg } = message.data;\n  console.log(`${moduleType}: ${progress}% - ${progressMsg}`);\n});\n\n// Analysis completion\nsdk.onAnalysisCompleted((message) => {\n  const { projectId, moduleType, result } = message.data;\n  console.log(`${moduleType} completed for project ${projectId}`);\n});\n\n// Analysis failures\nsdk.onAnalysisFailed((message) => {\n  const { projectId, moduleType, error } = message.data;\n  console.error(`${moduleType} failed: ${error}`);\n});\n\n// Connection events\nsdk.onWebSocketConnected(() => {\n  console.log('WebSocket connected');\n});\n\nsdk.onWebSocketDisconnected(() => {\n  console.log('WebSocket disconnected');\n});\n\nsdk.onWebSocketError((error) => {\n  console.error('WebSocket error:', error);\n});\n\n// Cleanup\nunsubscribe(); // Remove specific listener\n```\n\n## Error Handling\n\n```typescript\nimport { APIError } from '@rahochah/sdk';\n\ntry {\n  await sdk.analysis.startAnalysis(projectId, 'market_analysis');\n} catch (error) {\n  if (error instanceof APIError) {\n    console.error(`API Error [${error.code}]:`, error.message);\n    console.error('Status:', error.status);\n    console.error('Response:', error.response);\n  } else {\n    console.error('Unexpected error:', error.message);\n  }\n}\n```\n\n## Type Safety\n\nThe SDK is fully typed for TypeScript projects:\n\n```typescript\nimport {\n  AnalysisType,\n  AnalysisParameters,\n  AnalysisResults,\n  ProjectAnalyses,\n  WebSocketMessage\n} from '@rahochah/sdk';\n\n// Type-safe analysis parameters\nconst parameters: AnalysisParameters = {\n  depth: 'advanced',\n  sources: ['crunchbase', 'producthunt'],\n  dateRange: '90d'\n};\n\n// Type-safe analysis type\nconst analysisType: AnalysisType = 'market_analysis';\n\n// Type-safe WebSocket event handling\nsdk.onAnalysisProgress((message: WebSocketMessage) => {\n  // message.data is properly typed\n  console.log(message.data.progress);\n});\n```\n\n## Advanced Usage\n\n### Custom Event Handling\n```typescript\n// Listen to any WebSocket event\nsdk.websocketClient.on('custom_event', (data) => {\n  console.log('Custom event received:', data);\n});\n\n// Send custom messages\nsdk.websocketClient.send('custom_message', { foo: 'bar' });\n```\n\n### Direct API Access\n```typescript\n// Access the underlying API client\nconst response = await sdk.apiClient.get('/custom/endpoint');\n\n// Custom requests with full control\nconst customData = await sdk.apiClient.post('/custom/endpoint', {\n  customData: 'value'\n});\n```\n\n### Account Type Checking\n```typescript\n// Check feature access\nconst hasSearchAccess = sdk.auth.hasFeatureAccess('pro', 'search');\n\n// Check analysis type availability\nconst canRunCompetitorAnalysis = sdk.auth.canRunAnalysis('pro', 'competitor_analysis');\n\n// Get upgrade requirements\nconst upgradeRequired = sdk.auth.getUpgradeRequirement('competitor_analysis');\n```\n\n## React Integration\n\n```tsx\nimport React, { useEffect, useState } from 'react';\nimport { RahoChahSDK } from '@rahochah/sdk';\n\nconst sdk = RahoChahSDK.createDevelopment();\n\nfunction AnalysisComponent({ projectId }: { projectId: number }) {\n  const [progress, setProgress] = useState<number>(0);\n  const [status, setStatus] = useState<string>('idle');\n\n  useEffect(() => {\n    // Set up WebSocket listeners\n    const unsubscribeProgress = sdk.onAnalysisProgress((message) => {\n      if (message.data.projectId === projectId) {\n        setProgress(message.data.progress);\n      }\n    });\n\n    const unsubscribeCompleted = sdk.onAnalysisCompleted((message) => {\n      if (message.data.projectId === projectId) {\n        setStatus('completed');\n        setProgress(100);\n      }\n    });\n\n    return () => {\n      unsubscribeProgress();\n      unsubscribeCompleted();\n    };\n  }, [projectId]);\n\n  const startAnalysis = async () => {\n    try {\n      setStatus('starting');\n      await sdk.analysis.startMarketAnalysis(projectId);\n      setStatus('running');\n    } catch (error) {\n      setStatus('error');\n      console.error('Failed to start analysis:', error);\n    }\n  };\n\n  return (\n    <div>\n      <button onClick={startAnalysis} disabled={status === 'running'}>\n        Start Analysis\n      </button>\n      <div>Status: {status}</div>\n      <div>Progress: {progress}%</div>\n    </div>\n  );\n}\n```\n\n## Browser Support\n\nThe SDK works in both Node.js and browser environments. For browsers, you may need to polyfill WebSocket if targeting older browsers.\n\n## Contributing\n\nSee the main repository for contribution guidelines.\n\n## License\n\nMIT License - see LICENSE file for details.","readmeFilename":"README.md","_rev":"1-416b808cd9049762bc3aebc5fac02643"}