# @babelfhir-ts/smart-auth

[![npm](https://img.shields.io/npm/v/@babelfhir-ts/smart-auth.svg)](https://www.npmjs.com/package/@babelfhir-ts/smart-auth)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)

SMART on FHIR v2 authorization with PKCE — discovery, token management, authenticated fetch. Zero dependencies.

## Installation

```bash
npm install @babelfhir-ts/smart-auth
```

No runtime dependencies.

## Usage

### Standalone Launch

```ts
import { SmartAuth } from '@babelfhir-ts/smart-auth';

const auth = new SmartAuth({
  clientId: 'my-app',
  redirectUri: 'http://localhost:3000/callback',
  scope: 'openid fhirUser patient/*.read',
  fhirBaseUrl: 'https://launch.smarthealthit.org/v/r4/fhir',
});

// Start authorization (redirects to auth server)
await auth.authorize();

// Handle callback
if (auth.isCallback()) {
  await auth.handleCallback();
}

// Get authenticated fetch function
const authenticatedFetch = auth.createAuthenticatedFetch();
const response = await authenticatedFetch('/Patient/example');
```

### Endpoint Discovery

```ts
import { discoverEndpoints } from '@babelfhir-ts/smart-auth';

const endpoints = await discoverEndpoints('https://launch.smarthealthit.org/v/r4/fhir');
// { authorizationEndpoint, tokenEndpoint, ... }
```

### Token Management

```ts
// Check authentication status
auth.isAuthenticated(); // boolean

// Get current token
const token = auth.getToken(); // SmartToken | null

// Refresh expired token
await auth.refreshAccessToken();

// Get valid token (auto-refreshes if expired)
const validToken = await auth.getValidToken();

// Logout
auth.logout();
```

### EHR Launch

```ts
const auth = new SmartAuth({ clientId: 'my-app', redirectUri: '...' });

const mode = auth.detectLaunchMode(); // 'standalone' | 'ehr'
if (mode === 'ehr') {
  await auth.startEhrLaunch();
} else {
  await auth.startStandaloneLaunch('https://my-fhir-server.com/fhir');
}
```

## API

| Export | Description |
|---|---|
| `SmartAuth` | Full SMART v2 lifecycle with PKCE |
| `discoverEndpoints` | Auto-discover SMART endpoints from FHIR server |
| `SmartConfig` | Configuration type |
| `SmartToken` | Token response type |
| `SmartConfiguration` | Well-known configuration type |
| `LaunchMode` | `'standalone' \| 'ehr'` |

## Part of BabelFHIR-TS

This package provides SMART on FHIR authentication for [@babelfhir-ts/client-r4](https://www.npmjs.com/package/@babelfhir-ts/client-r4) and [@babelfhir-ts/client-r4b](https://www.npmjs.com/package/@babelfhir-ts/client-r4b). It can also be used standalone for any SMART on FHIR integration.

## License

MIT
