Skip to main content

Client SDK (@kyqu/client)

A zero-dependency JavaScript/TypeScript client for the Kyqu auth platform. Works in browsers, Node.js, Deno, Bun, and any fetch-capable runtime.

Installation

npm install @kyqu/client

Quick Start

import { KyquClient } from "@kyqu/client";

const client = new KyquClient({
baseUrl: "https://auth.example.com",
projectId: "your-project-id",
publicKey: "pk_your_public_key"
});

// Sign up
const { user, session } = await client.signup({
email: "user@example.com",
password: "secure-password-42",
name: "User Name"
});

// Log in
const { user, session } = await client.login({
email: "user@example.com",
password: "secure-password-42"
});

// Get current user
const user = await client.getUser(session.token);

API

Constructor

new KyquClient(options: KyquClientOptions)
OptionTypeRequiredDescription
baseUrlstringYesRoot URL of your Kyqu API
projectIdstringYesProject UUID from dashboard
publicKeystringYespk_ key from dashboard

Methods (32)

MethodDescription
getFields()Returns custom field definitions for building dynamic signup forms
signup(input)Registers a new user. Custom field values as top-level keys.
login(input)Authenticates a user. Include totpCode or backupCode for 2FA.
logout(token)Revokes a bearer token.
getUser(token)Returns the user for a bearer token.
updateMetadata(token, metadata)Updates client-writable metadata for the authenticated user
requestEmailVerification(email)Sends verification email.
confirmEmailVerification(token)Confirms verification token.
requestPasswordReset(email)Initiates password reset.
confirmPasswordReset(input)Confirms reset with token + new password.
changePassword(token, input)Changes password (requires bearer token + current password).
requestMagicLink(email)Sends magic sign-in link.
confirmMagicLink(token)Confirms magic link via POST API.
exchangeSessionCode(sessionCode)Exchanges browser session_code from magic-link redirect
enrollTotp(token)Starts TOTP enrollment; returns enrollmentUrl (QR code).
confirmTotp(token, code)Confirms TOTP enrollment; returns 8 backup codes.
disableTotp(token, code)Disables TOTP for the authenticated user.
getOAuthAuthorizeUrl(provider, redirectUrl?)Build OAuth provider authorize URL (synchronous, no HTTP call)
getOAuthUser(token)Get OAuth-linked user profile (delegates to getUser)
getPasskeyRegistrationOptions(token)Get WebAuthn registration options
registerPasskey(token, credential, name?)Register WebAuthn passkey
getPasskeyAuthenticationOptions(userId?)Get WebAuthn authentication options
authenticateWithPasskey(assertion)Authenticate with passkey assertion
listPasskeys(token)List registered passkeys
deletePasskey(token, credentialId)Delete passkey
getIdToken(token)Issue RS256 JWT ID token for OIDC
getOidcDiscovery()Get OpenID Connect discovery document
getJwks()Get JSON Web Key Set
getLogs(token, filters?)Get audit logs for current user
withAutoRefresh(session, options?)Wrap session with auto-refresh timer
listSessions(token)Lists all active sessions.
revokeSession(token, sessionId)Revokes a specific session.

Types

interface KyquUser {
id: string;
projectId: string;
email: string;
name: string;
status: string;
emailVerifiedAt: string;
passwordResetRequired: boolean;
totpEnabled: boolean;
lockedUntil: string;
metadata: Record<string, any>;
createdAt: string;
}

interface KyquSession {
token: string;
expiresAt: string;
}

interface KyquSignupResult {
user: KyquUser;
session: KyquSession | null; // null when email verification required
verificationRequired: boolean;
verificationQueued: { expiresAt: string } | null;
}

interface KyquLoginResult {
user: KyquUser;
session: KyquSession;
}

interface KyquTotpEnrollResult {
enrollmentUrl: string; // otpauth:// URI
}

interface KyquTotpConfirmResult {
ok: boolean;
backupCodes: string[]; // 8 codes, display once
}

interface KyquFieldDef {
id: string;
name: string;
label: string;
fieldType: "text" | "number" | "boolean" | "date" | "select";
required: boolean;
defaultValue: string;
sortOrder: number;
clientWritable?: boolean;
adminWritable?: boolean;
visibleInAuth?: boolean;
options?: string[];
}

interface KyquSessionInfo {
id: string;
isCurrent: boolean;
ipAddress: string | null;
userAgent: string | null;
createdAt: string;
expiresAt: string;
}

interface KyquPasskey {
id: string;
credentialId: string;
name: string;
createdAt: string;
lastUsedAt: string | null;
signCount: number;
}

interface KyquLogEntry {
id: string;
event: string;
metadata: Record<string, any>;
createdAt: string;
}

interface KyquOidcDiscovery {
issuer: string;
jwks_uri: string;
token_endpoint: string;
userinfo_endpoint: string;
response_types_supported: string[];
id_token_signing_alg_values_supported: string[];
}

interface KyquJwks {
keys: Array<{ kty: string; use: string; alg: string; kid: string; n: string; e: string }>;
}

React Integration (@kyqu/client/react)

The SDK exports a React package with context provider and hooks:

ExportDescription
KyquProviderContext provider with session persistence (localStorage) and auto-refresh
useKyqu()Full context: client, user, session, login, signup, logout, applySession
useKyquUser()Current user or null
useKyquSession()Current session or null
useKyquLoading()true while restoring session on mount

Error Handling

class KyquError extends Error {
status: number; // HTTP status code
data: Record<string, any>; // Full response body
name: "KyquError";
}

Package Details

  • Package name: @kyqu/client
  • Version: 0.2.0
  • License: MIT
  • Runtime dependencies: None (uses global fetch)
  • ESM: Yes ("type": "module")
  • Dual format: ESM (src/index.js) + CJS (dist/index.cjs)
  • TypeScript: Declarations in src/index.d.ts
  • React: Optional hooks entry point at @kyqu/client/react (requires React 18+)