Skip to content

JavaScript CDN Documentation

Single file for easy integration - API identical to CLI

Français | English

Français

🚀 Installation ultra-simple

Télécharger et utiliser

html
<!-- 1. Inclure le fichier -->
<script src="sharokey.js"></script>

<!-- 2. Utiliser immédiatement -->
<script>
  // Configuration (une seule fois)
  Sharokey.config({token: 'votre-token-api'});
  
  // Créer un secret (exactement comme le CLI)
  Sharokey.create("Mon secret", 24, 1).then(secret => {
    console.log('Lien:', secret.share_url);
  });
</script>

Via CDN - Pas encore disponible

html
<!-- Pas encore disponible -->
<!-- <script src="https://cdn.sharokey.com/sharokey.min.js"></script> -->

🎯 API - Identique au CLI

Configuration

javascript
// Équivalent de: sharokey config --token xxx
Sharokey.config({
  token: 'votre-token-api',           // REQUIS
  apiUrl: 'https://...',              // Optionnel
  defaultHours: 24,                   // Optionnel
  defaultViews: 1                     // Optionnel
});

Créer un secret

javascript
// Équivalent de: sharokey create "message" --hours 24 --views 1
const secret = await Sharokey.create("Mon secret", 24, 1);
console.log('URL de partage:', secret.share_url);
console.log('Expire le:', secret.expiration);

// Avec options supplémentaires
const secret = await Sharokey.create("Secret important", 2, 1, {
  description: "Mot de passe serveur",
  message: "À utiliser avant 2h",
  password: "protection123",
  otpEmail: "[email protected]"  // OTP par email
});

// Avec OTP par SMS
const secret = await Sharokey.create("Code d'accès critique", 1, 1, {
  description: "Accès serveur production",
  otpPhone: "+33674747474"  // OTP par SMS
});

// Avec options de sécurité avancées
const secret = await Sharokey.create("Données ultra-confidentielles", 1, 1, {
  description: "Accès maximum sécurisé",
  message: "Manipuler avec une extrême précaution",
  password: "mot-de-passe-extra-sécurisé", 
  captcha: true,                          // Vérification CAPTCHA
  ipWhitelist: "192.168.1.0/24,10.0.0.1", // IPs autorisées
  geolocation: "FR,US,CA",                // Pays autorisés
  otpEmail: "[email protected]"
});

// Restrictions géographiques uniquement
const secret = await Sharokey.create("Données RGPD", 6, 3, {
  description: "Accès Union Européenne uniquement",
  geolocation: "FR,DE,BE,NL,IT,ES"  // Codes pays ISO
});

// Restriction IP pour réseau interne
const secret = await Sharokey.create("Documentation interne", 24, 5, {
  description: "Accès bureau uniquement",
  ipWhitelist: "192.168.1.0/24,203.0.113.5"  // CIDR et IPs spécifiques
});

// Avec pièces jointes (max 10 fichiers, 10MB total combinés)
const fileInput = document.getElementById('fileInput'); // <input type="file" multiple>
const files = Array.from(fileInput.files);

const secret = await Sharokey.create("Documents confidentiels", 24, 3, {
  description: "Contrat et annexes",
  attachments: files,  // Array de File objects
  password: "protection2024"
});

Demandes de secrets (Secret Requests)

javascript
// Créer une demande de secret (demander à quelqu'un de partager un secret avec vous)
const request = await Sharokey.createRequest({
  message: "Merci de partager les identifiants de base de données",
  description: "Accès DB production nécessaire",
  secretExpirationHours: 24,  // Le secret expirera dans 24h
  requestExpirationHours: 48, // La demande expire dans 48h
  maximumViews: 1,            // Le secret peut être vu une seule fois
  emailTo: "[email protected]",
  emailReply: "[email protected]"
});

console.log('Demande créée:', request.url);
console.log('Envoyer cette URL au destinataire:', request.url);

// Lister vos demandes de secrets
const requests = await Sharokey.listRequests({status: 'active', limit: 10});
console.log('Demandes actives:', requests.data.length);

requests.data.forEach(req => {
  console.log(`Demande ${req.token}: ${req.description}`);
  console.log(`  Statut: ${req.status}`);
  console.log(`  Expire: ${req.request_expiration}`);
});

