extensions and nsec login working

This commit is contained in:
Your Name
2025-09-13 09:06:32 -04:00
parent 79dcd933df
commit 025d66c096
8 changed files with 11967 additions and 0 deletions

260
lite/README.md Normal file
View File

@@ -0,0 +1,260 @@
# NOSTR_LOGIN_LITE
A minimal, dependency-light replacement for the current auth/UI stack that preserves all login methods and window.nostr surface.
## Features
- ✅ Single file distributable (`nostr-login-lite.bundle.js`)
- ✅ All major login methods: Extension, Local key, Read-only
- ✅ Compatible window.nostr facade
- ✅ NIP-04 and NIP-44 encryption (local)
- ✅ Minimal vanilla JavaScript modal
- ✅ No bulky frameworks (no Stencil/Tailwind)
- ✅ Just ~50KB gzipped (minus nostr-tools)
## Installation
```html
<!-- 1. Load nostr-tools (local bundle) -->
<script src="./lite/nostr.bundle.js"></script>
<!-- 2. Load NOSTR_LOGIN_LITE -->
<script src="./lite/nostr-login-lite.bundle.js"></script>
```
## Quick Start
```javascript
// Initialize with default options
await window.NOSTR_LOGIN_LITE.init({
theme: 'light',
relays: ['wss://relay.damus.io'],
methods: {
extension: true,
local: true,
readonly: true
}
});
// Launch login modal
window.NOSTR_LOGIN_LITE.launch();
```
## API Reference
### Initialization
```javascript
// Initialize the library
await window.NOSTR_LOGIN_LITE.init(options)
// Options
{
theme: 'light' | 'dark',
darkMode: boolean,
relays: string[], // Default relays for NIP-46
methods: {
connect: boolean, // NIP-46 providers (coming)
extension: boolean, // Browser extensions
local: boolean, // Local key generation
readonly: boolean, // Read-only mode
otp: boolean // OTP/DM (coming)
}
}
```
### User Interface
```javascript
// Launch authentication modal
window.NOSTR_LOGIN_LITE.launch(startScreen);
// Available screens
'login' // Auth selection
'signup' // Account creation
'switch' // Account switching
// Logout current user
window.NOSTR_LOGIN_LITE.logout();
// Set theme
window.NOSTR_LOGIN_LITE.setDarkMode(dark: boolean);
```
### Programmatic Auth
```javascript
// Set authentication manually
window.NOSTR_LOGIN_LITE.setAuth({
type: 'login' | 'signup' | 'logout',
method: 'extension' | 'local' | 'readonly' | 'connect' | 'otp',
pubkey: string, // Public key
secret: string // Private key (optional)
});
// Cancel ongoing auth flow
window.NOSTR_LOGIN_LITE.cancelNeedAuth();
```
### window.nostr Compatibility
All standard window.nostr methods work transparently:
```javascript
// Get current user's public key
const pubkey = await window.nostr.getPublicKey();
// Sign an event
const signed = await window.nostr.signEvent({
kind: 1,
content: 'Hello Nostr!',
tags: [],
created_at: Date.now()
});
// NIP-04 encrypt/decrypt
const encrypted = await window.nostr.nip04.encrypt(recipientPubkey, 'secret');
const decrypted = await window.nostr.nip04.decrypt(senderPubkey, encrypted);
// NIP-44 encrypt/decrypt (if available in nostr-tools)
const encrypted = await window.nostr.nip44.encrypt(recipientPubkey, 'secret');
const decrypted = await window.nostr.nip44.decrypt(senderPubkey, encrypted);
```
## Events
Listen for authentication events:
```javascript
// Auth state changes
window.addEventListener('nlAuth', (event) => {
console.log(event.detail);
// { type: 'login', pubkey: '...', method: 'local' }
});
// Dark mode changes
window.addEventListener('nlDarkMode', (event) => {
document.body.classList.toggle('dark', event.detail.dark);
});
// Auth URLs (for NIP-46)
window.addEventListener('nlAuthUrl', (event) => {
console.log('Auth URL:', event.detail.url);
});
// Logout events
window.addEventListener('nlLogout', () => {
console.log('User logged out');
});
```
## Architecture
```
NOSTR_LOGIN_LITE/
├── nostr-login-lite.bundle.js # Single distributable
├── core/
│ ├── nip46-client.js # NIP-46 transport over websockets
│ └── {other components} # Future components
├── ui/
│ └── modal.js # Vanilla JS modal
└── README.md # This file
```
### Key Components
- **Modal**: Lightweight modal using vanilla CSS
- **Store**: localStorage helpers for accounts/relays
- **LocalSigner**: Wraps nostr-tools for local signing
- **ExtensionBridge**: Detects and bridges browser extensions
- **NIP46Client**: Handles remote signing (NIP-46)
- **Relays**: Default relay management
## Browser Support
- Modern browsers with ES2018+ support
- WebWorkers (for NIP-46)
- localStorage (for account storage)
## Dependencies
This project uses a local copy of nostr-tools instead of loading from CDN:
- **nostr.bundle.js**: Local nostr-tools bundle (~200KB)
- **nostr-login-lite.bundle.js**: This library (~50KB gzipped)
## Size Comparison
```
nostr-tools ~200KB (served locally)
NOSTR_LOGIN_LITE ~50KB (gzipped)
Total: ~250KB
vs.
Full nostr-login: ~2.5MB+ framework dependencies
```
## Future Roadmap ⚠️
The following features are planned but not yet implemented:
- **NIP-46 Connect**: External signer integration
- **OTP/DM**: Server-side OTP delivery
- **Connect Wallet**: Wallet integration
- **Advanced UI**: Multi-screen flows
- **NIP-05 Profiles**: User discovery
- **Backup/Restore**: Key backup functionality
## Development
To work on the source files:
```bash
# Edit individual components
lite/core/nip46-client.js
lite/ui/modal.js
lite/nostr-login-lite.js
# Run bundler to create distribution
node lite/bundler.js
# Start dev server (from project root)
python3 -m http.server 8000
# Open test page
open http://localhost:8000/examples/simple-demo.html
```
### Local Bundle Setup
The project uses a local copy of nostr-tools:
- `lite/nostr.bundle.js` - Local nostr-tools bundle (serves from this location)
- `nostr-tools/` - Reference directory (excluded from git, not used in runtime)
- Examples load from: `../lite/nostr.bundle.js`
## Examples
See `examples/` directory:
- `simple-demo.html` - Basic functionality demo
- `full-test.html` - Comprehensive test suite
- `test-lite.html` - Minimal functionality test
## Migration from Full nostr-login
The lite version provides the same API surface, but is much smaller:
```javascript
// Before (full library)
import { init, launch, logout } from 'nostr-login';
// After (lite version)
await window.NOSTR_LOGIN_LITE.init();
window.NOSTR_LOGIN_LITE.launch();
window.NOSTR_LOGIN_LITE.logout();
```
## License
Same license as the original nostr-login project.
## Contributing
This is meant to be lightweight and focused. Contributions should maintain the minimal footprint while extending functionality.