# digiid-ts

A modern TypeScript implementation of the Digi-ID authentication protocol, inspired by the original [digiid-js](https://github.com/digibyte-core/digiid-js).

Provides utilities for generating Digi-ID URIs for QR code display and verifying the callback data signed by a user's Digi-ID-compatible wallet.

## Features

*   Generates Digi-ID URIs according to the specification.
*   Verifies Digi-ID callback signatures and data.
*   Full TypeScript support with comprehensive type definitions.
*   Modern ES modules support.
*   Zero dependencies (except for Node.js built-ins).
*   Comprehensive test coverage.
*   Detailed error messages for debugging.

## Installation

```bash
npm install digiid-ts
```

## Usage

### Generating a Digi-ID URI

```typescript
import { generateDigiIDUri, DigiIDError } from 'digiid-ts';

const options = {
  callbackUrl: 'https://your-site.com/auth/callback',
  // Optional parameters:
  nonce: 'custom-nonce', // Defaults to random UUID
  unsecure: false, // Defaults to false (requires HTTPS)
};

try {
  const digiidUri = generateDigiIDUri(options);
  console.log('Generated Digi-ID URI:', digiidUri);
  // Display this URI as a QR code for the user to scan
} catch (error) {
  if (error instanceof DigiIDError) {
    console.error('Failed to generate Digi-ID URI:', error.message);
  }
}
```

### Verifying the Digi-ID Callback

```typescript
import { verifyDigiIDCallback, DigiIDError, DigiIDCallbackData } from 'digiid-ts';

// In your Express route handler:
app.post('/auth/callback', async (req, res) => {
  const callbackData: DigiIDCallbackData = req.body; // { address, uri, signature }
  
  const verifyOptions = {
    expectedCallbackUrl: 'https://your-site.com/auth/callback',
    expectedNonce: 'your-stored-nonce', // The nonce you generated earlier
  };

  try {
    const verificationResult = await verifyDigiIDCallback(callbackData, verifyOptions);
    
    // Verification successful!
    console.log(`Successfully verified Digi-ID login for address: ${verificationResult.address}`);
    
    // Store the verified address in your session/database
    // Redirect to success page
    res.redirect('/dashboard');
  } catch (error) {
    if (error instanceof DigiIDError) {
      // Specific Digi-ID error (e.g., signature invalid, nonce mismatch, URL mismatch)
      console.error('Digi-ID verification failed:', error.message);
      res.status(400).json({ error: error.message });
    } else {
      // Unexpected error
      console.error('Unexpected error:', error);
      res.status(500).json({ error: 'Internal server error' });
    }
  }
});
```

## API Reference

### Core Functions

*   `generateDigiIDUri(options: DigiIDUriOptions): string`
    *   Generates a Digi-ID URI for QR code display.
*   `verifyDigiIDCallback(callbackData: DigiIDCallbackData, verifyOptions: DigiIDVerifyOptions): Promise<DigiIDVerificationResult>`
    *   Verifies the data received from the wallet callback. Resolves on success, throws `DigiIDError` on failure.

### Type Definitions

*   `DigiIDUriOptions`: Options for `generateDigiIDUri`.
*   `DigiIDCallbackData`: Shape of data expected from the wallet callback.
*   `DigiIDVerifyOptions`: Options for `verifyDigiIDCallback`.
*   `DigiIDVerificationResult`: Shape of the success result from `verifyDigiIDCallback`.
*   `DigiIDError`: Custom error class thrown on failures.

## Development

### Prerequisites

*   Node.js 18+
*   npm 9+

### Setup

1.  Clone the repository
2.  Install dependencies: `npm install`
3.  Run tests: `npm test`

### Project Structure

*   `src/` - Source code
    *   `digiid.ts` - Core implementation
    *   `types.ts` - TypeScript type definitions
*   `test/` - Test files
*   `examples/` - Usage examples
*   `dist/` - Built files (generated)

## License

MIT

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.