// Obtenir les détails d'une demande spécifique
const request = await Sharokey.getRequest(123);
console.log('Demande:', request.message);

// Supprimer une demande
const success = await Sharokey.deleteRequest(123);
if (success) {
  console.log('Demande supprimée avec succès');
}

// Obtenir les statistiques des demandes
const stats = await Sharokey.requestStats();
console.log('Total demandes:', stats.total_requests || 0);

Lister les secrets

javascript
// Équivalent de: sharokey list
const result = await Sharokey.list();
console.log(`${result.data.length} secrets trouvés`);

// Avec filtres (équivalent de: sharokey list --limit 10 --status active)
const secrets = await Sharokey.list({
  limit: 10,
  status: 'active',
  creator: '[email protected]'
});

Détails d'un secret

javascript
// Équivalent de: sharokey get ABC123
const secret = await Sharokey.get('ABC123');
console.log('Description:', secret.data.description);
console.log('Vues restantes:', secret.data.maximum_views - secret.data.current_views);

Supprimer un secret

javascript
// Équivalent de: sharokey delete ABC123
await Sharokey.delete('ABC123');
console.log('Secret supprimé');

Statistiques

javascript
// Équivalent de: sharokey stats
const stats = await Sharokey.stats();
console.log('Total secrets:', stats.data.total_secrets);
console.log('Secrets actifs:', stats.data.active_secrets);

💡 Exemples pratiques

Site web simple

html
<!DOCTYPE html>
<html>
<head>
    <title>Partage de Secrets</title>
</head>
<body>
    <h1>Créer un Secret</h1>
    
    <textarea id="secret" placeholder="Votre secret..."></textarea><br>
    <input type="number" id="hours" value="24" min="1" max="1000"> heures<br>
    <input type="number" id="views" value="1" min="1" max="10"> vues max<br>
    <input type="file" id="attachments" multiple> <small>Pièces jointes (max 10 fichiers, 10MB total)</small><br>
    <button onclick="createSecret()">Créer</button>
    
    <div id="result"></div>

    <script src="sharokey.js"></script>
    <script>
        // Configuration
        Sharokey.config({token: 'votre-token'});

        async function createSecret() {
            const content = document.getElementById('secret').value;
            const hours = document.getElementById('hours').value;
            const views = document.getElementById('views').value;
            const attachments = Array.from(document.getElementById('attachments').files);

            try {
                const options = {};
                if (attachments.length > 0) {
                    options.attachments = attachments;
                }
                
                const secret = await Sharokey.create(content, hours, views, options);
                
                const attachmentInfo = attachments.length > 0 
                    ? `<p><strong>Pièces jointes :</strong> ${attachments.length} fichier(s)</p>`
                    : '';
                
                document.getElementById('result').innerHTML = `
                    <h3>✅ Secret créé !</h3>
                    <p><strong>Lien :</strong> <a href="${secret.share_url}" target="_blank">${secret.share_url}</a></p>
                    <p><strong>Expire le :</strong> ${new Date(secret.expiration).toLocaleString()}</p>
                    ${attachmentInfo}
                    <button onclick="navigator.clipboard.writeText('${secret.share_url}')">📋 Copier</button>
                `;
            } catch (error) {
                document.getElementById('result').innerHTML = `
                    <h3>❌ Erreur</h3>
                    <p>${error.message}</p>
                `;
            }
        }
    </script>
</body>
</html>

Générateur de mots de passe

html
<script src="sharokey.js"></script>
<script>
    Sharokey.config({token: 'votre-token'});

    async function generateAndShare() {
        try {
            // Générer un mot de passe et créer un secret
            const result = await Sharokey.createPassword(
                "Mot de passe généré automatiquement", // description
                1,  // 1 heure
                1,  // 1 vue
                16  // 16 caractères
            );

            console.log('Mot de passe:', result.password);
            console.log('Lien de partage:', result.secret.share_url);
            
            alert(`
Mot de passe généré: ${result.password}
Lien: ${result.secret.share_url}

Le lien a été copié dans le presse-papiers.
            `);
            
            // Copier dans le presse-papiers
            navigator.clipboard.writeText(result.secret.share_url);
            
        } catch (error) {
            alert('Erreur: ' + error.message);
        }
    }

    // Appeler la fonction
    generateAndShare();
