UNPKG

@awell-health/navi-js

Version:

Navi.js loading utility - loads the Navi SDK from CDN

363 lines (269 loc) 8.85 kB
# @awell-health/navi-js > Navi.js loading utility - loads the Navi SDK from CDN (like @stripe/stripe-js) ## Architecture Overview This package follows the **Stripe.js model** for security, performance, and compliance: - ✅ **CDN-only distribution** - Must load from `https://cdn.awellhealth.com` - ✅ **Version pinning** - Each npm package version pins to specific CDN version - ✅ **Security compliance** - Cannot bundle or self-host (like Stripe for PCI compliance) - ✅ **Global caching** - CDN provides optimal performance worldwide ## Installation ```bash npm install @awell-health/navi-js ``` ## Basic Usage ```typescript import { loadNavi } from "@awell-health/navi-js"; // Load Navi SDK once at app initialization const navi = await loadNavi("pk_test_your_key_here"); const instance = navi.renderActivities("#container", { pathwayId: "pathway_patient_intake", organizationId: "org_customer_123", userId: "user_patient_456", }); ``` ## React Integration Pattern ```typescript // App.tsx - Load once at app level import { loadNavi } from "@awell-health/navi-js"; import { NaviProvider, NaviEmbed } from "@awell-health/navi-js-react"; function App() { const [naviLoaded, setNaviLoaded] = useState(false); useEffect(() => { // Load Navi SDK once when app starts loadNavi("pk_test_your_key_here", { origin: "https://cdn.awellhealth.com", embedOrigin: "http://localhost:3000", // For testing }).then(() => setNaviLoaded(true)); }, []); if (!naviLoaded) return <div>Loading...</div>; return ( <NaviProvider publishableKey="pk_test_your_key_here"> <NaviEmbed careflowDefinitionId="flow_123" /> </NaviProvider> ); } ``` ## Configuration Options You can control where the Navi SDK loads from and where embeds point to: ### Default (Production) ```typescript // Uses CDN by default (recommended for production) const navi = await loadNavi("pk_live_your_key_here"); // Script from: https://cdn.awellhealth.com // Embeds to: https://navi-portal.awellhealth.com ``` ### Force Local Development ```typescript // Force local development mode const navi = await loadNavi("pk_test_your_key_here", { local: true }); // Script from: http://localhost:3000 // Embeds to: http://localhost:3000 ``` ### Mixed Configuration ```typescript // Pull script from CDN but embed to localhost (for testing) const navi = await loadNavi("pk_test_your_key_here", { origin: "https://cdn.awellhealth.com", // Script from CDN embedOrigin: "http://localhost:3000", // Embed to local }); ``` ### Custom URLs ```typescript // Completely custom configuration const navi = await loadNavi("pk_test_your_key_here", { origin: "https://custom-cdn.example.com", embedOrigin: "https://custom-portal.example.com", }); ``` ## Production Architecture ### **🌐 CDN Distribution (`https://cdn.awellhealth.com`)** ``` https://cdn.awellhealth.com/ ├── v1/navi-loader.js ← Latest v1.x.x ├── v1.0.0/navi-loader.js ← Specific version ├── v1.1.0/navi-loader.js ← Specific version └── v2/navi-loader.js ← Future v2.x.x ``` ### **🔒 Embed Portal (`https://navi-portal.awellhealth.com`)** ``` https://navi-portal.awellhealth.com/ └── [pathway_id] ← Iframe content only ``` ### **📦 NPM Wrapper (`@awell-health/navi-js`)** ``` npm install @awell-health/navi-js └── Loads: https://cdn.awellhealth.com/v1/navi-loader.js ``` ## Deployment Pipeline ### **1. navi-loader (CDN)** ```bash # Build the IIFE bundle cd packages/navi-loader pnpm build # Output: dist/navi-loader.js # Deploy to CDN with versioning aws s3 cp dist/navi-loader.js s3://cdn.awellhealth.com/v1.0.0/navi-loader.js aws s3 cp dist/navi-loader.js s3://cdn.awellhealth.com/v1/navi-loader.js # latest ``` ### **2. navi-js (NPM)** ```bash # Build the wrapper package cd packages/navi-js pnpm build # Output: dist/index.js, dist/index.mjs, dist/index.d.ts # Publish to NPM npm publish ``` ### **3. navi-portal (Embed)** ```bash # Deploy embed-only portal cd apps/navi-portal pnpm build # Deploy to: https://navi-portal.awellhealth.com ``` ## Version Mapping | **@awell-health/navi-js** | **CDN Version** | **Release Date** | | ------------------------- | --------------- | ---------------- | | v1.0.x | v1.0.0 | 2024-01-15 | | v1.1.x | v1.1.0 | 2024-02-01 | | v1.2.x | v1.2.0 | 2024-03-01 | ## Security Model ### **Like Stripe's PCI Compliance** ```typescript // ❌ FORBIDDEN - Cannot bundle or self-host import naviBundle from "./navi-loader.js"; // Not allowed! // ✅ REQUIRED - Must load from official CDN import { loadNavi } from "@awell-health/navi-js"; const navi = await loadNavi("pk_test_..."); // Loads from CDN ``` ### **Content Security Policy** ```html <meta http-equiv="Content-Security-Policy" content="script-src 'self' https://cdn.awellhealth.com;" /> ``` ## Development vs Production ### **Development (localhost:3000)** ```typescript // Automatically detects development environment const navi = await loadNavi("pk_test_demo123"); // Loads: http://localhost:3000/navi-loader.js // Iframes: http://localhost:3000/embed/pathway_123 ``` ### **Production (CDN)** ```typescript // Production automatically uses CDN const navi = await loadNavi("pk_live_prod456"); // Loads: https://cdn.awellhealth.com/v1/navi-loader.js // Iframes: https://navi-portal.awellhealth.com/pathway_123 ``` ## Customer Integration Examples ### **E-commerce Checkout** ```typescript import { loadNavi } from "@awell-health/navi-js"; // During checkout process const navi = await loadNavi("pk_live_xyz"); const healthScreen = navi.renderActivities("#health-screening", { pathwayId: "health_screening_checkout", organizationId: "org_ecommerce_store", userId: `customer_${customerId}`, size: "compact", }); healthScreen.on("navi.pathway.completed", () => { // Continue with checkout proceedToPayment(); }); ``` ### **Patient Portal** ```typescript import { loadNavi } from "@awell-health/navi-js"; // In patient dashboard const navi = await loadNavi("pk_live_abc"); const dailyCheckin = navi.renderActivities("#daily-checkin", { pathwayId: "daily_wellness_checkin", organizationId: "org_hospital_123", userId: `patient_${patientId}`, size: "standard", }); ``` ### **React Integration** ```tsx import { useEffect, useState } from "react"; import { loadNavi } from "@awell-health/navi-js"; function NaviWidget({ pathwayId, userId }) { const [instance, setInstance] = useState(null); useEffect(() => { const init = async () => { const navi = await loadNavi("pk_test_demo"); const widget = navi.renderActivities("#navi-container", { pathwayId, organizationId: "org_react_app", userId, }); setInstance(widget); }; init(); return () => instance?.destroy(); }, [pathwayId, userId]); return <div id="navi-container" />; } ``` ## CDN Configuration ### **Google Cloud CDN** ```yaml # Deploy to Google Cloud Storage + CDN resource: google-cloud-storage bucket: cdn-navi-com cdn: global cache: 1 year ``` ### **CloudFlare CDN** ```yaml # Alternative: CloudFlare for global distribution domain: cdn.awellhealth.com cache: aggressive compression: gzip, brotli ``` ### **AWS CloudFront** ```yaml # Alternative: AWS CloudFront origin: s3://cdn-navi-com cache-policy: optimized-caching gzip: true ``` ## Monitoring & Analytics ### **CDN Metrics** - Request count by version - Global latency by region - Cache hit rates - Error rates ### **Usage Analytics** - Load success/failure rates - Time to interactive - Customer adoption by version ## Migration Guide ### **From Current Architecture** ```typescript // OLD - Direct portal serving <script src="http://localhost:3000/navi-loader.js"></script> // NEW - CDN + NPM wrapper npm install @awell-health/navi-js import { loadNavi } from '@awell-health/navi-js'; ``` ### **Versioning Strategy** 1. **Major versions** - Breaking API changes 2. **Minor versions** - New features, backwards compatible 3. **Patch versions** - Bug fixes only ## Support - 📖 [Documentation](https://docs.navi.awell.com) - 🚀 [Migration Guide](https://docs.navi.awell.com/migration) - 💬 [Support](https://support.awell.com) --- ## Implementation Status - [ ] **CDN Infrastructure** - Set up Google Cloud CDN or CloudFlare - [ ] **Deployment Pipeline** - Automate version deployment to CDN - [ ] **Version Management** - Pin npm package versions to CDN versions - [ ] **Environment Detection** - Auto-switch between localhost and CDN - [ ] **Portal Separation** - Split embed routes from main portal - [ ] **DNS Configuration** - Set up `cdn.awellhealth.com` and `navi-portal.awellhealth.com`