@morseai/sdk 0.1.0-beta.6 → 0.1.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.mts +10 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +85 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +85 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/crypto-x25519.ts","../src/rate-limiter.ts","../src/errors.ts","../src/logger.ts","../src/crypto.ts","../src/implementations/v1/MorseSDKV1.ts","../src/wallet-key-service.ts","../src/utils.ts","../src/morse-sdk.ts","../src/helpers.ts","../src/index.ts","../src/expiration.ts"],"names":["X25519_CIPHER_VERSION","_sodium","ethers","openSharedSignal"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * MORSE SDK - X25519 + XChaCha20-Poly1305 Encryption\r\n * \r\n * Compatible with morse-frontend's crypto-x25519.ts\r\n * \r\n * Security Model:\r\n * - X25519 for ECDH key exchange\r\n * - XChaCha20-Poly1305 for authenticated encryption\r\n * - HKDF-SHA-256 for key derivation\r\n * - Ephemeral sender keys (forward secrecy)\r\n */\r\n\r\nimport _sodium from \"libsodium-wrappers\";\r\nimport { ethers } from \"ethers\";\r\n\r\nlet sodium: typeof _sodium;\r\n\r\nasync function getSodium(): Promise<typeof _sodium> {\r\n if (!sodium) {\r\n await _sodium.ready;\r\n sodium = _sodium;\r\n }\r\n return sodium;\r\n}\r\n\r\nexport const X25519_CIPHER_VERSION = \"morse-x25519-xchacha20poly1305-v2\";\r\n\r\n/**\r\n * HKDF-SHA-256 implementation\r\n */\r\nasync function hkdfSha256(\r\n ikm: Uint8Array,\r\n salt: string | Uint8Array,\r\n info: string | Uint8Array,\r\n length: number = 32\r\n): Promise<Uint8Array> {\r\n const saltBytes = typeof salt === \"string\"\r\n ? new TextEncoder().encode(salt)\r\n : new Uint8Array(salt);\r\n const infoBytes = typeof info === \"string\"\r\n ? new TextEncoder().encode(info)\r\n : new Uint8Array(info);\r\n\r\n const ikmCopy = new Uint8Array(ikm.length);\r\n ikmCopy.set(ikm);\r\n const saltCopy = new Uint8Array(saltBytes.length);\r\n saltCopy.set(saltBytes);\r\n const infoCopy = new Uint8Array(infoBytes.length);\r\n infoCopy.set(infoBytes);\r\n\r\n const crypto = globalThis.crypto;\r\n \r\n const keyMaterial = await crypto.subtle.importKey(\r\n \"raw\",\r\n ikmCopy.buffer,\r\n \"HKDF\",\r\n false,\r\n [\"deriveBits\"]\r\n );\r\n\r\n const derivedBits = await crypto.subtle.deriveBits(\r\n {\r\n name: \"HKDF\",\r\n hash: \"SHA-256\",\r\n salt: saltCopy.buffer,\r\n info: infoCopy.buffer,\r\n },\r\n keyMaterial,\r\n length * 8\r\n );\r\n\r\n return new Uint8Array(derivedBits);\r\n}\r\n\r\n/**\r\n * Derive deterministic X25519 keypair from wallet signature\r\n */\r\nexport async function deriveKeyPairFromWalletSignature(\r\n walletAddress: string,\r\n domain: string,\r\n chainId: number,\r\n signMessage: (message: string) => Promise<string>\r\n): Promise<{ publicKey: Uint8Array; privateKey: Uint8Array }> {\r\n await getSodium();\r\n\r\n const message = `MORSE: derive encryption seed v1 | ${domain} | ${chainId} | ${walletAddress.toLowerCase()}`;\r\n const signature = await signMessage(message);\r\n\r\n const sigBytes = ethers.getBytes(signature);\r\n\r\n const seed = await hkdfSha256(\r\n sigBytes,\r\n \"MORSE_SEED_v1\",\r\n walletAddress.toLowerCase(),\r\n 32\r\n );\r\n\r\n const keypair = sodium.crypto_box_seed_keypair(seed);\r\n\r\n return {\r\n publicKey: keypair.publicKey,\r\n privateKey: keypair.privateKey,\r\n };\r\n}\r\n\r\n/**\r\n * Key Certificate interface\r\n */\r\nexport interface MorseKeyCert {\r\n walletAddress: string;\r\n x25519PublicKey: string;\r\n keyId: string;\r\n expiresAt: number;\r\n issuedAt: number;\r\n domain: string;\r\n chainId: number;\r\n signature: string;\r\n}\r\n\r\n/**\r\n * Create EIP-712 typed data for key certificate\r\n */\r\nfunction createKeyCertTypedData(\r\n walletAddress: string,\r\n x25519PublicKey: string,\r\n keyId: string,\r\n issuedAt: number,\r\n expiresAt: number,\r\n domain: string,\r\n chainId: number\r\n) {\r\n return {\r\n domain: {\r\n name: \"MORSE\",\r\n version: \"1\",\r\n chainId: chainId,\r\n },\r\n types: {\r\n MorseKeyCert: [\r\n { name: \"walletAddress\", type: \"address\" },\r\n { name: \"x25519PublicKey\", type: \"bytes32\" },\r\n { name: \"keyId\", type: \"bytes32\" },\r\n { name: \"issuedAt\", type: \"uint64\" },\r\n { name: \"expiresAt\", type: \"uint64\" },\r\n { name: \"domain\", type: \"string\" },\r\n ],\r\n },\r\n primaryType: \"MorseKeyCert\" as const,\r\n message: {\r\n walletAddress: walletAddress.toLowerCase(),\r\n x25519PublicKey: ethers.zeroPadValue(\r\n ethers.hexlify(Buffer.from(x25519PublicKey, \"base64\")),\r\n 32\r\n ),\r\n keyId: `0x${keyId}`,\r\n issuedAt: issuedAt,\r\n expiresAt: expiresAt,\r\n domain: domain,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create and sign a key certificate\r\n */\r\nexport async function createKeyCertificate(\r\n walletAddress: string,\r\n x25519PublicKey: string,\r\n domain: string,\r\n chainId: number,\r\n expiresAt: number,\r\n signTypedData: (domain: any, types: any, value: any) => Promise<string>\r\n): Promise<MorseKeyCert> {\r\n const issuedAt = Date.now();\r\n\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const keyIdInput = abiCoder.encode(\r\n [\"address\", \"bytes32\", \"uint64\", \"string\", \"uint256\"],\r\n [\r\n walletAddress.toLowerCase(),\r\n ethers.zeroPadValue(\r\n ethers.hexlify(Buffer.from(x25519PublicKey, \"base64\")),\r\n 32\r\n ),\r\n expiresAt,\r\n domain,\r\n chainId,\r\n ]\r\n );\r\n const keyId = ethers.keccak256(keyIdInput).slice(2);\r\n\r\n const typedData = createKeyCertTypedData(\r\n walletAddress,\r\n x25519PublicKey,\r\n keyId,\r\n issuedAt,\r\n expiresAt,\r\n domain,\r\n chainId\r\n );\r\n\r\n const signature = await signTypedData(\r\n typedData.domain,\r\n typedData.types,\r\n typedData.message\r\n );\r\n\r\n return {\r\n walletAddress: walletAddress.toLowerCase(),\r\n x25519PublicKey,\r\n keyId,\r\n expiresAt,\r\n issuedAt,\r\n domain,\r\n chainId,\r\n signature,\r\n };\r\n}\r\n\r\n/**\r\n * Verify a key certificate signature\r\n */\r\nexport function verifyKeyCertificate(cert: MorseKeyCert): boolean {\r\n try {\r\n const typedData = createKeyCertTypedData(\r\n cert.walletAddress,\r\n cert.x25519PublicKey,\r\n cert.keyId,\r\n cert.issuedAt,\r\n cert.expiresAt,\r\n cert.domain,\r\n cert.chainId\r\n );\r\n\r\n const recovered = ethers.verifyTypedData(\r\n typedData.domain,\r\n typedData.types,\r\n typedData.message,\r\n cert.signature\r\n );\r\n\r\n return recovered.toLowerCase() === cert.walletAddress.toLowerCase();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport interface CreateSharedSignalResult {\r\n cipherVersion: string;\r\n encryptedPayload: string;\r\n payloadNonce: string;\r\n sealedDataKey: string;\r\n sealedNonce: string;\r\n senderEphemeralPublicKey: string;\r\n aadHash: string;\r\n}\r\n\r\n/**\r\n * Create shared signal (sender side)\r\n */\r\nexport async function createSharedSignal(\r\n payloadBytes: Uint8Array,\r\n recipientPubKey: Uint8Array,\r\n walletTarget: string,\r\n walletCreator: string,\r\n expiresAt: number,\r\n signalId: string\r\n): Promise<CreateSharedSignalResult> {\r\n await getSodium();\r\n\r\n // 1. Generate random data key (32 bytes)\r\n const dataKey = sodium.randombytes_buf(32);\r\n\r\n // 2. Encrypt payload using XChaCha20-Poly1305\r\n const payloadNonce = sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);\r\n const encryptedPayload = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(\r\n payloadBytes,\r\n null,\r\n null,\r\n payloadNonce,\r\n dataKey\r\n );\r\n\r\n // 3. Generate ephemeral sender keypair\r\n const senderKeypair = sodium.crypto_box_keypair();\r\n\r\n // 4. Derive shared secret via X25519\r\n const sharedSecret = sodium.crypto_scalarmult(\r\n senderKeypair.privateKey,\r\n recipientPubKey\r\n );\r\n\r\n // 5. Derive wrapping key via HKDF\r\n const salt = `MORSE_SEAL_${signalId}_v1`;\r\n const info = \"wrap_datakey\";\r\n const wrappingKey = await hkdfSha256(sharedSecret, salt, info, 32);\r\n\r\n // 6. Seal data key with AAD\r\n const sealedNonce = sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);\r\n\r\n const expiresAtInt = Math.floor(Number(expiresAt));\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const senderEphemeralPubKeyHex = ethers.zeroPadValue(ethers.hexlify(senderKeypair.publicKey), 32);\r\n const aad = abiCoder.encode(\r\n [\"string\", \"address\", \"address\", \"uint64\", \"string\", \"bytes32\"],\r\n [\r\n signalId,\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtInt,\r\n X25519_CIPHER_VERSION,\r\n senderEphemeralPubKeyHex,\r\n ]\r\n );\r\n const aadBytes = ethers.getBytes(aad);\r\n const aadHash = ethers.keccak256(aad).slice(2);\r\n\r\n const sealedDataKey = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(\r\n dataKey,\r\n aadBytes,\r\n null,\r\n sealedNonce,\r\n wrappingKey\r\n );\r\n\r\n return {\r\n cipherVersion: X25519_CIPHER_VERSION,\r\n encryptedPayload: Buffer.from(encryptedPayload).toString(\"base64\"),\r\n payloadNonce: Buffer.from(payloadNonce).toString(\"base64\"),\r\n sealedDataKey: Buffer.from(sealedDataKey).toString(\"base64\"),\r\n sealedNonce: Buffer.from(sealedNonce).toString(\"base64\"),\r\n senderEphemeralPublicKey: Buffer.from(senderKeypair.publicKey).toString(\"base64\"),\r\n aadHash,\r\n };\r\n}\r\n\r\n/**\r\n * Open shared signal (recipient side)\r\n */\r\nexport async function openSharedSignal(\r\n encryptedPayloadBase64: string,\r\n payloadNonceBase64: string,\r\n sealedDataKeyBase64: string,\r\n sealedNonceBase64: string,\r\n senderEphemeralPublicKeyBase64: string,\r\n signalId: string,\r\n walletTarget: string,\r\n walletCreator: string,\r\n expiresAt: number,\r\n aadHash: string,\r\n walletAddress: string,\r\n domain: string,\r\n chainId: number,\r\n signMessage: (message: string) => Promise<string>\r\n): Promise<Uint8Array> {\r\n await getSodium();\r\n\r\n // 1. Derive recipient's static keypair\r\n const recipientKeypair = await deriveKeyPairFromWalletSignature(\r\n walletAddress,\r\n domain,\r\n chainId,\r\n signMessage\r\n );\r\n\r\n // 2. Import sender's ephemeral public key\r\n const senderEphemeralPub = ethers.getBytes(\r\n `0x${Buffer.from(senderEphemeralPublicKeyBase64, \"base64\").toString(\"hex\")}`\r\n );\r\n\r\n // 3. Derive shared secret\r\n const sharedSecret = sodium.crypto_scalarmult(\r\n recipientKeypair.privateKey,\r\n senderEphemeralPub\r\n );\r\n\r\n // 4. Derive wrapping key\r\n const salt = `MORSE_SEAL_${signalId}_v1`;\r\n const info = \"wrap_datakey\";\r\n const wrappingKey = await hkdfSha256(sharedSecret, salt, info, 32);\r\n\r\n // 5. Unseal data key with AAD verification\r\n const sealedDataKey = ethers.getBytes(`0x${Buffer.from(sealedDataKeyBase64, \"base64\").toString(\"hex\")}`);\r\n const sealedNonce = ethers.getBytes(`0x${Buffer.from(sealedNonceBase64, \"base64\").toString(\"hex\")}`);\r\n\r\n const expiresAtInt = Math.floor(Number(expiresAt));\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const aad = abiCoder.encode(\r\n [\"string\", \"address\", \"address\", \"uint64\", \"string\", \"bytes32\"],\r\n [\r\n signalId,\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtInt,\r\n X25519_CIPHER_VERSION,\r\n ethers.zeroPadValue(ethers.hexlify(senderEphemeralPub), 32),\r\n ]\r\n );\r\n const aadBytes = ethers.getBytes(aad);\r\n const computedAadHash = ethers.keccak256(aad).slice(2);\r\n\r\n if (computedAadHash !== aadHash) {\r\n throw new Error(\"AAD hash mismatch - possible tampering\");\r\n }\r\n\r\n const dataKey = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(\r\n null,\r\n sealedDataKey,\r\n aadBytes,\r\n sealedNonce,\r\n wrappingKey\r\n );\r\n\r\n // 6. Decrypt payload\r\n const encryptedPayload = new Uint8Array(Buffer.from(encryptedPayloadBase64, \"base64\"));\r\n const payloadNonce = new Uint8Array(Buffer.from(payloadNonceBase64, \"base64\"));\r\n\r\n const payload = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(\r\n null,\r\n encryptedPayload,\r\n null,\r\n payloadNonce,\r\n dataKey\r\n );\r\n\r\n return payload;\r\n}\r\n\r\n/**\r\n * Generate a random UUID for signal ID\r\n */\r\nexport function generateSignalId(): string {\r\n const bytes = new Uint8Array(16);\r\n globalThis.crypto.getRandomValues(bytes);\r\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\r\n return hex.substring(0, 20);\r\n}\r\n\r\n","export interface RateLimitConfig {\r\n maxRequests: number;\r\n windowMs: number;\r\n}\r\n\r\nexport class RateLimiter {\r\n private requests: Map<string, number[]> = new Map();\r\n private maxRequests: number;\r\n private windowMs: number;\r\n\r\n constructor(config: RateLimitConfig) {\r\n this.maxRequests = config.maxRequests;\r\n this.windowMs = config.windowMs;\r\n }\r\n\r\n async checkLimit(identifier: string = \"default\"): Promise<void> {\r\n const now = Date.now();\r\n const requests = this.requests.get(identifier) || [];\r\n\r\n const recentRequests = requests.filter(timestamp => now - timestamp < this.windowMs);\r\n\r\n if (recentRequests.length >= this.maxRequests) {\r\n const oldestRequest = Math.min(...recentRequests);\r\n const waitTime = this.windowMs - (now - oldestRequest);\r\n throw new RateLimitError(\r\n `Rate limit exceeded. Maximum ${this.maxRequests} requests per ${this.windowMs}ms. Retry after ${Math.ceil(waitTime / 1000)}s.`,\r\n waitTime\r\n );\r\n }\r\n\r\n recentRequests.push(now);\r\n this.requests.set(identifier, recentRequests);\r\n\r\n this.cleanup(identifier, now);\r\n }\r\n\r\n private cleanup(identifier: string, now: number): void {\r\n const requests = this.requests.get(identifier);\r\n if (requests) {\r\n const validRequests = requests.filter(timestamp => now - timestamp < this.windowMs);\r\n if (validRequests.length === 0) {\r\n this.requests.delete(identifier);\r\n } else {\r\n this.requests.set(identifier, validRequests);\r\n }\r\n }\r\n }\r\n\r\n reset(identifier: string = \"default\"): void {\r\n this.requests.delete(identifier);\r\n }\r\n\r\n resetAll(): void {\r\n this.requests.clear();\r\n }\r\n\r\n getRemainingRequests(identifier: string = \"default\"): number {\r\n const now = Date.now();\r\n const requests = this.requests.get(identifier) || [];\r\n const recentRequests = requests.filter(timestamp => now - timestamp < this.windowMs);\r\n return Math.max(0, this.maxRequests - recentRequests.length);\r\n }\r\n}\r\n\r\nexport class RateLimitError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly retryAfterMs: number\r\n ) {\r\n super(message);\r\n this.name = \"RateLimitError\";\r\n }\r\n}\r\n\r\n","export class MorseSDKError extends Error {\r\n constructor(message: string, public code?: string, public statusCode?: number) {\r\n super(message);\r\n this.name = \"MorseSDKError\";\r\n Object.setPrototypeOf(this, MorseSDKError.prototype);\r\n }\r\n}\r\n\r\nexport class SignalNotFoundError extends MorseSDKError {\r\n constructor(message: string = \"Signal not found\") {\r\n super(message, \"SIGNAL_NOT_FOUND\", 404);\r\n this.name = \"SignalNotFoundError\";\r\n Object.setPrototypeOf(this, SignalNotFoundError.prototype);\r\n }\r\n}\r\n\r\nexport class SignalExpiredError extends MorseSDKError {\r\n constructor(message: string = \"Signal has expired\") {\r\n super(message, \"SIGNAL_EXPIRED\", 400);\r\n this.name = \"SignalExpiredError\";\r\n Object.setPrototypeOf(this, SignalExpiredError.prototype);\r\n }\r\n}\r\n\r\nexport class SignalAlreadyUsedError extends MorseSDKError {\r\n constructor(message: string = \"Signal has already been used\") {\r\n super(message, \"SIGNAL_ALREADY_USED\", 400);\r\n this.name = \"SignalAlreadyUsedError\";\r\n Object.setPrototypeOf(this, SignalAlreadyUsedError.prototype);\r\n }\r\n}\r\n\r\nexport class WalletNotAllowedError extends MorseSDKError {\r\n constructor(message: string = \"Wallet not allowed to access this signal\") {\r\n super(message, \"WALLET_NOT_ALLOWED\", 401);\r\n this.name = \"WalletNotAllowedError\";\r\n Object.setPrototypeOf(this, WalletNotAllowedError.prototype);\r\n }\r\n}\r\n\r\nexport class ValidationError extends MorseSDKError {\r\n constructor(message: string = \"Validation error\") {\r\n super(message, \"VALIDATION_ERROR\", 400);\r\n this.name = \"ValidationError\";\r\n Object.setPrototypeOf(this, ValidationError.prototype);\r\n }\r\n}\r\n\r\nexport class NetworkError extends MorseSDKError {\r\n constructor(message: string = \"Network error\", public originalError?: Error) {\r\n super(message, \"NETWORK_ERROR\", 0);\r\n this.name = \"NetworkError\";\r\n Object.setPrototypeOf(this, NetworkError.prototype);\r\n }\r\n}\r\n\r\nexport { RateLimitError } from \"./rate-limiter\";\r\n\r\nexport function mapErrorResponse(error: any): MorseSDKError {\r\n if (error.code) {\r\n switch (error.code) {\r\n case \"SIGNAL_NOT_FOUND\":\r\n return new SignalNotFoundError(error.message);\r\n case \"SIGNAL_EXPIRED\":\r\n return new SignalExpiredError(error.message);\r\n case \"SIGNAL_ALREADY_USED\":\r\n return new SignalAlreadyUsedError(error.message);\r\n case \"WALLET_NOT_ALLOWED\":\r\n return new WalletNotAllowedError(error.message);\r\n case \"VALIDATION_ERROR\":\r\n return new ValidationError(error.message);\r\n default:\r\n return new MorseSDKError(error.message || \"Unknown error\", error.code);\r\n }\r\n }\r\n return new MorseSDKError(error.message || \"Unknown error\");\r\n}\r\n\r\n","export type LogLevel = \"none\" | \"error\" | \"warn\" | \"info\" | \"debug\";\r\n\r\nclass Logger {\r\n private level: LogLevel = \"warn\";\r\n private levels: Record<LogLevel, number> = {\r\n none: 0,\r\n error: 1,\r\n warn: 2,\r\n info: 3,\r\n debug: 4,\r\n };\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n getLevel(): LogLevel {\r\n return this.level;\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return this.levels[level] <= this.levels[this.level];\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"error\")) {\r\n console.error(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"warn\")) {\r\n console.warn(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"info\")) {\r\n console.info(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"debug\")) {\r\n console.debug(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n\r\n","const CIPHER_VERSION = \"aes-gcm-256-v1\";\r\n\r\nfunction getCrypto(): Crypto {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\r\n return globalThis.crypto;\r\n }\r\n if (typeof window !== 'undefined' && window.crypto) {\r\n return window.crypto;\r\n }\r\n throw new Error('Web Crypto API is not available. Requires Node.js 15+ or a browser with Web Crypto support.');\r\n}\r\n\r\nfunction toBase64(data: Uint8Array | ArrayBuffer): string {\r\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\r\n if (typeof Buffer !== 'undefined') {\r\n return Buffer.from(bytes).toString('base64');\r\n }\r\n if (typeof btoa !== 'undefined') {\r\n return btoa(String.fromCharCode(...bytes));\r\n }\r\n throw new Error('Base64 encoding not available. Requires Node.js Buffer or browser btoa.');\r\n}\r\n\r\nfunction fromBase64(base64: string): Uint8Array {\r\n if (typeof Buffer !== 'undefined') {\r\n return Uint8Array.from(Buffer.from(base64, 'base64'));\r\n }\r\n if (typeof atob !== 'undefined') {\r\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\r\n }\r\n throw new Error('Base64 decoding not available. Requires Node.js Buffer or browser atob.');\r\n}\r\n\r\nexport function getCipherVersion(): string {\r\n return CIPHER_VERSION;\r\n}\r\n\r\nexport async function generateKey(): Promise<CryptoKey> {\r\n const crypto = getCrypto();\r\n if (!crypto.subtle) {\r\n throw new Error('Web Crypto API (crypto.subtle) is not available.');\r\n }\r\n return crypto.subtle.generateKey(\r\n {\r\n name: \"AES-GCM\",\r\n length: 256,\r\n },\r\n true,\r\n [\"encrypt\", \"decrypt\"]\r\n );\r\n}\r\n\r\nexport async function exportKey(key: CryptoKey): Promise<string> {\r\n const crypto = getCrypto();\r\n const exported = await crypto.subtle.exportKey(\"raw\", key);\r\n const keyArray = new Uint8Array(exported);\r\n return toBase64(keyArray);\r\n}\r\n\r\nexport async function importKey(keyBase64: string): Promise<CryptoKey> {\r\n const crypto = getCrypto();\r\n const keyArray = fromBase64(keyBase64);\r\n const keyBuffer = keyArray.buffer.slice(keyArray.byteOffset, keyArray.byteOffset + keyArray.byteLength) as ArrayBuffer;\r\n return crypto.subtle.importKey(\r\n \"raw\",\r\n keyBuffer,\r\n {\r\n name: \"AES-GCM\",\r\n length: 256,\r\n },\r\n true,\r\n [\"encrypt\", \"decrypt\"]\r\n );\r\n}\r\n\r\nfunction generateIV(): Uint8Array {\r\n const crypto = getCrypto();\r\n return crypto.getRandomValues(new Uint8Array(12));\r\n}\r\n\r\nexport async function encryptText(\r\n text: string,\r\n key: CryptoKey\r\n): Promise<{ encrypted: string; iv: string }> {\r\n const crypto = getCrypto();\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(text);\r\n const iv = generateIV();\r\n const ivArray = new Uint8Array(iv);\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivArray,\r\n },\r\n key,\r\n data\r\n );\r\n\r\n return {\r\n encrypted: toBase64(new Uint8Array(encrypted)),\r\n iv: toBase64(iv),\r\n };\r\n}\r\n\r\nexport async function decryptText(\r\n encryptedBase64: string,\r\n ivBase64: string,\r\n key: CryptoKey\r\n): Promise<string> {\r\n const crypto = getCrypto();\r\n const encrypted = fromBase64(encryptedBase64);\r\n const iv = fromBase64(ivBase64);\r\n\r\n const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength) as ArrayBuffer;\r\n const encryptedBuffer = encrypted.buffer.slice(encrypted.byteOffset, encrypted.byteOffset + encrypted.byteLength) as ArrayBuffer;\r\n\r\n const decrypted = await crypto.subtle.decrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivBuffer,\r\n },\r\n key,\r\n encryptedBuffer\r\n );\r\n\r\n const decoder = new TextDecoder();\r\n return decoder.decode(decrypted);\r\n}\r\n\r\nexport async function encryptFile(\r\n fileData: ArrayBuffer | Uint8Array | Buffer,\r\n key: CryptoKey\r\n): Promise<{ encrypted: ArrayBuffer; iv: string }> {\r\n const crypto = getCrypto();\r\n let data: ArrayBuffer;\r\n if (fileData instanceof Buffer) {\r\n data = fileData.buffer.slice(fileData.byteOffset, fileData.byteOffset + fileData.byteLength) as ArrayBuffer;\r\n } else if (fileData instanceof Uint8Array) {\r\n data = fileData.buffer.slice(fileData.byteOffset, fileData.byteOffset + fileData.byteLength) as ArrayBuffer;\r\n } else {\r\n data = fileData;\r\n }\r\n const iv = generateIV();\r\n const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength) as ArrayBuffer;\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivBuffer,\r\n },\r\n key,\r\n data\r\n );\r\n\r\n return {\r\n encrypted,\r\n iv: toBase64(iv),\r\n };\r\n}\r\n\r\nexport async function decryptFile(\r\n encryptedData: ArrayBuffer,\r\n ivBase64: string,\r\n key: CryptoKey\r\n): Promise<ArrayBuffer> {\r\n const crypto = getCrypto();\r\n const iv = fromBase64(ivBase64);\r\n\r\n if (iv.length !== 12) {\r\n throw new Error(`Invalid IV length: ${iv.length} bytes. Expected 12 bytes for AES-GCM.`);\r\n }\r\n\r\n const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength) as ArrayBuffer;\r\n const dataBuffer = encryptedData as ArrayBuffer;\r\n\r\n const decrypted = await crypto.subtle.decrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivBuffer,\r\n },\r\n key,\r\n dataBuffer\r\n );\r\n\r\n return decrypted;\r\n}\r\n\r\nexport async function deriveKeyFromWallet(\r\n walletAddress: string,\r\n salt?: Uint8Array\r\n): Promise<CryptoKey> {\r\n const crypto = getCrypto();\r\n\r\n const normalizedAddress = walletAddress.toLowerCase();\r\n\r\n const defaultSalt = new TextEncoder().encode(\"MORSE_KEY_DERIVATION_v1\");\r\n const finalSalt = salt ? new Uint8Array(salt) : defaultSalt;\r\n\r\n const addressBytes = new TextEncoder().encode(normalizedAddress);\r\n const keyMaterial = await crypto.subtle.importKey(\r\n \"raw\",\r\n addressBytes.buffer.slice(addressBytes.byteOffset, addressBytes.byteOffset + addressBytes.byteLength) as ArrayBuffer,\r\n \"PBKDF2\",\r\n false,\r\n [\"deriveKey\"]\r\n );\r\n\r\n const saltBuffer = finalSalt.buffer.slice(finalSalt.byteOffset, finalSalt.byteOffset + finalSalt.byteLength) as ArrayBuffer;\r\n\r\n const derivedKey = await crypto.subtle.deriveKey(\r\n {\r\n name: \"PBKDF2\",\r\n salt: saltBuffer,\r\n iterations: 100000,\r\n hash: \"SHA-256\",\r\n },\r\n keyMaterial,\r\n {\r\n name: \"AES-GCM\",\r\n length: 256,\r\n },\r\n true,\r\n [\"encrypt\", \"decrypt\"]\r\n );\r\n\r\n return derivedKey;\r\n}\r\n\r\nexport function generateShareableLink(\r\n baseUrl: string,\r\n signalId: string,\r\n keyBase64?: string\r\n): string {\r\n // Security: Don't include key in URL fragment\r\n // Key should be distributed separately through a secure channel\r\n return `${baseUrl}/view/${signalId}`;\r\n}\r\n\r\n","import type { MorseContractV1 } from \"../../contracts/v1/MorseContractV1\";\r\nimport type {\r\n CreateSignalOptions,\r\n CreateSignalOptionsEncrypted,\r\n CreateSignalResponse,\r\n CreateSignalResponseEncrypted,\r\n OpenSignalResponse,\r\n OpenSignalResponseDecrypted,\r\n ListMySignalsResponse,\r\n UploadFileOptions,\r\n UploadFileResponse,\r\n DownloadFileResponse,\r\n WalletAuth,\r\n SignalErrorResponse,\r\n MorseSDKConfig,\r\n} from \"../../types\";\r\nimport { mapErrorResponse, NetworkError } from \"../../errors\";\r\nimport { logger } from \"../../logger\";\r\nimport { RateLimiter, RateLimitError } from \"../../rate-limiter\";\r\nimport {\r\n generateKey,\r\n exportKey,\r\n importKey,\r\n encryptText,\r\n encryptFile,\r\n decryptText,\r\n decryptFile,\r\n getCipherVersion,\r\n generateShareableLink,\r\n} from \"../../crypto\";\r\nimport {\r\n createSharedSignal,\r\n verifyKeyCertificate,\r\n generateSignalId,\r\n type MorseKeyCert,\r\n} from \"../../crypto-x25519\";\r\nimport { WalletKeyService } from \"../../wallet-key-service\";\r\nimport { validateSignalId, validateWalletAddress } from \"../../utils\";\r\n\r\nconst API_BASE_URL = \"https://api.morseai.tech\";\r\nconst FRONTEND_BASE_URL = \"https://morseai.tech\";\r\n\r\nexport class MorseSDKV1 implements MorseContractV1 {\r\n readonly version = \"v1\" as const;\r\n\r\n private config: MorseSDKConfig;\r\n private timeout: number;\r\n private retries: number;\r\n private retryDelay: number;\r\n private rateLimiter: RateLimiter | null = null;\r\n\r\n constructor(config: MorseSDKConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"apiKey is required. Please provide an API key in the SDK configuration.\");\r\n }\r\n\r\n if (!config.apiKey.startsWith(\"sk_\")) {\r\n throw new Error(\"Invalid API key format. API key must start with 'sk_'\");\r\n }\r\n\r\n this.config = config;\r\n this.timeout = config.timeout || 30000;\r\n this.retries = config.retries || 0;\r\n this.retryDelay = config.retryDelay || 1000;\r\n\r\n if (config.rateLimit?.enabled !== false) {\r\n const maxRequests = config.rateLimit?.maxRequests || 100;\r\n const windowMs = config.rateLimit?.windowMs || 60000;\r\n this.rateLimiter = new RateLimiter({ maxRequests, windowMs });\r\n }\r\n\r\n logger.debug(\"MorseSDKV1 initialized\", {\r\n apiVersion: config.apiVersion || \"v1\",\r\n timeout: this.timeout,\r\n retries: this.retries,\r\n rateLimitEnabled: this.rateLimiter !== null,\r\n hasApiKey: !!config.apiKey,\r\n });\r\n }\r\n\r\n private base64ToUint8Array(base64: string): Uint8Array {\r\n if (typeof Buffer !== 'undefined') {\r\n return Uint8Array.from(Buffer.from(base64, 'base64'));\r\n }\r\n if (typeof atob !== 'undefined') {\r\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\r\n }\r\n throw new Error('Base64 decoding not available. Requires Node.js Buffer or browser atob.');\r\n }\r\n\r\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n if (typeof Buffer !== 'undefined') {\r\n return Buffer.from(bytes).toString('base64');\r\n }\r\n if (typeof btoa !== 'undefined') {\r\n return btoa(String.fromCharCode(...bytes));\r\n }\r\n throw new Error('Base64 encoding not available. Requires Node.js Buffer or browser btoa.');\r\n }\r\n\r\n private sanitizeRequestOptions(options: RequestInit): RequestInit {\r\n const sanitized = { ...options };\r\n\r\n if (sanitized.body) {\r\n try {\r\n const body = JSON.parse(sanitized.body as string);\r\n const sanitizedBody: any = {};\r\n\r\n if (body.wallet) {\r\n sanitizedBody.wallet = {\r\n address: body.wallet.address,\r\n signature: '[REDACTED]',\r\n message: body.wallet.message,\r\n };\r\n }\r\n\r\n if (body.encryptedText) {\r\n sanitizedBody.encryptedText = '[REDACTED]';\r\n }\r\n\r\n if (body.payloadNonce) {\r\n sanitizedBody.payloadNonce = '[REDACTED]';\r\n }\r\n\r\n if (body.sealedDataKey) {\r\n sanitizedBody.sealedDataKey = '[REDACTED]';\r\n }\r\n\r\n if (body.file) {\r\n sanitizedBody.file = {\r\n ...body.file,\r\n payloadNonce: body.file.payloadNonce ? '[REDACTED]' : null,\r\n sealedDataKey: body.file.sealedDataKey ? '[REDACTED]' : null,\r\n };\r\n }\r\n\r\n if (body.signalId) {\r\n sanitizedBody.signalId = body.signalId;\r\n }\r\n\r\n sanitized.body = JSON.stringify(sanitizedBody);\r\n } catch {\r\n sanitized.body = '[REDACTED - non-JSON body]';\r\n }\r\n }\r\n\r\n return sanitized;\r\n }\r\n\r\n private getApiUrl(path: string): string {\r\n const version = this.config.apiVersion || \"v1\";\r\n return `${API_BASE_URL}/${version}${path}`;\r\n }\r\n\r\n private async createAuthMessage(action: string, context: string = \"\"): Promise<string> {\r\n const timestamp = Date.now();\r\n if (context) {\r\n return `MORSE: ${action} ${context} at ${timestamp}`;\r\n }\r\n return `MORSE: ${action} at ${timestamp}`;\r\n }\r\n\r\n private async signMessage(wallet: WalletAuth, message: string): Promise<string> {\r\n return await wallet.signMessage(message);\r\n }\r\n\r\n private async makeRequest<T>(\r\n url: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n if (this.rateLimiter) {\r\n try {\r\n await this.rateLimiter.checkLimit();\r\n } catch (error) {\r\n if (error instanceof RateLimitError) {\r\n logger.warn(\"Rate limit exceeded\", {\r\n url,\r\n retryAfterMs: error.retryAfterMs\r\n });\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n throw error;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n logger.debug(\"Making request\", {\r\n url,\r\n method: options.method || \"GET\",\r\n hasBody: !!options.body,\r\n });\r\n\r\n const requestOptions: RequestInit = {\r\n ...options,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n ...options.headers,\r\n },\r\n };\r\n\r\n if (this.config.onRequest) {\r\n const sanitizedOptions = this.sanitizeRequestOptions(requestOptions);\r\n this.config.onRequest(url, sanitizedOptions);\r\n }\r\n\r\n let lastError: Error | null = null;\r\n\r\n for (let attempt = 0; attempt <= this.retries; attempt++) {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n const response = await fetch(url, {\r\n ...requestOptions,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (this.config.onResponse) {\r\n this.config.onResponse(url, response);\r\n }\r\n\r\n if (!response.ok) {\r\n const error: SignalErrorResponse = await response.json().catch(() => ({\r\n status: \"error\" as const,\r\n code: \"VALIDATION_ERROR\" as const,\r\n message: `HTTP ${response.status}: ${response.statusText}`,\r\n }));\r\n\r\n logger.error(\"Request failed\", {\r\n status: response.status,\r\n code: error.code,\r\n message: error.message,\r\n attempt: attempt + 1,\r\n });\r\n\r\n const mappedError = mapErrorResponse(error);\r\n\r\n if (this.config.onError) {\r\n this.config.onError(mappedError);\r\n }\r\n\r\n throw mappedError;\r\n }\r\n\r\n const data = await response.json();\r\n logger.debug(\"Request successful\", { url, attempt: attempt + 1 });\r\n return data;\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (error.name === \"AbortError\") {\r\n const timeoutError = new NetworkError(`Request timeout after ${this.timeout}ms`, error);\r\n if (this.config.onError) {\r\n this.config.onError(timeoutError);\r\n }\r\n throw timeoutError;\r\n }\r\n\r\n if (error instanceof NetworkError || error.name?.includes(\"Error\")) {\r\n if (attempt < this.retries) {\r\n logger.warn(`Request failed, retrying... (${attempt + 1}/${this.retries})`, { url });\r\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * (attempt + 1)));\r\n continue;\r\n }\r\n\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n throw error;\r\n }\r\n\r\n if (error.message?.includes(\"fetch\") || error.message?.includes(\"network\")) {\r\n if (attempt < this.retries) {\r\n logger.warn(`Network error, retrying... (${attempt + 1}/${this.retries})`, { url });\r\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * (attempt + 1)));\r\n continue;\r\n }\r\n\r\n const networkError = new NetworkError(\"Network request failed\", error);\r\n if (this.config.onError) {\r\n this.config.onError(networkError);\r\n }\r\n throw networkError;\r\n }\r\n\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n if (lastError) {\r\n if (this.config.onError) {\r\n this.config.onError(lastError);\r\n }\r\n throw lastError;\r\n }\r\n\r\n throw new NetworkError(\"Request failed after all retries\");\r\n }\r\n\r\n async createSignal(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptions\r\n ): Promise<CreateSignalResponse> {\r\n validateWalletAddress(wallet.address);\r\n\r\n if (options.walletTarget) {\r\n validateWalletAddress(options.walletTarget);\r\n }\r\n\r\n if (options.shareWithRecipient && !options.walletTarget) {\r\n throw new Error(\"walletTarget is required when shareWithRecipient is true\");\r\n }\r\n\r\n if (!options.hasFile && !options.hasMessage) {\r\n throw new Error(\"Either hasFile or hasMessage must be true\");\r\n }\r\n\r\n logger.info(\"Creating signal\", {\r\n hasFile: options.hasFile,\r\n hasMessage: options.hasMessage,\r\n mode: options.mode,\r\n });\r\n\r\n const tempSignalId = \"temp-\" + Date.now();\r\n const authMessage = await this.createAuthMessage(\"create\", `signal ${tempSignalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n ...options,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n const result = await this.makeRequest<CreateSignalResponse>(\r\n this.getApiUrl(\"/signals\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n\r\n logger.info(\"Signal created\", { signalId: result.signalId });\r\n return result;\r\n }\r\n\r\n async openSignal(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<OpenSignalResponse> {\r\n validateSignalId(signalId);\r\n validateWalletAddress(wallet.address);\r\n\r\n logger.info(\"Opening signal\", { signalId });\r\n\r\n const authMessage = await this.createAuthMessage(\"open\", `signal ${signalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n signalId,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n const result = await this.makeRequest<OpenSignalResponse>(\r\n this.getApiUrl(\"/signals/open\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n\r\n logger.info(\"Signal opened\", { signalId, hasFile: !!result.file });\r\n return result;\r\n }\r\n\r\n async openSignalDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64?: string\r\n ): Promise<OpenSignalResponseDecrypted> {\r\n validateSignalId(signalId);\r\n validateWalletAddress(wallet.address);\r\n\r\n const encryptedResponse = await this.openSignal(wallet, signalId);\r\n\r\n // Check if this is an X25519 signal\r\n const isX25519Signal = Boolean(\r\n encryptedResponse.sealedDataKey &&\r\n encryptedResponse.sealedNonce &&\r\n encryptedResponse.senderEphemeralPublicKey\r\n );\r\n\r\n let message: string | null = null;\r\n let fileData: ArrayBuffer | null = null;\r\n let keySource: \"derived\" | \"provided\" = \"derived\";\r\n\r\n if (isX25519Signal) {\r\n // X25519 signal - decrypt using wallet\r\n const { openSharedSignal } = await import(\"../../crypto-x25519\");\r\n\r\n const walletTarget = encryptedResponse.walletTarget || wallet.address;\r\n const walletCreator = encryptedResponse.walletCreator || wallet.address;\r\n const expiresAtMs = new Date(encryptedResponse.expiresAt).getTime();\r\n\r\n // Fetch domain and chainId from the recipient's certificate\r\n const keyService = new WalletKeyService(API_BASE_URL, this.config.apiKey, this.config.apiVersion || \"v1\");\r\n const certResponse = await keyService.getPublicKey(wallet.address);\r\n\r\n const domain = certResponse.certificate?.domain || \"morseai.tech\";\r\n const chainId = certResponse.certificate?.chainId || 1;\r\n\r\n if (encryptedResponse.encryptedText && encryptedResponse.payloadNonce) {\r\n const decryptedBytes = await openSharedSignal(\r\n encryptedResponse.encryptedText,\r\n encryptedResponse.payloadNonce,\r\n encryptedResponse.sealedDataKey!,\r\n encryptedResponse.sealedNonce!,\r\n encryptedResponse.senderEphemeralPublicKey!,\r\n signalId,\r\n walletTarget,\r\n walletCreator,\r\n expiresAtMs,\r\n encryptedResponse.aadHash || \"\",\r\n wallet.address,\r\n domain,\r\n chainId,\r\n wallet.signMessage\r\n );\r\n message = new TextDecoder().decode(decryptedBytes);\r\n }\r\n\r\n // Handle X25519 file decryption\r\n if (encryptedResponse.file) {\r\n const fileResponse = await this.downloadFile(wallet, signalId);\r\n const encryptedFileBase64 = fileResponse.file;\r\n\r\n // Use file-specific sealed key data if available, otherwise fall back to signal-level data\r\n const fileSealedDataKey = encryptedResponse.file.sealedDataKey || encryptedResponse.sealedDataKey;\r\n const fileSealedNonce = encryptedResponse.file.sealedNonce || encryptedResponse.sealedNonce;\r\n const fileSenderEphemeralPublicKey = encryptedResponse.file.senderEphemeralPublicKey || encryptedResponse.senderEphemeralPublicKey;\r\n const fileAadHash = encryptedResponse.file.aadHash || encryptedResponse.aadHash || \"\";\r\n\r\n if (fileSealedDataKey && fileSealedNonce && fileSenderEphemeralPublicKey && encryptedResponse.file.payloadNonce) {\r\n // File is encrypted with X25519\r\n const decryptedFileBytes = await openSharedSignal(\r\n encryptedFileBase64,\r\n encryptedResponse.file.payloadNonce,\r\n fileSealedDataKey,\r\n fileSealedNonce,\r\n fileSenderEphemeralPublicKey,\r\n `${signalId}-file`, // Use hyphen like frontend\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtMs,\r\n fileAadHash,\r\n wallet.address,\r\n domain,\r\n chainId,\r\n wallet.signMessage\r\n );\r\n fileData = decryptedFileBytes.buffer.slice(\r\n decryptedFileBytes.byteOffset,\r\n decryptedFileBytes.byteOffset + decryptedFileBytes.byteLength\r\n ) as ArrayBuffer;\r\n } else {\r\n // File is encrypted with AES-GCM (legacy or private signal)\r\n // This shouldn't happen for X25519 signals, but handle it gracefully\r\n throw new Error(\"File encryption format not supported for this signal type\");\r\n }\r\n }\r\n\r\n keySource = \"derived\";\r\n } else {\r\n // AES-GCM signal - decrypt using provided key\r\n if (!keyBase64 || typeof keyBase64 !== 'string' || keyBase64.length < 32) {\r\n throw new Error(\"This signal requires an encryption key. Please provide the key from the URL fragment (#k=...).\");\r\n }\r\n\r\n const key = await importKey(keyBase64);\r\n\r\n if (encryptedResponse.encryptedText && encryptedResponse.payloadNonce) {\r\n message = await decryptText(encryptedResponse.encryptedText, encryptedResponse.payloadNonce, key);\r\n }\r\n\r\n if (encryptedResponse.file) {\r\n const fileResponse = await this.downloadFile(wallet, signalId);\r\n const encryptedFileData = this.base64ToUint8Array(fileResponse.file);\r\n const buffer = encryptedFileData.buffer.slice(\r\n encryptedFileData.byteOffset,\r\n encryptedFileData.byteOffset + encryptedFileData.byteLength\r\n ) as ArrayBuffer;\r\n fileData = await decryptFile(buffer, encryptedResponse.file.payloadNonce, key);\r\n }\r\n\r\n keySource = \"provided\";\r\n }\r\n\r\n return {\r\n message,\r\n file: encryptedResponse.file && fileData\r\n ? {\r\n data: fileData,\r\n originalName: encryptedResponse.file.originalName,\r\n mimeType: encryptedResponse.file.mimeType,\r\n sizeBytes: encryptedResponse.file.sizeBytes,\r\n }\r\n : null,\r\n expiresAt: encryptedResponse.expiresAt,\r\n onChainNotification: encryptedResponse.onChainNotification,\r\n keySource,\r\n };\r\n }\r\n\r\n async listMySignals(wallet: WalletAuth): Promise<ListMySignalsResponse> {\r\n const authMessage = await this.createAuthMessage(\"view\", \"vault\");\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const params = new URLSearchParams({\r\n walletAddress: wallet.address,\r\n walletSignature: signature,\r\n walletMessage: authMessage,\r\n });\r\n\r\n return this.makeRequest<ListMySignalsResponse>(\r\n `${this.getApiUrl(\"/signals/my-signals\")}?${params.toString()}`,\r\n {\r\n method: \"GET\",\r\n }\r\n );\r\n }\r\n\r\n async uploadFile(\r\n wallet: WalletAuth,\r\n options: UploadFileOptions\r\n ): Promise<UploadFileResponse> {\r\n const authMessage = await this.createAuthMessage(\"upload\", \"file\");\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n ...options,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n return this.makeRequest<UploadFileResponse>(\r\n this.getApiUrl(\"/files/upload\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n }\r\n\r\n async downloadFile(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<DownloadFileResponse> {\r\n const authMessage = await this.createAuthMessage(\"download\", `file ${signalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n signalId,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n return this.makeRequest<DownloadFileResponse>(\r\n this.getApiUrl(\"/files/download\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n }\r\n\r\n async downloadFileDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64: string\r\n ): Promise<{ data: ArrayBuffer; originalName: string; mimeType: string; sizeBytes: number }> {\r\n const encryptedResponse = await this.openSignal(wallet, signalId);\r\n\r\n if (!encryptedResponse.file) {\r\n throw new Error(\"Signal does not have a file\");\r\n }\r\n\r\n const fileResponse = await this.downloadFile(wallet, signalId);\r\n const key = await importKey(keyBase64);\r\n const encryptedFileData = this.base64ToUint8Array(fileResponse.file);\r\n const buffer = encryptedFileData.buffer.slice(\r\n encryptedFileData.byteOffset,\r\n encryptedFileData.byteOffset + encryptedFileData.byteLength\r\n ) as ArrayBuffer;\r\n const decryptedData = await decryptFile(buffer, encryptedResponse.file.payloadNonce, key);\r\n\r\n return {\r\n data: decryptedData,\r\n originalName: fileResponse.originalName,\r\n mimeType: fileResponse.mimeType,\r\n sizeBytes: fileResponse.sizeBytes,\r\n };\r\n }\r\n\r\n async createSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n validateWalletAddress(wallet.address);\r\n\r\n // SECURITY: shareWithRecipient is determined by mode - cannot be overridden\r\n const shareWithRecipient = options.mode === \"shared_wallet\";\r\n\r\n // Validate mode consistency\r\n if (options.mode === \"shared_wallet\" && !options.walletTarget) {\r\n throw new Error(\"walletTarget is required when mode is 'shared_wallet'\");\r\n }\r\n\r\n if (options.walletTarget) {\r\n validateWalletAddress(options.walletTarget);\r\n }\r\n\r\n if (!options.message && !options.file) {\r\n throw new Error(\"Either message or file must be provided\");\r\n }\r\n\r\n // Validate expiration - either expiresIn or expiresAt must be provided\r\n if (!options.expiresIn && !options.expiresAt) {\r\n throw new Error(\r\n \"Either expiresIn or expiresAt must be provided.\\n\" +\r\n \" - expiresIn: relative time (e.g., '24h', '7d', '1h')\\n\" +\r\n \" - expiresAt: specific date (ISO 8601, e.g., '2026-12-31T23:59:59.000Z')\"\r\n );\r\n }\r\n\r\n if (options.expiresIn && options.expiresAt) {\r\n throw new Error(\"Cannot provide both expiresIn and expiresAt. Use only one.\");\r\n }\r\n\r\n // Merge shareWithRecipient (determined by mode) into options\r\n const mergedOptions: CreateSignalOptionsEncrypted & { shareWithRecipient: boolean } = {\r\n ...options,\r\n shareWithRecipient,\r\n };\r\n\r\n // For shared signals, use X25519 encryption\r\n if (shareWithRecipient && options.walletTarget) {\r\n return this.createSharedSignalEncrypted(wallet, mergedOptions);\r\n }\r\n\r\n // For private signals, use simple AES-GCM with key in URL\r\n return this.createPrivateSignalEncrypted(wallet, mergedOptions);\r\n }\r\n\r\n private async createPrivateSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted & { shareWithRecipient: boolean }\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n const key = await generateKey();\r\n const keyBase64 = await exportKey(key);\r\n\r\n let encryptedText: string | undefined;\r\n let payloadNonce: string | undefined;\r\n let fileOptions: CreateSignalOptions[\"file\"] | undefined;\r\n\r\n if (options.message) {\r\n const encrypted = await encryptText(options.message, key);\r\n encryptedText = encrypted.encrypted;\r\n payloadNonce = encrypted.iv;\r\n }\r\n\r\n if (options.file) {\r\n const uploadResult = await this.uploadFileEncrypted(\r\n wallet,\r\n options.file.data,\r\n options.file.originalName,\r\n options.file.mimeType,\r\n key\r\n );\r\n\r\n const encrypted = await encryptFile(options.file.data, key);\r\n\r\n fileOptions = {\r\n storagePath: uploadResult.storagePath,\r\n payloadNonce: encrypted.iv,\r\n originalName: options.file.originalName,\r\n mimeType: options.file.mimeType,\r\n sizeBytes: uploadResult.sizeBytes,\r\n };\r\n }\r\n\r\n const signalOptions: CreateSignalOptions = {\r\n walletTarget: options.walletTarget,\r\n shareWithRecipient: options.shareWithRecipient,\r\n mode: options.mode,\r\n hasFile: !!options.file,\r\n hasMessage: !!options.message,\r\n cipherVersion: getCipherVersion(),\r\n encryptedText,\r\n payloadNonce,\r\n file: fileOptions,\r\n onChainNotification: options.onChainNotification,\r\n expiresAt: options.expiresAt,\r\n expiresIn: options.expiresIn,\r\n };\r\n\r\n const result = await this.createSignal(wallet, signalOptions);\r\n const shareableLink = generateShareableLink(FRONTEND_BASE_URL, result.signalId);\r\n\r\n return {\r\n ...result,\r\n shareableLink,\r\n };\r\n }\r\n\r\n private async createSharedSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted & { shareWithRecipient: boolean }\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n const walletTarget = options.walletTarget!;\r\n const walletCreator = wallet.address;\r\n\r\n const signalId = options.signalId || generateSignalId();\r\n\r\n let expiresAtMs: number;\r\n if (options.expiresAt) {\r\n expiresAtMs = new Date(options.expiresAt).getTime();\r\n } else if (options.expiresIn) {\r\n const match = options.expiresIn.match(/^(\\d+)([smhd])$/);\r\n if (!match) throw new Error(\"Invalid expiresIn format\");\r\n const value = parseInt(match[1], 10);\r\n const unit = match[2];\r\n const multipliers: Record<string, number> = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\r\n expiresAtMs = Date.now() + value * multipliers[unit];\r\n } else {\r\n expiresAtMs = Date.now() + 24 * 60 * 60 * 1000; // Default 24h\r\n }\r\n\r\n const keyService = new WalletKeyService(API_BASE_URL, this.config.apiKey, this.config.apiVersion || \"v1\");\r\n const recipientKeyResponse = await keyService.getPublicKey(walletTarget);\r\n\r\n if (!recipientKeyResponse.exists || !recipientKeyResponse.certificate) {\r\n throw new Error(\r\n `Public key not found for recipient ${walletTarget}. ` +\r\n `The recipient needs to publish their public key first. ` +\r\n `They can do this by opening any shared signal sent to them, or visiting the app.`\r\n );\r\n }\r\n\r\n if (!verifyKeyCertificate(recipientKeyResponse.certificate)) {\r\n throw new Error(\"Recipient's key certificate signature verification failed\");\r\n }\r\n\r\n if (Date.now() > recipientKeyResponse.certificate.expiresAt) {\r\n throw new Error(\"Recipient's key certificate has expired\");\r\n }\r\n\r\n const recipientPubKey = Buffer.from(recipientKeyResponse.certificate.x25519PublicKey, \"base64\");\r\n\r\n let payloadText = \"\";\r\n if (options.message) {\r\n payloadText = options.message;\r\n }\r\n const payloadBytes = new TextEncoder().encode(payloadText);\r\n\r\n const sealedResult = await createSharedSignal(\r\n payloadBytes,\r\n new Uint8Array(recipientPubKey),\r\n walletTarget,\r\n walletCreator,\r\n expiresAtMs,\r\n signalId\r\n );\r\n\r\n let fileOptions: CreateSignalOptions[\"file\"] | undefined;\r\n\r\n if (options.file) {\r\n const fileBytes = options.file.data instanceof ArrayBuffer\r\n ? new Uint8Array(options.file.data)\r\n : new Uint8Array(options.file.data);\r\n\r\n const fileSealedResult = await createSharedSignal(\r\n fileBytes,\r\n new Uint8Array(recipientPubKey),\r\n walletTarget,\r\n walletCreator,\r\n expiresAtMs,\r\n signalId + \"_file\"\r\n );\r\n\r\n const uploadResult = await this.uploadFile(wallet, {\r\n file: fileSealedResult.encryptedPayload,\r\n originalName: options.file.originalName,\r\n mimeType: options.file.mimeType,\r\n });\r\n\r\n fileOptions = {\r\n storagePath: uploadResult.storagePath,\r\n payloadNonce: fileSealedResult.payloadNonce,\r\n originalName: options.file.originalName,\r\n mimeType: options.file.mimeType,\r\n sizeBytes: uploadResult.sizeBytes,\r\n sealedDataKey: fileSealedResult.sealedDataKey,\r\n sealedNonce: fileSealedResult.sealedNonce,\r\n senderEphemeralPublicKey: fileSealedResult.senderEphemeralPublicKey,\r\n aadHash: fileSealedResult.aadHash,\r\n };\r\n }\r\n\r\n const signalOptions: CreateSignalOptions = {\r\n signalId,\r\n walletTarget,\r\n shareWithRecipient: true,\r\n mode: \"shared_wallet\",\r\n hasFile: !!options.file,\r\n hasMessage: !!options.message,\r\n cipherVersion: sealedResult.cipherVersion,\r\n encryptedText: options.message ? sealedResult.encryptedPayload : undefined,\r\n payloadNonce: options.message ? sealedResult.payloadNonce : undefined,\r\n sealedDataKey: sealedResult.sealedDataKey,\r\n sealedNonce: sealedResult.sealedNonce,\r\n senderEphemeralPublicKey: sealedResult.senderEphemeralPublicKey,\r\n aadHash: sealedResult.aadHash,\r\n file: fileOptions,\r\n onChainNotification: options.onChainNotification,\r\n expiresAt: new Date(expiresAtMs).toISOString(),\r\n };\r\n\r\n const result = await this.createSignal(wallet, signalOptions);\r\n\r\n const shareableLink = `${FRONTEND_BASE_URL}/view/${result.signalId}`;\r\n\r\n return {\r\n ...result,\r\n shareableLink\r\n };\r\n }\r\n\r\n async uploadFileEncrypted(\r\n wallet: WalletAuth,\r\n fileData: ArrayBuffer | Uint8Array | Buffer,\r\n originalName: string,\r\n mimeType: string,\r\n key: CryptoKey\r\n ): Promise<UploadFileResponse> {\r\n const encrypted = await encryptFile(fileData, key);\r\n const encryptedBase64 = this.arrayBufferToBase64(encrypted.encrypted);\r\n\r\n return this.uploadFile(wallet, {\r\n file: encryptedBase64,\r\n originalName,\r\n mimeType,\r\n });\r\n }\r\n\r\n async burnSignal(wallet: WalletAuth, signalId: string): Promise<{ success: boolean }> {\r\n validateSignalId(signalId);\r\n validateWalletAddress(wallet.address);\r\n\r\n logger.info(\"Burning signal\", { signalId });\r\n\r\n const authMessage = await this.createAuthMessage(\"burn\", `signal ${signalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n signalId,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n const result = await this.makeRequest<{ success: boolean }>(\r\n this.getApiUrl(\"/signals/burn\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n\r\n logger.info(\"Signal burned successfully\", { signalId });\r\n return result;\r\n }\r\n}\r\n\r\n","/**\r\n * Wallet Key Registry Service\r\n * \r\n * Fetches and publishes X25519 public keys from/to the backend registry\r\n */\r\n\r\nimport type { MorseKeyCert } from \"./crypto-x25519\";\r\n\r\nexport interface GetPublicKeyResponse {\r\n walletAddress: string;\r\n certificate: MorseKeyCert | null;\r\n exists: boolean;\r\n}\r\n\r\nexport class WalletKeyService {\r\n private baseUrl: string;\r\n private apiKey: string;\r\n private apiVersion: string;\r\n\r\n constructor(baseUrl: string, apiKey: string, apiVersion: string = \"v1\") {\r\n this.baseUrl = baseUrl;\r\n this.apiKey = apiKey;\r\n this.apiVersion = apiVersion;\r\n }\r\n\r\n private getApiUrl(path: string): string {\r\n return `${this.baseUrl}/${this.apiVersion}${path}`;\r\n }\r\n\r\n async getPublicKey(walletAddress: string): Promise<GetPublicKeyResponse> {\r\n const url = this.getApiUrl(`/wallet-key-registry/${walletAddress.toLowerCase()}`);\r\n\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.apiKey,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n return {\r\n walletAddress: walletAddress.toLowerCase(),\r\n certificate: null,\r\n exists: false,\r\n };\r\n }\r\n throw new Error(`Failed to fetch public key: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n walletAddress: data.walletAddress,\r\n certificate: data.certificate || null,\r\n exists: !!data.certificate,\r\n };\r\n }\r\n\r\n async publishPublicKey(certificate: MorseKeyCert): Promise<void> {\r\n const url = this.getApiUrl(\"/wallet-key-registry\");\r\n\r\n const response = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.apiKey,\r\n },\r\n body: JSON.stringify({ certificate }),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: \"Unknown error\" }));\r\n throw new Error(`Failed to publish public key: ${error.message || response.statusText}`);\r\n }\r\n }\r\n}\r\n","export function isValidSignalId(signalId: string): boolean {\r\n if (!signalId || typeof signalId !== 'string') {\r\n return false;\r\n }\r\n if (signalId.length < 8 || signalId.length > 64) {\r\n return false;\r\n }\r\n return /^[a-zA-Z0-9_-]+$/.test(signalId);\r\n}\r\n\r\nexport function isValidWalletAddress(address: string): boolean {\r\n if (!address || typeof address !== 'string') {\r\n return false;\r\n }\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n}\r\n\r\nexport function validateSignalId(signalId: string): void {\r\n if (!isValidSignalId(signalId)) {\r\n throw new Error(`Invalid signal ID: ${signalId}. Must be 8-64 alphanumeric characters.`);\r\n }\r\n}\r\n\r\nexport function validateWalletAddress(address: string): void {\r\n if (!isValidWalletAddress(address)) {\r\n throw new Error(`Invalid wallet address: ${address}. Must be a valid Ethereum address.`);\r\n }\r\n}\r\n\r\nexport function formatExpiration(expiresAt: string): string {\r\n const date = new Date(expiresAt);\r\n return date.toLocaleString();\r\n}\r\n\r\nexport function isSignalExpired(expiresAt: string): boolean {\r\n return new Date(expiresAt) < new Date();\r\n}\r\n\r\nexport function getTimeUntilExpiration(expiresAt: string): number {\r\n return Math.max(0, new Date(expiresAt).getTime() - Date.now());\r\n}\r\n\r\nexport function parseExpiresIn(expiresIn: string): number {\r\n const match = expiresIn.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n throw new Error(`Invalid expiresIn format: ${expiresIn}. Use format like \"24h\", \"7d\", \"30m\"`);\r\n }\r\n \r\n const value = parseInt(match[1], 10);\r\n const unit = match[2];\r\n \r\n const multipliers: Record<string, number> = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n };\r\n \r\n return value * multipliers[unit];\r\n}\r\n\r\nexport function filterActiveSignals<T extends { status: string; expiresAt: string }>(\r\n signals: T[]\r\n): T[] {\r\n const now = new Date();\r\n return signals.filter(\r\n (signal) => signal.status === \"active\" && new Date(signal.expiresAt) > now\r\n );\r\n}\r\n\r\nexport function sortSignalsByDate<T extends { createdAt: string }>(\r\n signals: T[],\r\n order: \"asc\" | \"desc\" = \"desc\"\r\n): T[] {\r\n return [...signals].sort((a, b) => {\r\n const dateA = new Date(a.createdAt).getTime();\r\n const dateB = new Date(b.createdAt).getTime();\r\n return order === \"desc\" ? dateB - dateA : dateA - dateB;\r\n });\r\n}\r\n\r\nexport function getSignalUrl(baseUrl: string, signalId: string, keyBase64?: string): string {\r\n const url = `${baseUrl}/#/signal/${signalId}`;\r\n if (keyBase64) {\r\n return `${url}#k=${encodeURIComponent(keyBase64)}`;\r\n }\r\n return url;\r\n}\r\n\r\nexport function extractSignalIdFromUrl(url: string): string | null {\r\n const match = url.match(/\\/signal\\/([a-zA-Z0-9_-]+)/);\r\n return match ? match[1] : null;\r\n}\r\n","import type {\r\n CreateSignalOptions,\r\n CreateSignalOptionsEncrypted,\r\n CreateSignalResponse,\r\n CreateSignalResponseEncrypted,\r\n OpenSignalResponse,\r\n OpenSignalResponseDecrypted,\r\n ListMySignalsResponse,\r\n UploadFileOptions,\r\n UploadFileResponse,\r\n DownloadFileResponse,\r\n WalletAuth,\r\n MorseSDKConfig,\r\n} from \"./types\";\r\nimport type { MorseContract } from \"./contracts/MorseContract\";\r\nimport { MorseSDKV1 } from \"./implementations/v1/MorseSDKV1\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport interface MorseSDKCallbacks {\r\n onRequest?: (url: string, options: RequestInit) => void;\r\n onResponse?: (url: string, response: Response) => void;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\nexport class MorseSDK implements MorseContract {\r\n private contract: MorseContract;\r\n private apiVersion: string;\r\n private config: MorseSDKConfig;\r\n\r\n constructor(config: MorseSDKConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"apiKey is required. Please provide an API key in the SDK configuration.\");\r\n }\r\n\r\n this.config = config;\r\n this.apiVersion = config.apiVersion || \"v1\";\r\n\r\n switch (this.apiVersion) {\r\n case \"v1\":\r\n this.contract = new MorseSDKV1(config);\r\n break;\r\n default:\r\n logger.warn(`Unknown API version: ${this.apiVersion}, defaulting to v1`);\r\n this.contract = new MorseSDKV1(config);\r\n this.apiVersion = \"v1\";\r\n }\r\n\r\n logger.debug(\"MorseSDK initialized\", {\r\n apiVersion: this.apiVersion,\r\n contractVersion: (this.contract as any).version,\r\n });\r\n }\r\n\r\n getConfig(): Readonly<MorseSDKConfig> {\r\n return { ...this.config };\r\n }\r\n\r\n getApiVersion(): string {\r\n return this.apiVersion;\r\n }\r\n\r\n getContract(): MorseContract {\r\n return this.contract;\r\n }\r\n\r\n async createSignal(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptions\r\n ): Promise<CreateSignalResponse> {\r\n return this.contract.createSignal(wallet, options);\r\n }\r\n\r\n async openSignal(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<OpenSignalResponse> {\r\n return this.contract.openSignal(wallet, signalId);\r\n }\r\n\r\n async listMySignals(wallet: WalletAuth): Promise<ListMySignalsResponse> {\r\n return this.contract.listMySignals(wallet);\r\n }\r\n\r\n async uploadFile(\r\n wallet: WalletAuth,\r\n options: UploadFileOptions\r\n ): Promise<UploadFileResponse> {\r\n return this.contract.uploadFile(wallet, options);\r\n }\r\n\r\n async downloadFile(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<DownloadFileResponse> {\r\n return this.contract.downloadFile(wallet, signalId);\r\n }\r\n\r\n async burnSignal(wallet: WalletAuth, signalId: string): Promise<{ success: boolean }> {\r\n return this.contract.burnSignal(wallet, signalId);\r\n }\r\n\r\n async createSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.createSignalEncrypted) {\r\n return v1Contract.createSignalEncrypted(wallet, options);\r\n }\r\n throw new Error(\"createSignalEncrypted is not available in this API version\");\r\n }\r\n\r\n async openSignalDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64?: string\r\n ): Promise<OpenSignalResponseDecrypted> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.openSignalDecrypted) {\r\n return v1Contract.openSignalDecrypted(wallet, signalId, keyBase64);\r\n }\r\n throw new Error(\"openSignalDecrypted is not available in this API version\");\r\n }\r\n\r\n async uploadFileEncrypted(\r\n wallet: WalletAuth,\r\n fileData: ArrayBuffer | Uint8Array | Buffer,\r\n originalName: string,\r\n mimeType: string,\r\n key: CryptoKey\r\n ): Promise<UploadFileResponse> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.uploadFileEncrypted) {\r\n return v1Contract.uploadFileEncrypted(wallet, fileData, originalName, mimeType, key);\r\n }\r\n throw new Error(\"uploadFileEncrypted is not available in this API version\");\r\n }\r\n\r\n async downloadFileDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64: string\r\n ): Promise<{ data: ArrayBuffer; originalName: string; mimeType: string; sizeBytes: number }> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.downloadFileDecrypted) {\r\n return v1Contract.downloadFileDecrypted(wallet, signalId, keyBase64);\r\n }\r\n throw new Error(\"downloadFileDecrypted is not available in this API version\");\r\n }\r\n}\r\n\r\n","import type { WalletAuth } from \"./types\";\r\n\r\nexport interface PrivateKeyWalletConfig {\r\n privateKey: string;\r\n}\r\n\r\nexport interface PreSignedWalletConfig {\r\n address: string;\r\n signature: string;\r\n message: string;\r\n}\r\n\r\nexport function createWalletFromPrivateKey(config: PrivateKeyWalletConfig): WalletAuth {\r\n let ethersModule: any;\r\n\r\n try {\r\n ethersModule = require(\"ethers\");\r\n } catch {\r\n try {\r\n throw new Error(\"ethers must be installed\");\r\n } catch (error: any) {\r\n throw new Error(\r\n \"ethers is required for private key wallets. Install it: npm install ethers\"\r\n );\r\n }\r\n }\r\n\r\n const { Wallet } = ethersModule;\r\n\r\n const tempWallet = new Wallet(config.privateKey);\r\n const address = tempWallet.address;\r\n\r\n\r\n const privateKey = config.privateKey;\r\n\r\n return {\r\n address,\r\n signMessage: async (message: string) => {\r\n const wallet = new Wallet(privateKey);\r\n const signature = await wallet.signMessage(message);\r\n return signature;\r\n },\r\n };\r\n}\r\n\r\nexport function createWalletFromPreSigned(config: PreSignedWalletConfig): WalletAuth {\r\n return {\r\n address: config.address,\r\n signMessage: async (message: string) => {\r\n if (message === config.message) {\r\n return config.signature;\r\n }\r\n throw new Error(\r\n \"Pre-signed wallet can only sign the original message. \" +\r\n \"Expected: \" + config.message + \", Got: \" + message\r\n );\r\n },\r\n };\r\n}\r\n\r\nexport async function createBrowserWallet(\r\n ethereum: any,\r\n address?: string\r\n): Promise<WalletAuth> {\r\n let currentAddress: string = address || \"\";\r\n\r\n if (!currentAddress) {\r\n const accounts = await ethereum.request({ method: \"eth_accounts\" });\r\n if (accounts.length === 0) {\r\n throw new Error(\"No wallet connected. Please connect your wallet first.\");\r\n }\r\n currentAddress = accounts[0];\r\n }\r\n\r\n return {\r\n address: currentAddress,\r\n signMessage: async (message: string) => {\r\n try {\r\n const signature = await ethereum.request({\r\n method: \"personal_sign\",\r\n params: [message, currentAddress],\r\n });\r\n return signature;\r\n } catch (error: any) {\r\n if (error.code === 4001) {\r\n throw new Error(\"User rejected the signing request\");\r\n }\r\n throw error;\r\n }\r\n },\r\n };\r\n}\r\n\r\n","export { MorseSDK, type MorseSDKCallbacks } from \"./morse-sdk\";\r\nexport * from \"./types\";\r\nexport * from \"./contracts\";\r\nexport * from \"./implementations\";\r\nexport {\r\n createWalletFromPrivateKey,\r\n createWalletFromPreSigned,\r\n createBrowserWallet,\r\n type PrivateKeyWalletConfig,\r\n type PreSignedWalletConfig,\r\n} from \"./helpers\";\r\nexport {\r\n MorseSDKError,\r\n SignalNotFoundError,\r\n SignalExpiredError,\r\n SignalAlreadyUsedError,\r\n WalletNotAllowedError,\r\n ValidationError,\r\n NetworkError,\r\n RateLimitError,\r\n} from \"./errors\";\r\nexport { logger, type LogLevel } from \"./logger\";\r\nexport * from \"./utils\";\r\nexport {\r\n getCipherVersion,\r\n generateShareableLink,\r\n} from \"./crypto\";\r\nexport {\r\n X25519_CIPHER_VERSION,\r\n createSharedSignal,\r\n openSharedSignal,\r\n deriveKeyPairFromWalletSignature,\r\n createKeyCertificate,\r\n verifyKeyCertificate,\r\n generateSignalId,\r\n type MorseKeyCert,\r\n type CreateSharedSignalResult,\r\n} from \"./crypto-x25519\";\r\nexport { WalletKeyService } from \"./wallet-key-service\";\r\nexport { Expiration, type ExpirationValue } from \"./expiration\";\r\n\r\n","/**\r\n * Common expiration time constants for signals\r\n * \r\n * Use these constants to ensure correct format and get autocomplete support\r\n * \r\n * @example\r\n * ```typescript\r\n * await sdk.createSignalEncrypted(wallet, {\r\n * mode: \"shared_wallet\",\r\n * walletTarget: \"0x...\",\r\n * message: \"...\",\r\n * expiresIn: Expiration.ONE_DAY, // \"24h\"\r\n * });\r\n * ```\r\n */\r\nexport const Expiration = {\r\n /** 5 seconds */\r\n FIVE_SECONDS: \"5s\",\r\n /** 30 seconds */\r\n THIRTY_SECONDS: \"30s\",\r\n /** 1 minute */\r\n ONE_MINUTE: \"1m\",\r\n /** 5 minutes */\r\n FIVE_MINUTES: \"5m\",\r\n /** 30 minutes */\r\n THIRTY_MINUTES: \"30m\",\r\n /** 1 hour */\r\n ONE_HOUR: \"1h\",\r\n /** 6 hours */\r\n SIX_HOURS: \"6h\",\r\n /** 12 hours */\r\n TWELVE_HOURS: \"12h\",\r\n /** 24 hours (1 day) */\r\n ONE_DAY: \"24h\",\r\n /** 7 days (1 week) */\r\n ONE_WEEK: \"7d\",\r\n /** 30 days (1 month) */\r\n ONE_MONTH: \"30d\",\r\n} as const;\r\n\r\n/**\r\n * Type for expiration values\r\n */\r\nexport type ExpirationValue = typeof Expiration[keyof typeof Expiration] | string;\r\n\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/crypto-x25519.ts","../src/rate-limiter.ts","../src/errors.ts","../src/logger.ts","../src/crypto.ts","../src/implementations/v1/MorseSDKV1.ts","../src/wallet-key-service.ts","../src/utils.ts","../src/morse-sdk.ts","../src/helpers.ts","../src/index.ts","../src/expiration.ts"],"names":["X25519_CIPHER_VERSION","_sodium","ethers","openSharedSignal"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * MORSE SDK - X25519 + XChaCha20-Poly1305 Encryption\r\n * \r\n * Compatible with morse-frontend's crypto-x25519.ts\r\n * \r\n * Security Model:\r\n * - X25519 for ECDH key exchange\r\n * - XChaCha20-Poly1305 for authenticated encryption\r\n * - HKDF-SHA-256 for key derivation\r\n * - Ephemeral sender keys (forward secrecy)\r\n */\r\n\r\nimport _sodium from \"libsodium-wrappers\";\r\nimport { ethers } from \"ethers\";\r\n\r\nlet sodium: typeof _sodium;\r\n\r\nasync function getSodium(): Promise<typeof _sodium> {\r\n if (!sodium) {\r\n await _sodium.ready;\r\n sodium = _sodium;\r\n }\r\n return sodium;\r\n}\r\n\r\nexport const X25519_CIPHER_VERSION = \"morse-x25519-xchacha20poly1305-v2\";\r\n\r\n/**\r\n * HKDF-SHA-256 implementation\r\n */\r\nasync function hkdfSha256(\r\n ikm: Uint8Array,\r\n salt: string | Uint8Array,\r\n info: string | Uint8Array,\r\n length: number = 32\r\n): Promise<Uint8Array> {\r\n const saltBytes = typeof salt === \"string\"\r\n ? new TextEncoder().encode(salt)\r\n : new Uint8Array(salt);\r\n const infoBytes = typeof info === \"string\"\r\n ? new TextEncoder().encode(info)\r\n : new Uint8Array(info);\r\n\r\n const ikmCopy = new Uint8Array(ikm.length);\r\n ikmCopy.set(ikm);\r\n const saltCopy = new Uint8Array(saltBytes.length);\r\n saltCopy.set(saltBytes);\r\n const infoCopy = new Uint8Array(infoBytes.length);\r\n infoCopy.set(infoBytes);\r\n\r\n const crypto = globalThis.crypto;\r\n\r\n const keyMaterial = await crypto.subtle.importKey(\r\n \"raw\",\r\n ikmCopy.buffer,\r\n \"HKDF\",\r\n false,\r\n [\"deriveBits\"]\r\n );\r\n\r\n const derivedBits = await crypto.subtle.deriveBits(\r\n {\r\n name: \"HKDF\",\r\n hash: \"SHA-256\",\r\n salt: saltCopy.buffer,\r\n info: infoCopy.buffer,\r\n },\r\n keyMaterial,\r\n length * 8\r\n );\r\n\r\n return new Uint8Array(derivedBits);\r\n}\r\n\r\n/**\r\n * Derive deterministic X25519 keypair from wallet signature\r\n */\r\nexport async function deriveKeyPairFromWalletSignature(\r\n walletAddress: string,\r\n domain: string,\r\n chainId: number,\r\n signMessage: (message: string) => Promise<string>\r\n): Promise<{ publicKey: Uint8Array; privateKey: Uint8Array }> {\r\n await getSodium();\r\n\r\n const message = `MORSE: derive encryption seed v1 | ${domain} | ${chainId} | ${walletAddress.toLowerCase()}`;\r\n const signature = await signMessage(message);\r\n\r\n const sigBytes = ethers.getBytes(signature);\r\n\r\n const seed = await hkdfSha256(\r\n sigBytes,\r\n \"MORSE_SEED_v1\",\r\n walletAddress.toLowerCase(),\r\n 32\r\n );\r\n\r\n const keypair = sodium.crypto_box_seed_keypair(seed);\r\n\r\n return {\r\n publicKey: keypair.publicKey,\r\n privateKey: keypair.privateKey,\r\n };\r\n}\r\n\r\n/**\r\n * Key Certificate interface\r\n */\r\nexport interface MorseKeyCert {\r\n walletAddress: string;\r\n x25519PublicKey: string;\r\n keyId: string;\r\n expiresAt: number;\r\n issuedAt: number;\r\n domain: string;\r\n chainId: number;\r\n signature: string;\r\n}\r\n\r\n/**\r\n * Create EIP-712 typed data for key certificate\r\n */\r\nfunction createKeyCertTypedData(\r\n walletAddress: string,\r\n x25519PublicKey: string,\r\n keyId: string,\r\n issuedAt: number,\r\n expiresAt: number,\r\n domain: string,\r\n chainId: number\r\n) {\r\n return {\r\n domain: {\r\n name: \"MORSE\",\r\n version: \"1\",\r\n chainId: chainId,\r\n },\r\n types: {\r\n MorseKeyCert: [\r\n { name: \"walletAddress\", type: \"address\" },\r\n { name: \"x25519PublicKey\", type: \"bytes32\" },\r\n { name: \"keyId\", type: \"bytes32\" },\r\n { name: \"issuedAt\", type: \"uint64\" },\r\n { name: \"expiresAt\", type: \"uint64\" },\r\n { name: \"domain\", type: \"string\" },\r\n ],\r\n },\r\n primaryType: \"MorseKeyCert\" as const,\r\n message: {\r\n walletAddress: walletAddress.toLowerCase(),\r\n x25519PublicKey: ethers.zeroPadValue(\r\n ethers.hexlify(Buffer.from(x25519PublicKey, \"base64\")),\r\n 32\r\n ),\r\n keyId: `0x${keyId}`,\r\n issuedAt: issuedAt,\r\n expiresAt: expiresAt,\r\n domain: domain,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Create and sign a key certificate\r\n */\r\nexport async function createKeyCertificate(\r\n walletAddress: string,\r\n x25519PublicKey: string,\r\n domain: string,\r\n chainId: number,\r\n expiresAt: number,\r\n signTypedData: (domain: any, types: any, value: any) => Promise<string>\r\n): Promise<MorseKeyCert> {\r\n const issuedAt = Date.now();\r\n\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const keyIdInput = abiCoder.encode(\r\n [\"address\", \"bytes32\", \"uint64\", \"string\", \"uint256\"],\r\n [\r\n walletAddress.toLowerCase(),\r\n ethers.zeroPadValue(\r\n ethers.hexlify(Buffer.from(x25519PublicKey, \"base64\")),\r\n 32\r\n ),\r\n expiresAt,\r\n domain,\r\n chainId,\r\n ]\r\n );\r\n const keyId = ethers.keccak256(keyIdInput).slice(2);\r\n\r\n const typedData = createKeyCertTypedData(\r\n walletAddress,\r\n x25519PublicKey,\r\n keyId,\r\n issuedAt,\r\n expiresAt,\r\n domain,\r\n chainId\r\n );\r\n\r\n const signature = await signTypedData(\r\n typedData.domain,\r\n typedData.types,\r\n typedData.message\r\n );\r\n\r\n return {\r\n walletAddress: walletAddress.toLowerCase(),\r\n x25519PublicKey,\r\n keyId,\r\n expiresAt,\r\n issuedAt,\r\n domain,\r\n chainId,\r\n signature,\r\n };\r\n}\r\n\r\n/**\r\n * Verify a key certificate signature\r\n */\r\nexport function verifyKeyCertificate(cert: MorseKeyCert): boolean {\r\n try {\r\n const typedData = createKeyCertTypedData(\r\n cert.walletAddress,\r\n cert.x25519PublicKey,\r\n cert.keyId,\r\n cert.issuedAt,\r\n cert.expiresAt,\r\n cert.domain,\r\n cert.chainId\r\n );\r\n\r\n const recovered = ethers.verifyTypedData(\r\n typedData.domain,\r\n typedData.types,\r\n typedData.message,\r\n cert.signature\r\n );\r\n\r\n return recovered.toLowerCase() === cert.walletAddress.toLowerCase();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport interface CreateSharedSignalResult {\r\n cipherVersion: string;\r\n encryptedPayload: string;\r\n payloadNonce: string;\r\n sealedDataKey: string;\r\n sealedNonce: string;\r\n senderEphemeralPublicKey: string;\r\n aadHash: string;\r\n}\r\n\r\n/**\r\n * Create shared signal (sender side)\r\n */\r\nexport async function createSharedSignal(\r\n payloadBytes: Uint8Array,\r\n recipientPubKey: Uint8Array,\r\n walletTarget: string,\r\n walletCreator: string,\r\n expiresAt: number,\r\n signalId: string\r\n): Promise<CreateSharedSignalResult> {\r\n await getSodium();\r\n\r\n // 1. Generate random data key (32 bytes)\r\n const dataKey = sodium.randombytes_buf(32);\r\n\r\n // 2. Encrypt payload using XChaCha20-Poly1305\r\n const payloadNonce = sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);\r\n const encryptedPayload = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(\r\n payloadBytes,\r\n null,\r\n null,\r\n payloadNonce,\r\n dataKey\r\n );\r\n\r\n // 3. Generate ephemeral sender keypair\r\n const senderKeypair = sodium.crypto_box_keypair();\r\n\r\n // 4. Derive shared secret via X25519\r\n const sharedSecret = sodium.crypto_scalarmult(\r\n senderKeypair.privateKey,\r\n recipientPubKey\r\n );\r\n\r\n // 5. Derive wrapping key via HKDF\r\n const salt = `MORSE_SEAL_${signalId}_v1`;\r\n const info = \"wrap_datakey\";\r\n const wrappingKey = await hkdfSha256(sharedSecret, salt, info, 32);\r\n\r\n // 6. Seal data key with AAD\r\n const sealedNonce = sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);\r\n\r\n const expiresAtInt = Math.floor(Number(expiresAt));\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const senderEphemeralPubKeyHex = ethers.zeroPadValue(ethers.hexlify(senderKeypair.publicKey), 32);\r\n const aad = abiCoder.encode(\r\n [\"string\", \"address\", \"address\", \"uint64\", \"string\", \"bytes32\"],\r\n [\r\n signalId,\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtInt,\r\n X25519_CIPHER_VERSION,\r\n senderEphemeralPubKeyHex,\r\n ]\r\n );\r\n const aadBytes = ethers.getBytes(aad);\r\n const aadHash = ethers.keccak256(aad).slice(2);\r\n\r\n const sealedDataKey = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(\r\n dataKey,\r\n aadBytes,\r\n null,\r\n sealedNonce,\r\n wrappingKey\r\n );\r\n\r\n return {\r\n cipherVersion: X25519_CIPHER_VERSION,\r\n encryptedPayload: Buffer.from(encryptedPayload).toString(\"base64\"),\r\n payloadNonce: Buffer.from(payloadNonce).toString(\"base64\"),\r\n sealedDataKey: Buffer.from(sealedDataKey).toString(\"base64\"),\r\n sealedNonce: Buffer.from(sealedNonce).toString(\"base64\"),\r\n senderEphemeralPublicKey: Buffer.from(senderKeypair.publicKey).toString(\"base64\"),\r\n aadHash,\r\n };\r\n}\r\n\r\n/**\r\n * Open shared signal (recipient side)\r\n */\r\nexport async function openSharedSignal(\r\n encryptedPayloadBase64: string,\r\n payloadNonceBase64: string,\r\n sealedDataKeyBase64: string,\r\n sealedNonceBase64: string,\r\n senderEphemeralPublicKeyBase64: string,\r\n signalId: string,\r\n walletTarget: string,\r\n walletCreator: string,\r\n expiresAt: number,\r\n aadHash: string,\r\n walletAddress: string,\r\n domain: string,\r\n chainId: number,\r\n signMessage: (message: string) => Promise<string>\r\n): Promise<Uint8Array> {\r\n await getSodium();\r\n\r\n // 1. Derive recipient's static keypair\r\n const recipientKeypair = await deriveKeyPairFromWalletSignature(\r\n walletAddress,\r\n domain,\r\n chainId,\r\n signMessage\r\n );\r\n\r\n // 2. Import sender's ephemeral public key\r\n const senderEphemeralPub = ethers.getBytes(\r\n `0x${Buffer.from(senderEphemeralPublicKeyBase64, \"base64\").toString(\"hex\")}`\r\n );\r\n\r\n // 3. Derive shared secret\r\n const sharedSecret = sodium.crypto_scalarmult(\r\n recipientKeypair.privateKey,\r\n senderEphemeralPub\r\n );\r\n\r\n // 4. Derive wrapping key\r\n const salt = `MORSE_SEAL_${signalId}_v1`;\r\n const info = \"wrap_datakey\";\r\n const wrappingKey = await hkdfSha256(sharedSecret, salt, info, 32);\r\n\r\n // 5. Unseal data key with AAD verification\r\n const sealedDataKey = ethers.getBytes(`0x${Buffer.from(sealedDataKeyBase64, \"base64\").toString(\"hex\")}`);\r\n const sealedNonce = ethers.getBytes(`0x${Buffer.from(sealedNonceBase64, \"base64\").toString(\"hex\")}`);\r\n\r\n const expiresAtInt = Math.floor(Number(expiresAt));\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const aad = abiCoder.encode(\r\n [\"string\", \"address\", \"address\", \"uint64\", \"string\", \"bytes32\"],\r\n [\r\n signalId,\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtInt,\r\n X25519_CIPHER_VERSION,\r\n ethers.zeroPadValue(ethers.hexlify(senderEphemeralPub), 32),\r\n ]\r\n );\r\n const aadBytes = ethers.getBytes(aad);\r\n const computedAadHash = ethers.keccak256(aad).slice(2);\r\n\r\n if (computedAadHash !== aadHash) {\r\n throw new Error(\"AAD hash mismatch - possible tampering\");\r\n }\r\n\r\n const dataKey = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(\r\n null,\r\n sealedDataKey,\r\n aadBytes,\r\n sealedNonce,\r\n wrappingKey\r\n );\r\n\r\n // 6. Decrypt payload\r\n const encryptedPayload = new Uint8Array(Buffer.from(encryptedPayloadBase64, \"base64\"));\r\n const payloadNonce = new Uint8Array(Buffer.from(payloadNonceBase64, \"base64\"));\r\n\r\n const payload = sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(\r\n null,\r\n encryptedPayload,\r\n null,\r\n payloadNonce,\r\n dataKey\r\n );\r\n\r\n return payload;\r\n}\r\n\r\n/**\r\n * Seal data key for private signals (allows creator to decrypt via wallet)\r\n * Similar to createSharedSignal but only seals the key, payload is encrypted separately with AES-GCM\r\n */\r\nexport async function sealDataKey(\r\n dataKeyBytes: Uint8Array,\r\n walletTarget: string,\r\n walletCreator: string,\r\n expiresAt: number,\r\n signalId: string,\r\n domain: string,\r\n chainId: number,\r\n signMessage: (message: string) => Promise<string>\r\n): Promise<{\r\n sealedDataKey: string;\r\n sealedNonce: string;\r\n senderEphemeralPublicKey: string;\r\n aadHash: string;\r\n}> {\r\n await getSodium();\r\n\r\n // 1. Generate ephemeral sender keypair\r\n const senderKeypair = sodium.crypto_box_keypair();\r\n\r\n // 2. Derive recipient's public key (for private signals, typically the creator's own wallet)\r\n const recipientKeypair = await deriveKeyPairFromWalletSignature(\r\n walletTarget,\r\n domain,\r\n chainId,\r\n signMessage\r\n );\r\n const recipientPubKey = recipientKeypair.publicKey;\r\n\r\n // 3. Derive shared secret via X25519\r\n const sharedSecret = sodium.crypto_scalarmult(\r\n senderKeypair.privateKey,\r\n recipientPubKey\r\n );\r\n\r\n // 4. Derive wrapping key via HKDF\r\n const salt = `MORSE_SEAL_${signalId}_v1`;\r\n const info = \"wrap_datakey\";\r\n const wrappingKey = await hkdfSha256(sharedSecret, salt, info, 32);\r\n\r\n // 5. Seal data key with AAD\r\n const sealedNonce = sodium.randombytes_buf(sodium.crypto_aead_xchacha20poly1305_ietf_NPUBBYTES);\r\n\r\n // AAD: signalId, walletTarget, walletCreator, expiresAt, cipherVersion, senderEphemeralPubKey\r\n const expiresAtInt = Math.floor(Number(expiresAt));\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const senderEphemeralPubKeyHex = ethers.zeroPadValue(ethers.hexlify(senderKeypair.publicKey), 32);\r\n const aad = abiCoder.encode(\r\n [\"string\", \"address\", \"address\", \"uint64\", \"string\", \"bytes32\"],\r\n [\r\n signalId,\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtInt,\r\n X25519_CIPHER_VERSION,\r\n senderEphemeralPubKeyHex,\r\n ]\r\n );\r\n const aadBytes = ethers.getBytes(aad);\r\n const aadHash = ethers.keccak256(aad).slice(2);\r\n\r\n const sealedDataKey = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(\r\n dataKeyBytes,\r\n aadBytes,\r\n null,\r\n sealedNonce,\r\n wrappingKey\r\n );\r\n\r\n return {\r\n sealedDataKey: Buffer.from(sealedDataKey).toString(\"base64\"),\r\n sealedNonce: Buffer.from(sealedNonce).toString(\"base64\"),\r\n senderEphemeralPublicKey: Buffer.from(senderKeypair.publicKey).toString(\"base64\"),\r\n aadHash,\r\n };\r\n}\r\n\r\n/**\r\n * Generate a random UUID for signal ID\r\n */\r\nexport function generateSignalId(): string {\r\n const bytes = new Uint8Array(16);\r\n globalThis.crypto.getRandomValues(bytes);\r\n const hex = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\r\n return hex.substring(0, 20);\r\n}\r\n\r\n","export interface RateLimitConfig {\r\n maxRequests: number;\r\n windowMs: number;\r\n}\r\n\r\nexport class RateLimiter {\r\n private requests: Map<string, number[]> = new Map();\r\n private maxRequests: number;\r\n private windowMs: number;\r\n\r\n constructor(config: RateLimitConfig) {\r\n this.maxRequests = config.maxRequests;\r\n this.windowMs = config.windowMs;\r\n }\r\n\r\n async checkLimit(identifier: string = \"default\"): Promise<void> {\r\n const now = Date.now();\r\n const requests = this.requests.get(identifier) || [];\r\n\r\n const recentRequests = requests.filter(timestamp => now - timestamp < this.windowMs);\r\n\r\n if (recentRequests.length >= this.maxRequests) {\r\n const oldestRequest = Math.min(...recentRequests);\r\n const waitTime = this.windowMs - (now - oldestRequest);\r\n throw new RateLimitError(\r\n `Rate limit exceeded. Maximum ${this.maxRequests} requests per ${this.windowMs}ms. Retry after ${Math.ceil(waitTime / 1000)}s.`,\r\n waitTime\r\n );\r\n }\r\n\r\n recentRequests.push(now);\r\n this.requests.set(identifier, recentRequests);\r\n\r\n this.cleanup(identifier, now);\r\n }\r\n\r\n private cleanup(identifier: string, now: number): void {\r\n const requests = this.requests.get(identifier);\r\n if (requests) {\r\n const validRequests = requests.filter(timestamp => now - timestamp < this.windowMs);\r\n if (validRequests.length === 0) {\r\n this.requests.delete(identifier);\r\n } else {\r\n this.requests.set(identifier, validRequests);\r\n }\r\n }\r\n }\r\n\r\n reset(identifier: string = \"default\"): void {\r\n this.requests.delete(identifier);\r\n }\r\n\r\n resetAll(): void {\r\n this.requests.clear();\r\n }\r\n\r\n getRemainingRequests(identifier: string = \"default\"): number {\r\n const now = Date.now();\r\n const requests = this.requests.get(identifier) || [];\r\n const recentRequests = requests.filter(timestamp => now - timestamp < this.windowMs);\r\n return Math.max(0, this.maxRequests - recentRequests.length);\r\n }\r\n}\r\n\r\nexport class RateLimitError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly retryAfterMs: number\r\n ) {\r\n super(message);\r\n this.name = \"RateLimitError\";\r\n }\r\n}\r\n\r\n","export class MorseSDKError extends Error {\r\n constructor(message: string, public code?: string, public statusCode?: number) {\r\n super(message);\r\n this.name = \"MorseSDKError\";\r\n Object.setPrototypeOf(this, MorseSDKError.prototype);\r\n }\r\n}\r\n\r\nexport class SignalNotFoundError extends MorseSDKError {\r\n constructor(message: string = \"Signal not found\") {\r\n super(message, \"SIGNAL_NOT_FOUND\", 404);\r\n this.name = \"SignalNotFoundError\";\r\n Object.setPrototypeOf(this, SignalNotFoundError.prototype);\r\n }\r\n}\r\n\r\nexport class SignalExpiredError extends MorseSDKError {\r\n constructor(message: string = \"Signal has expired\") {\r\n super(message, \"SIGNAL_EXPIRED\", 400);\r\n this.name = \"SignalExpiredError\";\r\n Object.setPrototypeOf(this, SignalExpiredError.prototype);\r\n }\r\n}\r\n\r\nexport class SignalAlreadyUsedError extends MorseSDKError {\r\n constructor(message: string = \"Signal has already been used\") {\r\n super(message, \"SIGNAL_ALREADY_USED\", 400);\r\n this.name = \"SignalAlreadyUsedError\";\r\n Object.setPrototypeOf(this, SignalAlreadyUsedError.prototype);\r\n }\r\n}\r\n\r\nexport class WalletNotAllowedError extends MorseSDKError {\r\n constructor(message: string = \"Wallet not allowed to access this signal\") {\r\n super(message, \"WALLET_NOT_ALLOWED\", 401);\r\n this.name = \"WalletNotAllowedError\";\r\n Object.setPrototypeOf(this, WalletNotAllowedError.prototype);\r\n }\r\n}\r\n\r\nexport class ValidationError extends MorseSDKError {\r\n constructor(message: string = \"Validation error\") {\r\n super(message, \"VALIDATION_ERROR\", 400);\r\n this.name = \"ValidationError\";\r\n Object.setPrototypeOf(this, ValidationError.prototype);\r\n }\r\n}\r\n\r\nexport class NetworkError extends MorseSDKError {\r\n constructor(message: string = \"Network error\", public originalError?: Error) {\r\n super(message, \"NETWORK_ERROR\", 0);\r\n this.name = \"NetworkError\";\r\n Object.setPrototypeOf(this, NetworkError.prototype);\r\n }\r\n}\r\n\r\nexport { RateLimitError } from \"./rate-limiter\";\r\n\r\nexport function mapErrorResponse(error: any): MorseSDKError {\r\n if (error.code) {\r\n switch (error.code) {\r\n case \"SIGNAL_NOT_FOUND\":\r\n return new SignalNotFoundError(error.message);\r\n case \"SIGNAL_EXPIRED\":\r\n return new SignalExpiredError(error.message);\r\n case \"SIGNAL_ALREADY_USED\":\r\n return new SignalAlreadyUsedError(error.message);\r\n case \"WALLET_NOT_ALLOWED\":\r\n return new WalletNotAllowedError(error.message);\r\n case \"VALIDATION_ERROR\":\r\n return new ValidationError(error.message);\r\n default:\r\n return new MorseSDKError(error.message || \"Unknown error\", error.code);\r\n }\r\n }\r\n return new MorseSDKError(error.message || \"Unknown error\");\r\n}\r\n\r\n","export type LogLevel = \"none\" | \"error\" | \"warn\" | \"info\" | \"debug\";\r\n\r\nclass Logger {\r\n private level: LogLevel = \"warn\";\r\n private levels: Record<LogLevel, number> = {\r\n none: 0,\r\n error: 1,\r\n warn: 2,\r\n info: 3,\r\n debug: 4,\r\n };\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n getLevel(): LogLevel {\r\n return this.level;\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return this.levels[level] <= this.levels[this.level];\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"error\")) {\r\n console.error(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"warn\")) {\r\n console.warn(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"info\")) {\r\n console.info(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (this.shouldLog(\"debug\")) {\r\n console.debug(`[MorseSDK] ${message}`, ...args);\r\n }\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n\r\n","const CIPHER_VERSION = \"aes-gcm-256-v1\";\r\n\r\nfunction getCrypto(): Crypto {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\r\n return globalThis.crypto;\r\n }\r\n if (typeof window !== 'undefined' && window.crypto) {\r\n return window.crypto;\r\n }\r\n throw new Error('Web Crypto API is not available. Requires Node.js 15+ or a browser with Web Crypto support.');\r\n}\r\n\r\nfunction toBase64(data: Uint8Array | ArrayBuffer): string {\r\n const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;\r\n if (typeof Buffer !== 'undefined') {\r\n return Buffer.from(bytes).toString('base64');\r\n }\r\n if (typeof btoa !== 'undefined') {\r\n return btoa(String.fromCharCode(...bytes));\r\n }\r\n throw new Error('Base64 encoding not available. Requires Node.js Buffer or browser btoa.');\r\n}\r\n\r\nfunction fromBase64(base64: string): Uint8Array {\r\n if (typeof Buffer !== 'undefined') {\r\n return Uint8Array.from(Buffer.from(base64, 'base64'));\r\n }\r\n if (typeof atob !== 'undefined') {\r\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\r\n }\r\n throw new Error('Base64 decoding not available. Requires Node.js Buffer or browser atob.');\r\n}\r\n\r\nexport function getCipherVersion(): string {\r\n return CIPHER_VERSION;\r\n}\r\n\r\nexport async function generateKey(): Promise<CryptoKey> {\r\n const crypto = getCrypto();\r\n if (!crypto.subtle) {\r\n throw new Error('Web Crypto API (crypto.subtle) is not available.');\r\n }\r\n return crypto.subtle.generateKey(\r\n {\r\n name: \"AES-GCM\",\r\n length: 256,\r\n },\r\n true,\r\n [\"encrypt\", \"decrypt\"]\r\n );\r\n}\r\n\r\nexport async function exportKey(key: CryptoKey): Promise<string> {\r\n const crypto = getCrypto();\r\n const exported = await crypto.subtle.exportKey(\"raw\", key);\r\n const keyArray = new Uint8Array(exported);\r\n return toBase64(keyArray);\r\n}\r\n\r\nexport async function importKey(keyBase64: string): Promise<CryptoKey> {\r\n const crypto = getCrypto();\r\n const keyArray = fromBase64(keyBase64);\r\n const keyBuffer = keyArray.buffer.slice(keyArray.byteOffset, keyArray.byteOffset + keyArray.byteLength) as ArrayBuffer;\r\n return crypto.subtle.importKey(\r\n \"raw\",\r\n keyBuffer,\r\n {\r\n name: \"AES-GCM\",\r\n length: 256,\r\n },\r\n true,\r\n [\"encrypt\", \"decrypt\"]\r\n );\r\n}\r\n\r\nfunction generateIV(): Uint8Array {\r\n const crypto = getCrypto();\r\n return crypto.getRandomValues(new Uint8Array(12));\r\n}\r\n\r\nexport async function encryptText(\r\n text: string,\r\n key: CryptoKey\r\n): Promise<{ encrypted: string; iv: string }> {\r\n const crypto = getCrypto();\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(text);\r\n const iv = generateIV();\r\n const ivArray = new Uint8Array(iv);\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivArray,\r\n },\r\n key,\r\n data\r\n );\r\n\r\n return {\r\n encrypted: toBase64(new Uint8Array(encrypted)),\r\n iv: toBase64(iv),\r\n };\r\n}\r\n\r\nexport async function decryptText(\r\n encryptedBase64: string,\r\n ivBase64: string,\r\n key: CryptoKey\r\n): Promise<string> {\r\n const crypto = getCrypto();\r\n const encrypted = fromBase64(encryptedBase64);\r\n const iv = fromBase64(ivBase64);\r\n\r\n const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength) as ArrayBuffer;\r\n const encryptedBuffer = encrypted.buffer.slice(encrypted.byteOffset, encrypted.byteOffset + encrypted.byteLength) as ArrayBuffer;\r\n\r\n const decrypted = await crypto.subtle.decrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivBuffer,\r\n },\r\n key,\r\n encryptedBuffer\r\n );\r\n\r\n const decoder = new TextDecoder();\r\n return decoder.decode(decrypted);\r\n}\r\n\r\nexport async function encryptFile(\r\n fileData: ArrayBuffer | Uint8Array | Buffer,\r\n key: CryptoKey\r\n): Promise<{ encrypted: ArrayBuffer; iv: string }> {\r\n const crypto = getCrypto();\r\n let data: ArrayBuffer;\r\n if (fileData instanceof Buffer) {\r\n data = fileData.buffer.slice(fileData.byteOffset, fileData.byteOffset + fileData.byteLength) as ArrayBuffer;\r\n } else if (fileData instanceof Uint8Array) {\r\n data = fileData.buffer.slice(fileData.byteOffset, fileData.byteOffset + fileData.byteLength) as ArrayBuffer;\r\n } else {\r\n data = fileData;\r\n }\r\n const iv = generateIV();\r\n const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength) as ArrayBuffer;\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivBuffer,\r\n },\r\n key,\r\n data\r\n );\r\n\r\n return {\r\n encrypted,\r\n iv: toBase64(iv),\r\n };\r\n}\r\n\r\nexport async function decryptFile(\r\n encryptedData: ArrayBuffer,\r\n ivBase64: string,\r\n key: CryptoKey\r\n): Promise<ArrayBuffer> {\r\n const crypto = getCrypto();\r\n const iv = fromBase64(ivBase64);\r\n\r\n if (iv.length !== 12) {\r\n throw new Error(`Invalid IV length: ${iv.length} bytes. Expected 12 bytes for AES-GCM.`);\r\n }\r\n\r\n const ivBuffer = iv.buffer.slice(iv.byteOffset, iv.byteOffset + iv.byteLength) as ArrayBuffer;\r\n const dataBuffer = encryptedData as ArrayBuffer;\r\n\r\n const decrypted = await crypto.subtle.decrypt(\r\n {\r\n name: \"AES-GCM\",\r\n iv: ivBuffer,\r\n },\r\n key,\r\n dataBuffer\r\n );\r\n\r\n return decrypted;\r\n}\r\n\r\nexport async function deriveKeyFromWallet(\r\n walletAddress: string,\r\n salt?: Uint8Array\r\n): Promise<CryptoKey> {\r\n const crypto = getCrypto();\r\n\r\n const normalizedAddress = walletAddress.toLowerCase();\r\n\r\n const defaultSalt = new TextEncoder().encode(\"MORSE_KEY_DERIVATION_v1\");\r\n const finalSalt = salt ? new Uint8Array(salt) : defaultSalt;\r\n\r\n const addressBytes = new TextEncoder().encode(normalizedAddress);\r\n const keyMaterial = await crypto.subtle.importKey(\r\n \"raw\",\r\n addressBytes.buffer.slice(addressBytes.byteOffset, addressBytes.byteOffset + addressBytes.byteLength) as ArrayBuffer,\r\n \"PBKDF2\",\r\n false,\r\n [\"deriveKey\"]\r\n );\r\n\r\n const saltBuffer = finalSalt.buffer.slice(finalSalt.byteOffset, finalSalt.byteOffset + finalSalt.byteLength) as ArrayBuffer;\r\n\r\n const derivedKey = await crypto.subtle.deriveKey(\r\n {\r\n name: \"PBKDF2\",\r\n salt: saltBuffer,\r\n iterations: 100000,\r\n hash: \"SHA-256\",\r\n },\r\n keyMaterial,\r\n {\r\n name: \"AES-GCM\",\r\n length: 256,\r\n },\r\n true,\r\n [\"encrypt\", \"decrypt\"]\r\n );\r\n\r\n return derivedKey;\r\n}\r\n\r\nexport function generateShareableLink(\r\n baseUrl: string,\r\n signalId: string,\r\n keyBase64?: string\r\n): string {\r\n // Security: Don't include key in URL fragment\r\n // Key should be distributed separately through a secure channel\r\n return `${baseUrl}/view/${signalId}`;\r\n}\r\n\r\n","import type { MorseContractV1 } from \"../../contracts/v1/MorseContractV1\";\r\nimport type {\r\n CreateSignalOptions,\r\n CreateSignalOptionsEncrypted,\r\n CreateSignalResponse,\r\n CreateSignalResponseEncrypted,\r\n OpenSignalResponse,\r\n OpenSignalResponseDecrypted,\r\n ListMySignalsResponse,\r\n UploadFileOptions,\r\n UploadFileResponse,\r\n DownloadFileResponse,\r\n WalletAuth,\r\n SignalErrorResponse,\r\n MorseSDKConfig,\r\n} from \"../../types\";\r\nimport { mapErrorResponse, NetworkError } from \"../../errors\";\r\nimport { logger } from \"../../logger\";\r\nimport { RateLimiter, RateLimitError } from \"../../rate-limiter\";\r\nimport {\r\n generateKey,\r\n exportKey,\r\n importKey,\r\n encryptText,\r\n encryptFile,\r\n decryptText,\r\n decryptFile,\r\n getCipherVersion,\r\n generateShareableLink,\r\n} from \"../../crypto\";\r\nimport {\r\n createSharedSignal,\r\n verifyKeyCertificate,\r\n generateSignalId,\r\n sealDataKey,\r\n type MorseKeyCert,\r\n} from \"../../crypto-x25519\";\r\nimport { WalletKeyService } from \"../../wallet-key-service\";\r\nimport { validateSignalId, validateWalletAddress } from \"../../utils\";\r\n\r\nconst API_BASE_URL = \"https://api.morseai.tech\";\r\nconst FRONTEND_BASE_URL = \"https://morseai.tech\";\r\n\r\nexport class MorseSDKV1 implements MorseContractV1 {\r\n readonly version = \"v1\" as const;\r\n\r\n private config: MorseSDKConfig;\r\n private timeout: number;\r\n private retries: number;\r\n private retryDelay: number;\r\n private rateLimiter: RateLimiter | null = null;\r\n\r\n constructor(config: MorseSDKConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"apiKey is required. Please provide an API key in the SDK configuration.\");\r\n }\r\n\r\n if (!config.apiKey.startsWith(\"sk_\")) {\r\n throw new Error(\"Invalid API key format. API key must start with 'sk_'\");\r\n }\r\n\r\n this.config = config;\r\n this.timeout = config.timeout || 30000;\r\n this.retries = config.retries || 0;\r\n this.retryDelay = config.retryDelay || 1000;\r\n\r\n if (config.rateLimit?.enabled !== false) {\r\n const maxRequests = config.rateLimit?.maxRequests || 100;\r\n const windowMs = config.rateLimit?.windowMs || 60000;\r\n this.rateLimiter = new RateLimiter({ maxRequests, windowMs });\r\n }\r\n\r\n logger.debug(\"MorseSDKV1 initialized\", {\r\n apiVersion: config.apiVersion || \"v1\",\r\n timeout: this.timeout,\r\n retries: this.retries,\r\n rateLimitEnabled: this.rateLimiter !== null,\r\n hasApiKey: !!config.apiKey,\r\n });\r\n }\r\n\r\n private base64ToUint8Array(base64: string): Uint8Array {\r\n if (typeof Buffer !== 'undefined') {\r\n return Uint8Array.from(Buffer.from(base64, 'base64'));\r\n }\r\n if (typeof atob !== 'undefined') {\r\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\r\n }\r\n throw new Error('Base64 decoding not available. Requires Node.js Buffer or browser atob.');\r\n }\r\n\r\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\r\n const bytes = new Uint8Array(buffer);\r\n if (typeof Buffer !== 'undefined') {\r\n return Buffer.from(bytes).toString('base64');\r\n }\r\n if (typeof btoa !== 'undefined') {\r\n return btoa(String.fromCharCode(...bytes));\r\n }\r\n throw new Error('Base64 encoding not available. Requires Node.js Buffer or browser btoa.');\r\n }\r\n\r\n private sanitizeRequestOptions(options: RequestInit): RequestInit {\r\n const sanitized = { ...options };\r\n\r\n if (sanitized.body) {\r\n try {\r\n const body = JSON.parse(sanitized.body as string);\r\n const sanitizedBody: any = {};\r\n\r\n if (body.wallet) {\r\n sanitizedBody.wallet = {\r\n address: body.wallet.address,\r\n signature: '[REDACTED]',\r\n message: body.wallet.message,\r\n };\r\n }\r\n\r\n if (body.encryptedText) {\r\n sanitizedBody.encryptedText = '[REDACTED]';\r\n }\r\n\r\n if (body.payloadNonce) {\r\n sanitizedBody.payloadNonce = '[REDACTED]';\r\n }\r\n\r\n if (body.sealedDataKey) {\r\n sanitizedBody.sealedDataKey = '[REDACTED]';\r\n }\r\n\r\n if (body.file) {\r\n sanitizedBody.file = {\r\n ...body.file,\r\n payloadNonce: body.file.payloadNonce ? '[REDACTED]' : null,\r\n sealedDataKey: body.file.sealedDataKey ? '[REDACTED]' : null,\r\n };\r\n }\r\n\r\n if (body.signalId) {\r\n sanitizedBody.signalId = body.signalId;\r\n }\r\n\r\n sanitized.body = JSON.stringify(sanitizedBody);\r\n } catch {\r\n sanitized.body = '[REDACTED - non-JSON body]';\r\n }\r\n }\r\n\r\n return sanitized;\r\n }\r\n\r\n private getApiUrl(path: string): string {\r\n const version = this.config.apiVersion || \"v1\";\r\n return `${API_BASE_URL}/${version}${path}`;\r\n }\r\n\r\n private async createAuthMessage(action: string, context: string = \"\"): Promise<string> {\r\n const timestamp = Date.now();\r\n if (context) {\r\n return `MORSE: ${action} ${context} at ${timestamp}`;\r\n }\r\n return `MORSE: ${action} at ${timestamp}`;\r\n }\r\n\r\n private async signMessage(wallet: WalletAuth, message: string): Promise<string> {\r\n return await wallet.signMessage(message);\r\n }\r\n\r\n private async makeRequest<T>(\r\n url: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n if (this.rateLimiter) {\r\n try {\r\n await this.rateLimiter.checkLimit();\r\n } catch (error) {\r\n if (error instanceof RateLimitError) {\r\n logger.warn(\"Rate limit exceeded\", {\r\n url,\r\n retryAfterMs: error.retryAfterMs\r\n });\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n throw error;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n logger.debug(\"Making request\", {\r\n url,\r\n method: options.method || \"GET\",\r\n hasBody: !!options.body,\r\n });\r\n\r\n const requestOptions: RequestInit = {\r\n ...options,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n ...options.headers,\r\n },\r\n };\r\n\r\n if (this.config.onRequest) {\r\n const sanitizedOptions = this.sanitizeRequestOptions(requestOptions);\r\n this.config.onRequest(url, sanitizedOptions);\r\n }\r\n\r\n let lastError: Error | null = null;\r\n\r\n for (let attempt = 0; attempt <= this.retries; attempt++) {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n const response = await fetch(url, {\r\n ...requestOptions,\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (this.config.onResponse) {\r\n this.config.onResponse(url, response);\r\n }\r\n\r\n if (!response.ok) {\r\n const error: SignalErrorResponse = await response.json().catch(() => ({\r\n status: \"error\" as const,\r\n code: \"VALIDATION_ERROR\" as const,\r\n message: `HTTP ${response.status}: ${response.statusText}`,\r\n }));\r\n\r\n logger.error(\"Request failed\", {\r\n status: response.status,\r\n code: error.code,\r\n message: error.message,\r\n attempt: attempt + 1,\r\n });\r\n\r\n const mappedError = mapErrorResponse(error);\r\n\r\n if (this.config.onError) {\r\n this.config.onError(mappedError);\r\n }\r\n\r\n throw mappedError;\r\n }\r\n\r\n const data = await response.json();\r\n logger.debug(\"Request successful\", { url, attempt: attempt + 1 });\r\n return data;\r\n } catch (error: any) {\r\n lastError = error;\r\n\r\n if (error.name === \"AbortError\") {\r\n const timeoutError = new NetworkError(`Request timeout after ${this.timeout}ms`, error);\r\n if (this.config.onError) {\r\n this.config.onError(timeoutError);\r\n }\r\n throw timeoutError;\r\n }\r\n\r\n if (error instanceof NetworkError || error.name?.includes(\"Error\")) {\r\n if (attempt < this.retries) {\r\n logger.warn(`Request failed, retrying... (${attempt + 1}/${this.retries})`, { url });\r\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * (attempt + 1)));\r\n continue;\r\n }\r\n\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n throw error;\r\n }\r\n\r\n if (error.message?.includes(\"fetch\") || error.message?.includes(\"network\")) {\r\n if (attempt < this.retries) {\r\n logger.warn(`Network error, retrying... (${attempt + 1}/${this.retries})`, { url });\r\n await new Promise(resolve => setTimeout(resolve, this.retryDelay * (attempt + 1)));\r\n continue;\r\n }\r\n\r\n const networkError = new NetworkError(\"Network request failed\", error);\r\n if (this.config.onError) {\r\n this.config.onError(networkError);\r\n }\r\n throw networkError;\r\n }\r\n\r\n if (this.config.onError) {\r\n this.config.onError(error);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n if (lastError) {\r\n if (this.config.onError) {\r\n this.config.onError(lastError);\r\n }\r\n throw lastError;\r\n }\r\n\r\n throw new NetworkError(\"Request failed after all retries\");\r\n }\r\n\r\n async createSignal(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptions\r\n ): Promise<CreateSignalResponse> {\r\n validateWalletAddress(wallet.address);\r\n\r\n if (options.walletTarget) {\r\n validateWalletAddress(options.walletTarget);\r\n }\r\n\r\n if (options.shareWithRecipient && !options.walletTarget) {\r\n throw new Error(\"walletTarget is required when shareWithRecipient is true\");\r\n }\r\n\r\n if (!options.hasFile && !options.hasMessage) {\r\n throw new Error(\"Either hasFile or hasMessage must be true\");\r\n }\r\n\r\n logger.info(\"Creating signal\", {\r\n hasFile: options.hasFile,\r\n hasMessage: options.hasMessage,\r\n mode: options.mode,\r\n });\r\n\r\n const tempSignalId = \"temp-\" + Date.now();\r\n const authMessage = await this.createAuthMessage(\"create\", `signal ${tempSignalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n ...options,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n const result = await this.makeRequest<CreateSignalResponse>(\r\n this.getApiUrl(\"/signals\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n\r\n logger.info(\"Signal created\", { signalId: result.signalId });\r\n return result;\r\n }\r\n\r\n async openSignal(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<OpenSignalResponse> {\r\n validateSignalId(signalId);\r\n validateWalletAddress(wallet.address);\r\n\r\n logger.info(\"Opening signal\", { signalId });\r\n\r\n const authMessage = await this.createAuthMessage(\"open\", `signal ${signalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n signalId,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n const result = await this.makeRequest<OpenSignalResponse>(\r\n this.getApiUrl(\"/signals/open\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n\r\n logger.info(\"Signal opened\", { signalId, hasFile: !!result.file });\r\n return result;\r\n }\r\n\r\n async openSignalDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64?: string\r\n ): Promise<OpenSignalResponseDecrypted> {\r\n validateSignalId(signalId);\r\n validateWalletAddress(wallet.address);\r\n\r\n const encryptedResponse = await this.openSignal(wallet, signalId);\r\n\r\n // Check if this is an X25519 signal\r\n const isX25519Signal = Boolean(\r\n encryptedResponse.sealedDataKey &&\r\n encryptedResponse.sealedNonce &&\r\n encryptedResponse.senderEphemeralPublicKey\r\n );\r\n\r\n let message: string | null = null;\r\n let fileData: ArrayBuffer | null = null;\r\n let keySource: \"derived\" | \"provided\" = \"derived\";\r\n\r\n if (isX25519Signal) {\r\n // X25519 signal - decrypt using wallet\r\n const { openSharedSignal } = await import(\"../../crypto-x25519\");\r\n\r\n const walletTarget = encryptedResponse.walletTarget || wallet.address;\r\n const walletCreator = encryptedResponse.walletCreator || wallet.address;\r\n const expiresAtMs = new Date(encryptedResponse.expiresAt).getTime();\r\n\r\n // Fetch domain and chainId from the recipient's certificate\r\n const keyService = new WalletKeyService(API_BASE_URL, this.config.apiKey, this.config.apiVersion || \"v1\");\r\n const certResponse = await keyService.getPublicKey(wallet.address);\r\n\r\n const domain = certResponse.certificate?.domain || \"morseai.tech\";\r\n const chainId = certResponse.certificate?.chainId || 1;\r\n\r\n if (encryptedResponse.encryptedText && encryptedResponse.payloadNonce) {\r\n const decryptedBytes = await openSharedSignal(\r\n encryptedResponse.encryptedText,\r\n encryptedResponse.payloadNonce,\r\n encryptedResponse.sealedDataKey!,\r\n encryptedResponse.sealedNonce!,\r\n encryptedResponse.senderEphemeralPublicKey!,\r\n signalId,\r\n walletTarget,\r\n walletCreator,\r\n expiresAtMs,\r\n encryptedResponse.aadHash || \"\",\r\n wallet.address,\r\n domain,\r\n chainId,\r\n wallet.signMessage\r\n );\r\n message = new TextDecoder().decode(decryptedBytes);\r\n }\r\n\r\n // Handle X25519 file decryption\r\n if (encryptedResponse.file) {\r\n const fileResponse = await this.downloadFile(wallet, signalId);\r\n const encryptedFileBase64 = fileResponse.file;\r\n\r\n // Use file-specific sealed key data if available, otherwise fall back to signal-level data\r\n const fileSealedDataKey = encryptedResponse.file.sealedDataKey || encryptedResponse.sealedDataKey;\r\n const fileSealedNonce = encryptedResponse.file.sealedNonce || encryptedResponse.sealedNonce;\r\n const fileSenderEphemeralPublicKey = encryptedResponse.file.senderEphemeralPublicKey || encryptedResponse.senderEphemeralPublicKey;\r\n const fileAadHash = encryptedResponse.file.aadHash || encryptedResponse.aadHash || \"\";\r\n\r\n if (fileSealedDataKey && fileSealedNonce && fileSenderEphemeralPublicKey && encryptedResponse.file.payloadNonce) {\r\n // File is encrypted with X25519\r\n const decryptedFileBytes = await openSharedSignal(\r\n encryptedFileBase64,\r\n encryptedResponse.file.payloadNonce,\r\n fileSealedDataKey,\r\n fileSealedNonce,\r\n fileSenderEphemeralPublicKey,\r\n `${signalId}-file`, // Use hyphen like frontend\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtMs,\r\n fileAadHash,\r\n wallet.address,\r\n domain,\r\n chainId,\r\n wallet.signMessage\r\n );\r\n fileData = decryptedFileBytes.buffer.slice(\r\n decryptedFileBytes.byteOffset,\r\n decryptedFileBytes.byteOffset + decryptedFileBytes.byteLength\r\n ) as ArrayBuffer;\r\n } else {\r\n // File is encrypted with AES-GCM (legacy or private signal)\r\n // This shouldn't happen for X25519 signals, but handle it gracefully\r\n throw new Error(\"File encryption format not supported for this signal type\");\r\n }\r\n }\r\n\r\n keySource = \"derived\";\r\n } else {\r\n // AES-GCM signal - decrypt using provided key\r\n if (!keyBase64 || typeof keyBase64 !== 'string' || keyBase64.length < 32) {\r\n throw new Error(\"This signal requires an encryption key. Please provide the key from the URL fragment (#k=...).\");\r\n }\r\n\r\n const key = await importKey(keyBase64);\r\n\r\n if (encryptedResponse.encryptedText && encryptedResponse.payloadNonce) {\r\n message = await decryptText(encryptedResponse.encryptedText, encryptedResponse.payloadNonce, key);\r\n }\r\n\r\n if (encryptedResponse.file) {\r\n const fileResponse = await this.downloadFile(wallet, signalId);\r\n const encryptedFileData = this.base64ToUint8Array(fileResponse.file);\r\n const buffer = encryptedFileData.buffer.slice(\r\n encryptedFileData.byteOffset,\r\n encryptedFileData.byteOffset + encryptedFileData.byteLength\r\n ) as ArrayBuffer;\r\n fileData = await decryptFile(buffer, encryptedResponse.file.payloadNonce, key);\r\n }\r\n\r\n keySource = \"provided\";\r\n }\r\n\r\n return {\r\n message,\r\n file: encryptedResponse.file && fileData\r\n ? {\r\n data: fileData,\r\n originalName: encryptedResponse.file.originalName,\r\n mimeType: encryptedResponse.file.mimeType,\r\n sizeBytes: encryptedResponse.file.sizeBytes,\r\n }\r\n : null,\r\n expiresAt: encryptedResponse.expiresAt,\r\n onChainNotification: encryptedResponse.onChainNotification,\r\n keySource,\r\n };\r\n }\r\n\r\n async listMySignals(wallet: WalletAuth): Promise<ListMySignalsResponse> {\r\n const authMessage = await this.createAuthMessage(\"view\", \"vault\");\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const params = new URLSearchParams({\r\n walletAddress: wallet.address,\r\n walletSignature: signature,\r\n walletMessage: authMessage,\r\n });\r\n\r\n return this.makeRequest<ListMySignalsResponse>(\r\n `${this.getApiUrl(\"/signals/my-signals\")}?${params.toString()}`,\r\n {\r\n method: \"GET\",\r\n }\r\n );\r\n }\r\n\r\n async uploadFile(\r\n wallet: WalletAuth,\r\n options: UploadFileOptions\r\n ): Promise<UploadFileResponse> {\r\n const authMessage = await this.createAuthMessage(\"upload\", \"file\");\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n ...options,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n return this.makeRequest<UploadFileResponse>(\r\n this.getApiUrl(\"/files/upload\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n }\r\n\r\n async downloadFile(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<DownloadFileResponse> {\r\n const authMessage = await this.createAuthMessage(\"download\", `file ${signalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n signalId,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n return this.makeRequest<DownloadFileResponse>(\r\n this.getApiUrl(\"/files/download\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n }\r\n\r\n async downloadFileDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64: string\r\n ): Promise<{ data: ArrayBuffer; originalName: string; mimeType: string; sizeBytes: number }> {\r\n const encryptedResponse = await this.openSignal(wallet, signalId);\r\n\r\n if (!encryptedResponse.file) {\r\n throw new Error(\"Signal does not have a file\");\r\n }\r\n\r\n const fileResponse = await this.downloadFile(wallet, signalId);\r\n const key = await importKey(keyBase64);\r\n const encryptedFileData = this.base64ToUint8Array(fileResponse.file);\r\n const buffer = encryptedFileData.buffer.slice(\r\n encryptedFileData.byteOffset,\r\n encryptedFileData.byteOffset + encryptedFileData.byteLength\r\n ) as ArrayBuffer;\r\n const decryptedData = await decryptFile(buffer, encryptedResponse.file.payloadNonce, key);\r\n\r\n return {\r\n data: decryptedData,\r\n originalName: fileResponse.originalName,\r\n mimeType: fileResponse.mimeType,\r\n sizeBytes: fileResponse.sizeBytes,\r\n };\r\n }\r\n\r\n async createSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n validateWalletAddress(wallet.address);\r\n\r\n // SECURITY: shareWithRecipient is determined by mode - cannot be overridden\r\n const shareWithRecipient = options.mode === \"shared_wallet\";\r\n\r\n // Validate mode consistency\r\n if (options.mode === \"shared_wallet\" && !options.walletTarget) {\r\n throw new Error(\"walletTarget is required when mode is 'shared_wallet'\");\r\n }\r\n\r\n if (options.walletTarget) {\r\n validateWalletAddress(options.walletTarget);\r\n }\r\n\r\n if (!options.message && !options.file) {\r\n throw new Error(\"Either message or file must be provided\");\r\n }\r\n\r\n // Validate expiration - either expiresIn or expiresAt must be provided\r\n if (!options.expiresIn && !options.expiresAt) {\r\n throw new Error(\r\n \"Either expiresIn or expiresAt must be provided.\\n\" +\r\n \" - expiresIn: relative time (e.g., '24h', '7d', '1h')\\n\" +\r\n \" - expiresAt: specific date (ISO 8601, e.g., '2026-12-31T23:59:59.000Z')\"\r\n );\r\n }\r\n\r\n if (options.expiresIn && options.expiresAt) {\r\n throw new Error(\"Cannot provide both expiresIn and expiresAt. Use only one.\");\r\n }\r\n\r\n // Merge shareWithRecipient (determined by mode) into options\r\n const mergedOptions: CreateSignalOptionsEncrypted & { shareWithRecipient: boolean } = {\r\n ...options,\r\n shareWithRecipient,\r\n };\r\n\r\n // For shared signals, use X25519 encryption\r\n if (shareWithRecipient && options.walletTarget) {\r\n return this.createSharedSignalEncrypted(wallet, mergedOptions);\r\n }\r\n\r\n // For private signals, use simple AES-GCM with key in URL\r\n return this.createPrivateSignalEncrypted(wallet, mergedOptions);\r\n }\r\n\r\n private async createPrivateSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted & { shareWithRecipient: boolean }\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n const key = await generateKey();\r\n const keyBase64 = await exportKey(key);\r\n\r\n // Generate signal ID first (needed for sealed key)\r\n const signalId = options.signalId || generateSignalId();\r\n\r\n // Calculate expiration\r\n let expiresAtMs: number;\r\n if (options.expiresAt) {\r\n expiresAtMs = new Date(options.expiresAt).getTime();\r\n } else if (options.expiresIn) {\r\n const match = options.expiresIn.match(/^(\\d+)([smhd])$/);\r\n if (!match) throw new Error(\"Invalid expiresIn format\");\r\n const value = parseInt(match[1], 10);\r\n const unit = match[2];\r\n const multipliers: Record<string, number> = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\r\n expiresAtMs = Date.now() + value * multipliers[unit];\r\n } else {\r\n expiresAtMs = Date.now() + 24 * 60 * 60 * 1000; // Default 24h\r\n }\r\n\r\n // Seal the data key for wallet-based decryption (creator can access via wallet)\r\n const walletTarget = wallet.address; // For private signals, creator seals for themselves\r\n const walletCreator = wallet.address;\r\n // Use provided domain/chainId or defaults\r\n const domain = options.domain || \"morseai.tech\";\r\n const chainId = options.chainId ?? 8453; // Default to Base network\r\n\r\n const keyBytes = this.base64ToUint8Array(keyBase64);\r\n const sealedBox = await sealDataKey(\r\n keyBytes,\r\n walletTarget.toLowerCase(),\r\n walletCreator.toLowerCase(),\r\n expiresAtMs,\r\n signalId,\r\n domain,\r\n chainId,\r\n wallet.signMessage\r\n );\r\n\r\n let encryptedText: string | undefined;\r\n let payloadNonce: string | undefined;\r\n let fileOptions: CreateSignalOptions[\"file\"] | undefined;\r\n\r\n if (options.message) {\r\n const encrypted = await encryptText(options.message, key);\r\n encryptedText = encrypted.encrypted;\r\n payloadNonce = encrypted.iv;\r\n }\r\n\r\n if (options.file) {\r\n const uploadResult = await this.uploadFileEncrypted(\r\n wallet,\r\n options.file.data,\r\n options.file.originalName,\r\n options.file.mimeType,\r\n key\r\n );\r\n\r\n const encrypted = await encryptFile(options.file.data, key);\r\n\r\n fileOptions = {\r\n storagePath: uploadResult.storagePath,\r\n payloadNonce: encrypted.iv,\r\n originalName: options.file.originalName,\r\n mimeType: options.file.mimeType,\r\n sizeBytes: uploadResult.sizeBytes,\r\n };\r\n }\r\n\r\n const signalOptions: CreateSignalOptions = {\r\n signalId,\r\n walletTarget: options.walletTarget,\r\n shareWithRecipient: options.shareWithRecipient,\r\n mode: options.mode,\r\n hasFile: !!options.file,\r\n hasMessage: !!options.message,\r\n cipherVersion: getCipherVersion(),\r\n encryptedText,\r\n payloadNonce,\r\n sealedDataKey: sealedBox.sealedDataKey,\r\n sealedNonce: sealedBox.sealedNonce,\r\n senderEphemeralPublicKey: sealedBox.senderEphemeralPublicKey,\r\n aadHash: sealedBox.aadHash,\r\n file: fileOptions,\r\n onChainNotification: options.onChainNotification,\r\n expiresAt: new Date(expiresAtMs).toISOString(),\r\n };\r\n\r\n const result = await this.createSignal(wallet, signalOptions);\r\n const shareableLink = generateShareableLink(FRONTEND_BASE_URL, result.signalId);\r\n\r\n return {\r\n ...result,\r\n shareableLink,\r\n };\r\n }\r\n\r\n private async createSharedSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted & { shareWithRecipient: boolean }\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n const walletTarget = options.walletTarget!;\r\n const walletCreator = wallet.address;\r\n\r\n const signalId = options.signalId || generateSignalId();\r\n\r\n let expiresAtMs: number;\r\n if (options.expiresAt) {\r\n expiresAtMs = new Date(options.expiresAt).getTime();\r\n } else if (options.expiresIn) {\r\n const match = options.expiresIn.match(/^(\\d+)([smhd])$/);\r\n if (!match) throw new Error(\"Invalid expiresIn format\");\r\n const value = parseInt(match[1], 10);\r\n const unit = match[2];\r\n const multipliers: Record<string, number> = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\r\n expiresAtMs = Date.now() + value * multipliers[unit];\r\n } else {\r\n expiresAtMs = Date.now() + 24 * 60 * 60 * 1000; // Default 24h\r\n }\r\n\r\n const keyService = new WalletKeyService(API_BASE_URL, this.config.apiKey, this.config.apiVersion || \"v1\");\r\n const recipientKeyResponse = await keyService.getPublicKey(walletTarget);\r\n\r\n if (!recipientKeyResponse.exists || !recipientKeyResponse.certificate) {\r\n throw new Error(\r\n `Public key not found for recipient ${walletTarget}. ` +\r\n `The recipient needs to publish their public key first. ` +\r\n `They can do this by opening any shared signal sent to them, or visiting the app.`\r\n );\r\n }\r\n\r\n if (!verifyKeyCertificate(recipientKeyResponse.certificate)) {\r\n throw new Error(\"Recipient's key certificate signature verification failed\");\r\n }\r\n\r\n if (Date.now() > recipientKeyResponse.certificate.expiresAt) {\r\n throw new Error(\"Recipient's key certificate has expired\");\r\n }\r\n\r\n const recipientPubKey = Buffer.from(recipientKeyResponse.certificate.x25519PublicKey, \"base64\");\r\n\r\n let payloadText = \"\";\r\n if (options.message) {\r\n payloadText = options.message;\r\n }\r\n const payloadBytes = new TextEncoder().encode(payloadText);\r\n\r\n const sealedResult = await createSharedSignal(\r\n payloadBytes,\r\n new Uint8Array(recipientPubKey),\r\n walletTarget,\r\n walletCreator,\r\n expiresAtMs,\r\n signalId\r\n );\r\n\r\n let fileOptions: CreateSignalOptions[\"file\"] | undefined;\r\n\r\n if (options.file) {\r\n const fileBytes = options.file.data instanceof ArrayBuffer\r\n ? new Uint8Array(options.file.data)\r\n : new Uint8Array(options.file.data);\r\n\r\n const fileSealedResult = await createSharedSignal(\r\n fileBytes,\r\n new Uint8Array(recipientPubKey),\r\n walletTarget,\r\n walletCreator,\r\n expiresAtMs,\r\n signalId + \"_file\"\r\n );\r\n\r\n const uploadResult = await this.uploadFile(wallet, {\r\n file: fileSealedResult.encryptedPayload,\r\n originalName: options.file.originalName,\r\n mimeType: options.file.mimeType,\r\n });\r\n\r\n fileOptions = {\r\n storagePath: uploadResult.storagePath,\r\n payloadNonce: fileSealedResult.payloadNonce,\r\n originalName: options.file.originalName,\r\n mimeType: options.file.mimeType,\r\n sizeBytes: uploadResult.sizeBytes,\r\n sealedDataKey: fileSealedResult.sealedDataKey,\r\n sealedNonce: fileSealedResult.sealedNonce,\r\n senderEphemeralPublicKey: fileSealedResult.senderEphemeralPublicKey,\r\n aadHash: fileSealedResult.aadHash,\r\n };\r\n }\r\n\r\n const signalOptions: CreateSignalOptions = {\r\n signalId,\r\n walletTarget,\r\n shareWithRecipient: true,\r\n mode: \"shared_wallet\",\r\n hasFile: !!options.file,\r\n hasMessage: !!options.message,\r\n cipherVersion: sealedResult.cipherVersion,\r\n encryptedText: options.message ? sealedResult.encryptedPayload : undefined,\r\n payloadNonce: options.message ? sealedResult.payloadNonce : undefined,\r\n sealedDataKey: sealedResult.sealedDataKey,\r\n sealedNonce: sealedResult.sealedNonce,\r\n senderEphemeralPublicKey: sealedResult.senderEphemeralPublicKey,\r\n aadHash: sealedResult.aadHash,\r\n file: fileOptions,\r\n onChainNotification: options.onChainNotification,\r\n expiresAt: new Date(expiresAtMs).toISOString(),\r\n };\r\n\r\n const result = await this.createSignal(wallet, signalOptions);\r\n\r\n const shareableLink = `${FRONTEND_BASE_URL}/view/${result.signalId}`;\r\n\r\n return {\r\n ...result,\r\n shareableLink\r\n };\r\n }\r\n\r\n async uploadFileEncrypted(\r\n wallet: WalletAuth,\r\n fileData: ArrayBuffer | Uint8Array | Buffer,\r\n originalName: string,\r\n mimeType: string,\r\n key: CryptoKey\r\n ): Promise<UploadFileResponse> {\r\n const encrypted = await encryptFile(fileData, key);\r\n const encryptedBase64 = this.arrayBufferToBase64(encrypted.encrypted);\r\n\r\n return this.uploadFile(wallet, {\r\n file: encryptedBase64,\r\n originalName,\r\n mimeType,\r\n });\r\n }\r\n\r\n async burnSignal(wallet: WalletAuth, signalId: string): Promise<{ success: boolean }> {\r\n validateSignalId(signalId);\r\n validateWalletAddress(wallet.address);\r\n\r\n logger.info(\"Burning signal\", { signalId });\r\n\r\n const authMessage = await this.createAuthMessage(\"burn\", `signal ${signalId}`);\r\n const signature = await this.signMessage(wallet, authMessage);\r\n\r\n const requestBody = {\r\n signalId,\r\n wallet: {\r\n address: wallet.address,\r\n signature,\r\n message: authMessage,\r\n },\r\n };\r\n\r\n const result = await this.makeRequest<{ success: boolean }>(\r\n this.getApiUrl(\"/signals/burn\"),\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify(requestBody),\r\n }\r\n );\r\n\r\n logger.info(\"Signal burned successfully\", { signalId });\r\n return result;\r\n }\r\n}\r\n\r\n","/**\r\n * Wallet Key Registry Service\r\n * \r\n * Fetches and publishes X25519 public keys from/to the backend registry\r\n */\r\n\r\nimport type { MorseKeyCert } from \"./crypto-x25519\";\r\n\r\nexport interface GetPublicKeyResponse {\r\n walletAddress: string;\r\n certificate: MorseKeyCert | null;\r\n exists: boolean;\r\n}\r\n\r\nexport class WalletKeyService {\r\n private baseUrl: string;\r\n private apiKey: string;\r\n private apiVersion: string;\r\n\r\n constructor(baseUrl: string, apiKey: string, apiVersion: string = \"v1\") {\r\n this.baseUrl = baseUrl;\r\n this.apiKey = apiKey;\r\n this.apiVersion = apiVersion;\r\n }\r\n\r\n private getApiUrl(path: string): string {\r\n return `${this.baseUrl}/${this.apiVersion}${path}`;\r\n }\r\n\r\n async getPublicKey(walletAddress: string): Promise<GetPublicKeyResponse> {\r\n const url = this.getApiUrl(`/wallet-key-registry/${walletAddress.toLowerCase()}`);\r\n\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.apiKey,\r\n },\r\n });\r\n\r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n return {\r\n walletAddress: walletAddress.toLowerCase(),\r\n certificate: null,\r\n exists: false,\r\n };\r\n }\r\n throw new Error(`Failed to fetch public key: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const data = await response.json();\r\n return {\r\n walletAddress: data.walletAddress,\r\n certificate: data.certificate || null,\r\n exists: !!data.certificate,\r\n };\r\n }\r\n\r\n async publishPublicKey(certificate: MorseKeyCert): Promise<void> {\r\n const url = this.getApiUrl(\"/wallet-key-registry\");\r\n\r\n const response = await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.apiKey,\r\n },\r\n body: JSON.stringify({ certificate }),\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.json().catch(() => ({ message: \"Unknown error\" }));\r\n throw new Error(`Failed to publish public key: ${error.message || response.statusText}`);\r\n }\r\n }\r\n}\r\n","export function isValidSignalId(signalId: string): boolean {\r\n if (!signalId || typeof signalId !== 'string') {\r\n return false;\r\n }\r\n if (signalId.length < 8 || signalId.length > 64) {\r\n return false;\r\n }\r\n return /^[a-zA-Z0-9_-]+$/.test(signalId);\r\n}\r\n\r\nexport function isValidWalletAddress(address: string): boolean {\r\n if (!address || typeof address !== 'string') {\r\n return false;\r\n }\r\n return /^0x[a-fA-F0-9]{40}$/.test(address);\r\n}\r\n\r\nexport function validateSignalId(signalId: string): void {\r\n if (!isValidSignalId(signalId)) {\r\n throw new Error(`Invalid signal ID: ${signalId}. Must be 8-64 alphanumeric characters.`);\r\n }\r\n}\r\n\r\nexport function validateWalletAddress(address: string): void {\r\n if (!isValidWalletAddress(address)) {\r\n throw new Error(`Invalid wallet address: ${address}. Must be a valid Ethereum address.`);\r\n }\r\n}\r\n\r\nexport function formatExpiration(expiresAt: string): string {\r\n const date = new Date(expiresAt);\r\n return date.toLocaleString();\r\n}\r\n\r\nexport function isSignalExpired(expiresAt: string): boolean {\r\n return new Date(expiresAt) < new Date();\r\n}\r\n\r\nexport function getTimeUntilExpiration(expiresAt: string): number {\r\n return Math.max(0, new Date(expiresAt).getTime() - Date.now());\r\n}\r\n\r\nexport function parseExpiresIn(expiresIn: string): number {\r\n const match = expiresIn.match(/^(\\d+)([smhd])$/);\r\n if (!match) {\r\n throw new Error(`Invalid expiresIn format: ${expiresIn}. Use format like \"24h\", \"7d\", \"30m\"`);\r\n }\r\n \r\n const value = parseInt(match[1], 10);\r\n const unit = match[2];\r\n \r\n const multipliers: Record<string, number> = {\r\n s: 1000,\r\n m: 60 * 1000,\r\n h: 60 * 60 * 1000,\r\n d: 24 * 60 * 60 * 1000,\r\n };\r\n \r\n return value * multipliers[unit];\r\n}\r\n\r\nexport function filterActiveSignals<T extends { status: string; expiresAt: string }>(\r\n signals: T[]\r\n): T[] {\r\n const now = new Date();\r\n return signals.filter(\r\n (signal) => signal.status === \"active\" && new Date(signal.expiresAt) > now\r\n );\r\n}\r\n\r\nexport function sortSignalsByDate<T extends { createdAt: string }>(\r\n signals: T[],\r\n order: \"asc\" | \"desc\" = \"desc\"\r\n): T[] {\r\n return [...signals].sort((a, b) => {\r\n const dateA = new Date(a.createdAt).getTime();\r\n const dateB = new Date(b.createdAt).getTime();\r\n return order === \"desc\" ? dateB - dateA : dateA - dateB;\r\n });\r\n}\r\n\r\nexport function getSignalUrl(baseUrl: string, signalId: string, keyBase64?: string): string {\r\n const url = `${baseUrl}/#/signal/${signalId}`;\r\n if (keyBase64) {\r\n return `${url}#k=${encodeURIComponent(keyBase64)}`;\r\n }\r\n return url;\r\n}\r\n\r\nexport function extractSignalIdFromUrl(url: string): string | null {\r\n const match = url.match(/\\/signal\\/([a-zA-Z0-9_-]+)/);\r\n return match ? match[1] : null;\r\n}\r\n","import type {\r\n CreateSignalOptions,\r\n CreateSignalOptionsEncrypted,\r\n CreateSignalResponse,\r\n CreateSignalResponseEncrypted,\r\n OpenSignalResponse,\r\n OpenSignalResponseDecrypted,\r\n ListMySignalsResponse,\r\n UploadFileOptions,\r\n UploadFileResponse,\r\n DownloadFileResponse,\r\n WalletAuth,\r\n MorseSDKConfig,\r\n} from \"./types\";\r\nimport type { MorseContract } from \"./contracts/MorseContract\";\r\nimport { MorseSDKV1 } from \"./implementations/v1/MorseSDKV1\";\r\nimport { logger } from \"./logger\";\r\n\r\nexport interface MorseSDKCallbacks {\r\n onRequest?: (url: string, options: RequestInit) => void;\r\n onResponse?: (url: string, response: Response) => void;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\nexport class MorseSDK implements MorseContract {\r\n private contract: MorseContract;\r\n private apiVersion: string;\r\n private config: MorseSDKConfig;\r\n\r\n constructor(config: MorseSDKConfig) {\r\n if (!config.apiKey) {\r\n throw new Error(\"apiKey is required. Please provide an API key in the SDK configuration.\");\r\n }\r\n\r\n this.config = config;\r\n this.apiVersion = config.apiVersion || \"v1\";\r\n\r\n switch (this.apiVersion) {\r\n case \"v1\":\r\n this.contract = new MorseSDKV1(config);\r\n break;\r\n default:\r\n logger.warn(`Unknown API version: ${this.apiVersion}, defaulting to v1`);\r\n this.contract = new MorseSDKV1(config);\r\n this.apiVersion = \"v1\";\r\n }\r\n\r\n logger.debug(\"MorseSDK initialized\", {\r\n apiVersion: this.apiVersion,\r\n contractVersion: (this.contract as any).version,\r\n });\r\n }\r\n\r\n getConfig(): Readonly<MorseSDKConfig> {\r\n return { ...this.config };\r\n }\r\n\r\n getApiVersion(): string {\r\n return this.apiVersion;\r\n }\r\n\r\n getContract(): MorseContract {\r\n return this.contract;\r\n }\r\n\r\n async createSignal(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptions\r\n ): Promise<CreateSignalResponse> {\r\n return this.contract.createSignal(wallet, options);\r\n }\r\n\r\n async openSignal(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<OpenSignalResponse> {\r\n return this.contract.openSignal(wallet, signalId);\r\n }\r\n\r\n async listMySignals(wallet: WalletAuth): Promise<ListMySignalsResponse> {\r\n return this.contract.listMySignals(wallet);\r\n }\r\n\r\n async uploadFile(\r\n wallet: WalletAuth,\r\n options: UploadFileOptions\r\n ): Promise<UploadFileResponse> {\r\n return this.contract.uploadFile(wallet, options);\r\n }\r\n\r\n async downloadFile(\r\n wallet: WalletAuth,\r\n signalId: string\r\n ): Promise<DownloadFileResponse> {\r\n return this.contract.downloadFile(wallet, signalId);\r\n }\r\n\r\n async burnSignal(wallet: WalletAuth, signalId: string): Promise<{ success: boolean }> {\r\n return this.contract.burnSignal(wallet, signalId);\r\n }\r\n\r\n async createSignalEncrypted(\r\n wallet: WalletAuth,\r\n options: CreateSignalOptionsEncrypted\r\n ): Promise<CreateSignalResponseEncrypted> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.createSignalEncrypted) {\r\n return v1Contract.createSignalEncrypted(wallet, options);\r\n }\r\n throw new Error(\"createSignalEncrypted is not available in this API version\");\r\n }\r\n\r\n async openSignalDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64?: string\r\n ): Promise<OpenSignalResponseDecrypted> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.openSignalDecrypted) {\r\n return v1Contract.openSignalDecrypted(wallet, signalId, keyBase64);\r\n }\r\n throw new Error(\"openSignalDecrypted is not available in this API version\");\r\n }\r\n\r\n async uploadFileEncrypted(\r\n wallet: WalletAuth,\r\n fileData: ArrayBuffer | Uint8Array | Buffer,\r\n originalName: string,\r\n mimeType: string,\r\n key: CryptoKey\r\n ): Promise<UploadFileResponse> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.uploadFileEncrypted) {\r\n return v1Contract.uploadFileEncrypted(wallet, fileData, originalName, mimeType, key);\r\n }\r\n throw new Error(\"uploadFileEncrypted is not available in this API version\");\r\n }\r\n\r\n async downloadFileDecrypted(\r\n wallet: WalletAuth,\r\n signalId: string,\r\n keyBase64: string\r\n ): Promise<{ data: ArrayBuffer; originalName: string; mimeType: string; sizeBytes: number }> {\r\n const v1Contract = this.contract as any;\r\n if (v1Contract.downloadFileDecrypted) {\r\n return v1Contract.downloadFileDecrypted(wallet, signalId, keyBase64);\r\n }\r\n throw new Error(\"downloadFileDecrypted is not available in this API version\");\r\n }\r\n}\r\n\r\n","import type { WalletAuth } from \"./types\";\r\n\r\nexport interface PrivateKeyWalletConfig {\r\n privateKey: string;\r\n}\r\n\r\nexport interface PreSignedWalletConfig {\r\n address: string;\r\n signature: string;\r\n message: string;\r\n}\r\n\r\nexport function createWalletFromPrivateKey(config: PrivateKeyWalletConfig): WalletAuth {\r\n let ethersModule: any;\r\n\r\n try {\r\n ethersModule = require(\"ethers\");\r\n } catch {\r\n try {\r\n throw new Error(\"ethers must be installed\");\r\n } catch (error: any) {\r\n throw new Error(\r\n \"ethers is required for private key wallets. Install it: npm install ethers\"\r\n );\r\n }\r\n }\r\n\r\n const { Wallet } = ethersModule;\r\n\r\n const tempWallet = new Wallet(config.privateKey);\r\n const address = tempWallet.address;\r\n\r\n\r\n const privateKey = config.privateKey;\r\n\r\n return {\r\n address,\r\n signMessage: async (message: string) => {\r\n const wallet = new Wallet(privateKey);\r\n const signature = await wallet.signMessage(message);\r\n return signature;\r\n },\r\n };\r\n}\r\n\r\nexport function createWalletFromPreSigned(config: PreSignedWalletConfig): WalletAuth {\r\n return {\r\n address: config.address,\r\n signMessage: async (message: string) => {\r\n if (message === config.message) {\r\n return config.signature;\r\n }\r\n throw new Error(\r\n \"Pre-signed wallet can only sign the original message. \" +\r\n \"Expected: \" + config.message + \", Got: \" + message\r\n );\r\n },\r\n };\r\n}\r\n\r\nexport async function createBrowserWallet(\r\n ethereum: any,\r\n address?: string\r\n): Promise<WalletAuth> {\r\n let currentAddress: string = address || \"\";\r\n\r\n if (!currentAddress) {\r\n const accounts = await ethereum.request({ method: \"eth_accounts\" });\r\n if (accounts.length === 0) {\r\n throw new Error(\"No wallet connected. Please connect your wallet first.\");\r\n }\r\n currentAddress = accounts[0];\r\n }\r\n\r\n return {\r\n address: currentAddress,\r\n signMessage: async (message: string) => {\r\n try {\r\n const signature = await ethereum.request({\r\n method: \"personal_sign\",\r\n params: [message, currentAddress],\r\n });\r\n return signature;\r\n } catch (error: any) {\r\n if (error.code === 4001) {\r\n throw new Error(\"User rejected the signing request\");\r\n }\r\n throw error;\r\n }\r\n },\r\n };\r\n}\r\n\r\n","export { MorseSDK, type MorseSDKCallbacks } from \"./morse-sdk\";\r\nexport * from \"./types\";\r\nexport * from \"./contracts\";\r\nexport * from \"./implementations\";\r\nexport {\r\n createWalletFromPrivateKey,\r\n createWalletFromPreSigned,\r\n createBrowserWallet,\r\n type PrivateKeyWalletConfig,\r\n type PreSignedWalletConfig,\r\n} from \"./helpers\";\r\nexport {\r\n MorseSDKError,\r\n SignalNotFoundError,\r\n SignalExpiredError,\r\n SignalAlreadyUsedError,\r\n WalletNotAllowedError,\r\n ValidationError,\r\n NetworkError,\r\n RateLimitError,\r\n} from \"./errors\";\r\nexport { logger, type LogLevel } from \"./logger\";\r\nexport * from \"./utils\";\r\nexport {\r\n getCipherVersion,\r\n generateShareableLink,\r\n} from \"./crypto\";\r\nexport {\r\n X25519_CIPHER_VERSION,\r\n createSharedSignal,\r\n openSharedSignal,\r\n deriveKeyPairFromWalletSignature,\r\n createKeyCertificate,\r\n verifyKeyCertificate,\r\n generateSignalId,\r\n type MorseKeyCert,\r\n type CreateSharedSignalResult,\r\n} from \"./crypto-x25519\";\r\nexport { WalletKeyService } from \"./wallet-key-service\";\r\nexport { Expiration, type ExpirationValue } from \"./expiration\";\r\n\r\n","/**\r\n * Common expiration time constants for signals\r\n * \r\n * Use these constants to ensure correct format and get autocomplete support\r\n * \r\n * @example\r\n * ```typescript\r\n * await sdk.createSignalEncrypted(wallet, {\r\n * mode: \"shared_wallet\",\r\n * walletTarget: \"0x...\",\r\n * message: \"...\",\r\n * expiresIn: Expiration.ONE_DAY, // \"24h\"\r\n * });\r\n * ```\r\n */\r\nexport const Expiration = {\r\n /** 5 seconds */\r\n FIVE_SECONDS: \"5s\",\r\n /** 30 seconds */\r\n THIRTY_SECONDS: \"30s\",\r\n /** 1 minute */\r\n ONE_MINUTE: \"1m\",\r\n /** 5 minutes */\r\n FIVE_MINUTES: \"5m\",\r\n /** 30 minutes */\r\n THIRTY_MINUTES: \"30m\",\r\n /** 1 hour */\r\n ONE_HOUR: \"1h\",\r\n /** 6 hours */\r\n SIX_HOURS: \"6h\",\r\n /** 12 hours */\r\n TWELVE_HOURS: \"12h\",\r\n /** 24 hours (1 day) */\r\n ONE_DAY: \"24h\",\r\n /** 7 days (1 week) */\r\n ONE_WEEK: \"7d\",\r\n /** 30 days (1 month) */\r\n ONE_MONTH: \"30d\",\r\n} as const;\r\n\r\n/**\r\n * Type for expiration values\r\n */\r\nexport type ExpirationValue = typeof Expiration[keyof typeof Expiration] | string;\r\n\r\n"]}
|