</script>

Dashboard simple

html
<script src="sharokey.js"></script>
<script>
    Sharokey.config({token: 'votre-token'});

    async function loadDashboard() {
        try {
            // Charger stats et secrets en parallèle
            const [stats, secrets] = await Promise.all([
                Sharokey.stats(),
                Sharokey.list({limit: 10})
            ]);

            // Afficher les stats
            document.getElementById('stats').innerHTML = `
                <h2>📊 Statistiques</h2>
                <p>Total: ${stats.data.total_secrets}</p>
                <p>Actifs: ${stats.data.active_secrets}</p>
                <p>Vues totales: ${stats.data.total_views}</p>
            `;

            // Afficher les secrets récents
            const secretsList = secrets.data.map(secret => `
                <li>
                    <strong>${secret.description || secret.slug}</strong>
                    - ${secret.current_views}/${secret.maximum_views} vues
                    - Expire: ${new Date(secret.expiration).toLocaleDateString()}
                    <button onclick="deleteSecret('${secret.slug}')">🗑️</button>
                </li>
            `).join('');

            document.getElementById('secrets').innerHTML = `
                <h2>🔐 Secrets récents</h2>
                <ul>${secretsList}</ul>
            `;

        } catch (error) {
            console.error('Erreur dashboard:', error);
        }
    }

    async function deleteSecret(slug) {
        if (confirm('Supprimer ce secret ?')) {
            try {
                await Sharokey.delete(slug);
                loadDashboard(); // Recharger
            } catch (error) {
                alert('Erreur: ' + error.message);
            }
        }
    }

    // Charger au démarrage
    loadDashboard();
</script>

<div id="stats"></div>
<div id="secrets"></div>

🔧 Fonctions utilitaires

Générer un mot de passe

javascript
// Mot de passe simple (16 caractères avec symboles)
const password = Sharokey.generatePassword();

// Mot de passe personnalisé
const password = Sharokey.generatePassword(24, false); // 24 chars, sans symboles

Tester la connectivité

javascript
const isOnline = await Sharokey.testConnection();
if (!isOnline) {
    alert('Impossible de se connecter à Sharokey');
}

Voir la configuration

javascript
const config = Sharokey.getConfig();
console.log('API URL:', config.apiUrl);
console.log('Token configuré:', config.hasToken);

🚨 Gestion d'erreurs

Erreurs communes

javascript
try {
    await Sharokey.create("test");
} catch (error) {
    switch (true) {
        case error.message.includes('Token not configured'):
            console.error('❌ Configurez votre token d\'abord !');
            break;
        case error.message.includes('Content is required'):
            console.error('❌ Le contenu est requis');
            break;
        case error.message.includes('HTTP 401'):
            console.error('❌ Token invalide');
            break;
        case error.message.includes('HTTP 429'):
            console.error('❌ Trop de requêtes, attendez un peu');
            break;
        default:
            console.error('❌ Erreur:', error.message);
    }
}

Validation locale

javascript
// La librairie valide automatiquement :
// - Contenu non vide
// - Heures entre 1 et 1000
// - Vues entre 1 et 1000  
// - Token configuré
// - Attachments : max 10 fichiers, 10MB total
// - OTP : email et phone mutuellement exclusifs

try {
    await Sharokey.create("", -1, 0); // Erreurs multiples
} catch (error) {
    console.log(error.message); // "Content is required and must be a non-empty string"
}

try {
    const files = [/* 15 fichiers */];
    await Sharokey.create("test", 24, 1, {attachments: files});
} catch (error) {
    console.log(error.message); // "Too many attachments. Maximum 10 files allowed, got 15"
}

🔐 Sécurité

Chiffrement Zero Knowledge

  • Algorithmes : AES-GCM-256 + PBKDF2 (10k iterations)
  • Chiffrement côté client : Vos secrets ne quittent jamais le navigateur en clair
  • Double clé : keyA (serveur) + keyB (URL fragment)
  • Compatibilité : Identique au CLI et site web Sharokey

Bonnes pratiques

javascript
// ✅ Bon
const secret = await Sharokey.create("mot-de-passe-secret", 1, 1, {
    password: "protection-additionnelle"
});

