SDK for building decentralised localfirst web apps. Provides authentication (guest, passkeys, email), tts ai model integrations, realtime communication & crypto encryptions.
import { jok } from '@jokio/sdk'
// guest
{
const userData = await jok.auth.guestLogin()
}
// passkeys
{
// login with existing keys
await jok.auth.requestPasskeyLogin()
// login attempt with a specific displayName
// acts like previous example if displayName not found
await jok.auth.requestPasskeyLogin({ displayName })
// registering a new passkey
await jok.auth.requestPasskeyLogin({
displayName,
isRegistration: true,
})
}
// email
{
// 1. request otp code
const isSent = await jok.auth.requestEmailLogin(email)
// 2. complete process
const userData = await jok.auth.completeEmailLogin(email, otpCode)
}
import { jok } from '@jokio/sdk'
// get available voices
const voices = await jok.tts.getVoices()
console.log(voices)
// convert text to audio file
const audio = await jok.tts.getAudio(
'Hello there, how are you?',
'en-US-AvaNeural',
)
audio.play()
Between users (browsers), using nats
import { jok } from '@jokio/sdk'
// Authentication should be done first
await jok.nats.connect()
await jok.nats.on('dev.test', (data, ctx) => {
// in `ctx` you will receive caller's userId and sessionId
console.log('Received event', data, ctx)
})
await jok.nats.publish('dev.test', {
hello: 'world',
})
Works directly in browser
import { jok } from '@jokio/sdk'
const kp1 = await jok.crypto.createSessionKeyPair()
const kp2 = await jok.crypto.createSessionKeyPair()
const p1 = await jok.crypto.exportPublicKey(kp1.publicKey)
const p2 = await jok.crypto.exportPublicKey(kp2.publicKey)
console.log({ p1, p2 })
const shared1 = await jok.crypto.deriveAESKey(kp1.privateKey, p2)
const shared2 = await jok.crypto.deriveAESKey(kp2.privateKey, p1)
// `shared1` and `shared2` keys will be the same.
const originalText = 'Hello World'
const encrypted = await jok.crypto.encrypt(originalText, shared1)
const decrypted = await jok.crypto.decrypt(encrypted, shared2)
console.log({
match: originalText === decrypted,
originalText,
decrypted,
})
You can use directly into html as well:
<script type="module">
import { jok } from 'https://esm.run/@jokio/sdk'
async function textToAudio() {
const audio = await jok.tts.getAudio(
'Hello there, how are you?',
'en-US-AvaNeural',
)
audio.play()
}
window.textToAudio = textToAudio
</script>