SDK Overview
Complete reference for the haex-vault SDK APIs and framework integrations.
Overview
The haex-vault SDK provides a complete API for building extensions. It includes database access, storage, filesystem operations, web requests, and more.
Installation
Install the SDK using your preferred package manager:
npm install @haex-space/vault-sdk
Framework Setup
The SDK provides adapters for popular frameworks. Choose your framework below:
Setup
<script setup lang="ts">
import { useHaexVaultSdk } from '@haex-space/vault-sdk/vue'
import manifest from '../haextension/manifest.json'
// Initialize SDK with manifest
const { client, context, extensionInfo, getTableName } = useHaexVaultSdk({
manifest,
debug: globalThis._importMeta_.env.DEV
})
// Watch for context changes (theme/locale)
watch(() => context.value, (ctx) => {
if (ctx) {
document.documentElement.classList.toggle('dark', ctx.theme === 'dark')
}
}, { immediate: true })
</script>
Usage
<script setup lang="ts">
import { useHaexVaultSdk } from '@haex-space/vault-sdk/vue'
const { client, context, getTableName } = useHaexVaultSdk()
// Access context - reactive refs
const theme = computed(() => context.value?.theme) // 'light' | 'dark'
const locale = computed(() => context.value?.locale) // 'en', 'de', etc.
const platform = computed(() => context.value?.platform) // 'linux', 'windows', 'macos', 'android', 'ios', etc.
// Database operations with namespaced table names
async function loadData() {
const tableName = getTableName('users')
const users = await client.query(`SELECT * FROM ${tableName}`)
console.log(users)
}
</script>
Client API Overview
The client provides access to all SDK features:
const { client, extensionInfo, context, getTableName } = useHaexVaultSdk()
// Identity & context (reactive in Vue / React / Svelte adapters)
extensionInfo // { publicKey, name, version, displayName }
context.theme // 'light' | 'dark'
context.locale // 'de' | 'en' | ...
context.platform // 'linux' | 'windows' | 'macos' | 'android' | 'ios'
// Table naming
getTableName('users')
client.getDependencyTableName(publicKey, extensionName, 'users')
client.parseTableName(fullTableName)
// Database (shortcuts and full DatabaseAPI)
await client.query(sql, params)
await client.execute(sql, params)
await client.database.queryOne(sql, params)
await client.database.transaction([{ sql, params }, ...])
await client.database.insert(table, data)
await client.database.update(table, data, where, whereParams)
await client.database.delete(table, where, whereParams)
await client.registerMigrationsAsync(extensionVersion, migrations)
// Drizzle ORM
const db = client.initializeDatabase({ users })
await db.select().from(users)
// Storage (key-value, scoped to the extension)
await client.storage.getItem(key)
await client.storage.setItem(key, value)
await client.storage.removeItem(key)
await client.storage.keys()
await client.storage.clear()
// Filesystem
await client.filesystem.saveFileAsync(data, options)
await client.filesystem.openFileAsync(options)
await client.filesystem.openMultipleAsync(options)
await client.filesystem.showImageAsync(options)
// Web
await client.web.fetchAsync(url, options)
await client.web.fetchJsonAsync(url, options)
await client.web.fetchTextAsync(url, options)
await client.web.fetchBlobAsync(url, options)
await client.web.openAsync(url)
// Permissions (SDK boundary uses 'read' | 'write')
await client.permissions.checkDatabaseAsync(resource, 'read' | 'write')
await client.permissions.checkFilesystemAsync(path, 'read' | 'write')
await client.permissions.checkWebAsync(url)
// External requests (browser ext / CLI / external apps)
client.onExternalRequest('my-action', async (req) => ({ ok: true }))
await client.respondToExternalRequest(response)
// Lifecycle
client.onSetup(async () => { /* run migrations etc. */ })
await client.setupComplete()
Application Context
Access the current theme, locale, and platform. The context updates automatically when the user changes settings.
// In a Vue / React / Svelte adapter, `context` is reactive.
// In the plain JS client it's a plain getter (`client.context`).
const { context } = useHaexVaultSdk()
// Vue: context is a Ref<ApplicationContext | null>
const ctx = context.value
ctx?.theme // 'light' | 'dark'
ctx?.locale // 'de' | 'en' | ...
ctx?.platform // 'linux' | 'windows' | 'macos' | 'android' | 'ios'
// React to context changes (Vue)
watch(() => context.value?.theme, (theme) => {
document.documentElement.classList.toggle('dark', theme === 'dark')
})
// In plain JS:
// const client = createHaexVaultSdk()
// await client.ready()
// console.log(client.context?.theme)
// client.on('haextension:context:changed', (e) => { /* ... */ })
theme
Current theme: light, dark, or system
locale
Current locale code (en, de, etc.)
platform
Operating system: windows, macos, linux, ios, android
Events
Listen for events from haex-vault:
import { HAEXTENSION_EVENTS, EXTERNAL_EVENTS } from '@haex-space/vault-sdk'
const { client } = useHaexVaultSdk()
// Listen for context changes (theme / locale / platform)
client.on(HAEXTENSION_EVENTS.CONTEXT_CHANGED, (event) => {
const { theme, locale, platform } = event.data.context
console.log('Context updated:', { theme, locale, platform })
})
// Sync notification: tables relevant to this extension have new data
client.on(HAEXTENSION_EVENTS.SYNC_TABLES_UPDATED, async (event) => {
const tables = event.data?.tables ?? []
const ourPrefix = client.getTableName('') // '<pubKey>__<extName>__'
if (tables.some(t => t.startsWith(ourPrefix))) {
await reloadDataAsync()
}
})
// Search requests (when haex-vault routes a search to this extension)
client.on(HAEXTENSION_EVENTS.SEARCH_REQUEST, async (event) => {
const { query, requestId } = event.data
const results = await performSearch(query)
await client.respondToSearch(requestId, results)
})
// External requests (from browser extension, CLI, other apps)
client.on(EXTERNAL_EVENTS.REQUEST, async (event) => {
const { requestId, action, payload, publicKey } = event.data
const data = await handle(action, payload)
await client.respondToExternalRequest({ requestId, success: true, data })
})