// ❌ À éviter
const secret = await Sharokey.create("mot-de-passe-secret", 1000, 10); // Trop long, trop de vues

📱 Compatibilité

  • Chrome 60+
  • Firefox 55+
  • Safari 11+
  • Edge 79+
  • ❌ Internet Explorer (Web Crypto API manquant)

Fonctionnalités requises

  • Web Crypto API (pour le chiffrement)
  • Fetch API (pour les requêtes)
  • Promises/async-await

Test de compatibilité

javascript
try {
    const password = Sharokey.generatePassword();
    console.log('✅ Navigateur compatible');
} catch (error) {
    console.log('❌ Navigateur non supporté:', error.message);
}

🆚 Comparaison avec le CLI

FonctionnalitéCLIJavaScript
Configurationsharokey config --token xxxSharokey.config({token: 'xxx'})
Créationsharokey create "secret" --hours 24 --views 1Sharokey.create("secret", 24, 1)
Listesharokey list --limit 10Sharokey.list({limit: 10})
Détailssharokey get ABC123Sharokey.get('ABC123')
Suppressionsharokey delete ABC123Sharokey.delete('ABC123')
Statssharokey statsSharokey.stats()
Chiffrement✅ Zero Knowledge✅ Identique
Format sortieJSONJSON (objets JavaScript)

🔄 Migration depuis la version complète

Depuis sharokey-js (NPM)

javascript
// Avant (version NPM)
import { SharokeyClient } from 'sharokey-js';
const client = new SharokeyClient({token: 'xxx'});
await client.createSecret({content: "test", expirationHours: 24});

// Après (version simple)
<script src="sharokey.js"></script>
Sharokey.config({token: 'xxx'});
await Sharokey.create("test", 24, 1);

Avantages version simple

  • Aucune dépendance NPM
  • Fichier unique (150KB)
  • API plus simple (comme CLI)
  • Intégration immédiate

Quand utiliser la version complète

  • ❌ Applications Node.js complexes
  • ❌ TypeScript strict requis
  • ❌ Fonctionnalités avancées (batch, retry personnalisé)

❓ FAQ

Q: Puis-je utiliser cette version avec Node.js ? R: Oui, mais la version NPM complète est recommandée pour Node.js.

Q: Le token est-il visible dans le code ? R: Oui, comme toute variable JavaScript côté client. Ne l'utilisez que sur des domaines de confiance.

Q: Puis-je héberger le fichier sur mon serveur ? R: Oui, téléchargez sharokey.js et hébergez-le où vous voulez.

Q: Compatible avec les frameworks (React, Vue, Angular) ? R: Oui, mais vous devrez gérer le global Sharokey. La version NPM est plus adaptée.

Q: Puis-je modifier le code ? R: Oui, le code est open source. Attention à ne pas casser le chiffrement !

🚀 Prêt !

Votre fichier unique Sharokey est prêt à l'emploi !

  1. Téléchargez sharokey.js
  2. Incluez dans votre page HTML
  3. Configurez avec Sharokey.config({token: 'xxx'})
  4. Utilisez exactement comme le CLI !

Version simple 1.0.0 - Compatible avec Sharokey API


English Documentation

🚀 Super Simple Installation

html
<!-- 1. Include the file -->
<script src="sharokey.js"></script>

<!-- 2. Use immediately -->
<script>
  // One-time configuration 
  Sharokey.config({token: 'your-api-token'});
  
  // Create a secret (exactly like CLI)
  Sharokey.create("My secret", 24, 1).then(secret => {
    console.log('Link:', secret.share_url);
  });
</script>

🎯 API - Identical to CLI

Basic Secret Creation

javascript
// Equivalent to: sharokey create "message" --hours 24 --views 1
const secret = await Sharokey.create("My secret", 24, 1);
console.log('Share URL:', secret.share_url);
console.log('Expires on:', secret.expiration);

// With additional options
const secret = await Sharokey.create("Important secret", 2, 1, {
  description: "Server password",
  message: "Use within 2 hours",
  password: "protection123",
  otpEmail: "[email protected]"  // Email OTP
});

🛡️ Advanced Security Options

