@hakanai/client
v2.19.2
Published
Zero-knowledge client library for Hakanai one-time secret sharing
Maintainers
Readme
@hakanai/client
Zero-knowledge client library for Hakanai one-time secret sharing service.
Features
- 🔐 Client-side encryption using AES-256-GCM
- 🚀 Zero-knowledge - server never sees unencrypted data
- 📦 TypeScript support with full type definitions
- 🌐 Works in browsers and Node.js environments
- 🔑 Secure key generation and management
Installation
npm install @hakanai/clientUsage
Basic Example
import { HakanaiClient } from '@hakanai/client';
// Create a client instance
const client = new HakanaiClient('https://hakanai.link');
// Create and send a text secret
async function shareSecret() {
const payload = client.createPayload();
const encoder = new TextEncoder();
payload.setFromBytes(encoder.encode('My secret message'));
// Send with 24-hour expiration
const url = await client.sendPayload(payload, 86400);
console.log('Secret URL:', url);
}With Authentication
const authToken = 'your-auth-token';
const url = await client.sendPayload(payload, 86400, authToken);Sharing Files
// Create payload with filename
const payload = client.createPayload('document.pdf');
// Set file content (as Uint8Array)
payload.setFromBytes(fileBytes);
const url = await client.sendPayload(payload, 86400);Retrieving Secrets
// Parse URL to get ID and key
const secretUrl = 'https://hakanai.link/s/uuid#base64key';
const urlParts = new URL(secretUrl);
const id = urlParts.pathname.split('/').pop();
const key = urlParts.hash.substring(1);
// Retrieve and decrypt
const encryptedData = await client.retrieveSecret(id);
const decryptedPayload = await client.decryptPayload(encryptedData, key);
// Get the content
const text = decryptedPayload.decode(); // For text
const bytes = decryptedPayload.decodeBytes(); // For binaryAPI Reference
HakanaiClient
Constructor
new HakanaiClient(serverUrl: string)Methods
createPayload(filename?: string): PayloadData- Create a new payloadsendPayload(payload: PayloadData, ttlSeconds: number, authToken?: string): Promise<string>- Encrypt and send payloadretrieveSecret(id: string): Promise<string>- Retrieve encrypted secretdecryptPayload(encryptedData: string, key: string): Promise<PayloadData>- Decrypt retrieved data
PayloadData
Properties
filename?: string- Optional filename for file uploadsdata: string- Base64-encoded content (readonly)
Methods
setFromBytes(bytes: Uint8Array): void- Set content from raw bytesdecode(): string- Decode as UTF-8 textdecodeBytes(): Uint8Array- Get raw bytes
Browser Compatibility
The client uses Web Crypto API and requires:
- Chrome 37+
- Firefox 34+
- Safari 10.1+
- Edge 79+
Security Notes
- All encryption happens client-side
- Server never receives encryption keys
- Uses AES-256-GCM for authenticated encryption
- Secrets are automatically deleted after first access
License
Apache-2.0
