A lightweight library for creating Happ crypto deep links. Works on both Node.js (backend) and browser (frontend) environments.
- 🖥️ Backend: Uses native Node.js
cryptomodule (zero dependencies) - 🌐 Frontend: Uses lightweight
jsencryptlibrary (~30KB) - 📦 Supports multiple crypto versions (v2, v3, v4)
Backend (Node.js):
npm i @kastov/cryptohappFrontend (Browser):
npm i @kastov/cryptohapp jsencryptimport { createHappCryptoLink } from '@kastov/cryptohapp';
const link = createHappCryptoLink('https://subscription.link.com/s/remnawavetop', 'v4', true);
// Returns: 'happ://crypt4/base64encodeddata...'
if (link) {
console.log(link); // 'happ://crypt4/base64encodeddata...'
}import { createHappCryptoLink } from '@kastov/cryptohapp';
const result = createHappCryptoLink('https://subscription.link.com/s/remnawavetop', 'v4');
if (result) {
console.log(result.deepLink); // 'happ://crypt4/'
console.log(result.encryptedContent); // 'base64encodeddata...'
}import { createHappCryptoLink } from '@kastov/cryptohapp';
const result = createHappCryptoLink('https://example.com/subscription', 'v4');
if (result === null) {
console.error('Encryption failed');
} else {
console.log('Success:', result.deepLink + result.encryptedContent);
}import { useState } from 'react';
import { createHappCryptoLink } from '@kastov/cryptohapp';
function CryptoLinkGenerator() {
const [link, setLink] = useState('');
const generateLink = () => {
const cryptoLink = createHappCryptoLink(
'https://subscription.link.com/s/remnawavetop',
'v4',
true,
);
if (cryptoLink) {
setLink(cryptoLink);
}
};
return (
<div>
<button onClick={generateLink}>Generate Crypto Link</button>
{link && <a href={link}>Open in Happ</a>}
</div>
);
}import { Injectable } from '@nestjs/common';
import { createHappCryptoLink } from '@kastov/cryptohapp';
@Injectable()
export class HappService {
generateCryptoLink(subscriptionUrl: string): string | null {
return createHappCryptoLink(subscriptionUrl, 'v4', true);
}
}Creates an encrypted Happ deep link.
| Parameter | Type | Default | Description |
|---|---|---|---|
content |
string |
— | The content to encrypt (e.g., subscription URL) |
version |
'v2' | 'v3' | 'v4' |
— | Crypto version to use (required) |
asLink |
boolean |
false |
When true, returns full link string |
When asLink is true: string | null
const link = createHappCryptoLink(content, 'v4', true);
// Returns: 'happ://crypt4/base64encodeddata...' or nullWhen asLink is false or omitted: HappCryptoResult | null
interface HappCryptoResult {
/** Deep link prefix (e.g., 'happ://crypt4/') */
deepLink: string;
/** Base64 encoded encrypted content */
encryptedContent: string;
}Returns null if encryption fails.
You can also access the public keys directly:
import { HAPP_CRYPTO_V2, HAPP_CRYPTO_V3, HAPP_CRYPTO_V4 } from '@kastov/cryptohapp';
console.log(HAPP_CRYPTO_V4.publicKey); // RSA public key
console.log(HAPP_CRYPTO_V4.deepLink); // 'happ://crypt4/'The library uses RSA encryption with PKCS1 padding to encrypt your content:
- Backend: Uses Node.js native
crypto.publicEncrypt() - Frontend: Uses
jsencryptlibrary for browser compatibility
Both implementations produce identical encrypted output, ensuring cross-platform compatibility.
RSA with PKCS1 padding can encrypt data up to (keySize / 8) - 11 bytes. For a 4096-bit key, this is approximately 501 bytes. If your content exceeds this limit, consider using a URL shortener or compression.
MIT