javascript
// Maximum security combination
const secret = await Sharokey.create("Top secret data", 1, 1, {
  description: "Maximum security access",
  message: "Handle with extreme care",
  password: "extra-secure-password",
  captcha: true,                          // CAPTCHA verification
  ipWhitelist: "192.168.1.0/24,10.0.0.1", // Allowed IPs
  geolocation: "FR,US,CA",                // Allowed countries
  otpEmail: "[email protected]"
});

// Geographic restrictions only
const secret = await Sharokey.create("GDPR data", 6, 3, {
  description: "European Union access only",
  geolocation: "FR,DE,BE,NL,IT,ES"  // ISO country codes
});

// IP restriction for internal network
const secret = await Sharokey.create("Internal docs", 24, 5, {
  description: "Office network only",
  ipWhitelist: "192.168.1.0/24,203.0.113.5"  // CIDR and specific IPs
});

// CAPTCHA protection
const secret = await Sharokey.create("Sensitive information", 2, 1, {
  description: "CAPTCHA protected",
  captcha: true
});

File Attachments with Security

javascript
// Files with security restrictions
const fileInput = document.getElementById('fileInput');
const files = Array.from(fileInput.files);

const secret = await Sharokey.create("Confidential documents", 24, 3, {
  description: "Contract and annexes", 
  message: "Review and return by Friday",
  attachments: files,  // Max 10 files, 10MB total
  password: "protection2024",
  ipWhitelist: "192.168.1.0/24"  // Office network only
});

List and Manage Secrets

javascript
// List secrets
const result = await Sharokey.list();
console.log(`${result.data.length} secrets found`);

// With filters
const secrets = await Sharokey.list({
  limit: 10,
  status: 'active',
  creator: '[email protected]'
});

// Get secret details
const secret = await Sharokey.get('ABC123');
console.log('Description:', secret.data.description);
console.log('Message:', secret.data.message);
console.log('Has CAPTCHA:', secret.data.captcha);
console.log('IP Whitelist:', secret.data.ip_whitelist);
console.log('Geolocation:', secret.data.geolocation);

// Delete secret
await Sharokey.delete('ABC123');

Statistics and Utilities

javascript
// Get statistics
const stats = await Sharokey.stats();
console.log('Total secrets:', stats.data.total_secrets);
console.log('Active secrets:', stats.data.active_secrets);

// Generate password
const password = Sharokey.generatePassword(20);
console.log('Generated password:', password);

// Create secret with generated password
const result = await Sharokey.createPassword(
  "Auto-generated password",
  1,  // 1 hour
  1,  // 1 view
  16  // 16 characters
);

🎛️ Configuration Options

javascript
Sharokey.config({
  token: 'your-api-token',           // REQUIRED
  apiUrl: 'https://...',             // Optional
  timeout: 30000,                    // Optional (30 seconds)
  defaultHours: 24,                  // Optional
  defaultViews: 1                    // Optional
});

🔒 Security Features Summary

FeatureParameterDescriptionExample
CAPTCHAcaptcha: trueRequires CAPTCHA verificationcaptcha: true
IP WhitelistipWhitelistComma-separated IPs/CIDR (max 255 chars)"192.168.1.0/24,10.0.0.1"
GeolocationgeolocationComma-separated country codes (max 255 chars)"FR,US,CA,DE"
PasswordpasswordAdditional password protection"secure-password"
OTP EmailotpEmailEmail for OTP verification"[email protected]"
OTP SMSotpPhonePhone for SMS OTP"+33674747474"
MessagemessageCustom message for recipient"Handle with care"

🚨 Error Handling

javascript
try {
  const secret = await Sharokey.create("My secret", 24, 1, {
    captcha: true,
    ipWhitelist: "invalid-format"  // This will cause an error
  });
} catch (error) {
  console.error('Error creating secret:', error.message);
  
  if (error.message.includes('token')) {
    console.log('Check your API token configuration');
  } else if (error.message.includes('validation')) {
    console.log('Check your parameters');
  }
}

✅ Ready to Use!

Your single-file Sharokey is ready!

  1. Download sharokey.js
  2. Include in your HTML page
  3. Configure with Sharokey.config({token: 'xxx'})
  4. Use exactly like the CLI with advanced security options!

Simple version 1.0.0 - Compatible with Sharokey API

Released under the MIT License.