React Native implementation of pubky-core
npm install @synonymdev/react-native-pubky- auth: Authentication functionality.
- parseAuthUrl: Method to decode an authUrl.
- publish: Functionality to publish content.
- resolve: Functionality to resolve content.
- publishHttps: Publish HTTPS records.
- resolveHttps: Resolve HTTPS records.
- getSignupToken: Get a signup token from a homeserver with admin credentials.
- signUp: Grant sign-up to a homeserver and update Pkarr accordingly, with optional signup token support.
- signUpGrant / signUpCookie: Explicit Grant and legacy cookie sign-up methods.
- republishHomeserver: Republish homeserver information to the DHT.
- signIn: Grant sign-in to a homeserver.
- signInGrant / signInCookie: Explicit Grant and legacy cookie sign-in methods.
- signOut: Sign-out from a homeserver.
- put: Upload a small payload to a given path.
- get: Download a small payload from a given path relative to a pubky author.
- list: Returns a list of Pubky URLs of the files in the path of the
urlprovided. - delete: Delete a file at a path relative to a pubky author.
- generateSecretKey: Generate a secret key.
- getPublicKeyFromSecretKey: Get the public key string and uri from a secret key.
- create_recovery_file: Create a recovery file.
- decrypt_recovery_file: Decrypt a recovery file.
- getHomeserver: Get homeserver URL from a public key.
- startAuthFlow: Start a Grant authentication flow with requested capabilities.
- awaitAuthApproval: Await approval of a pending Grant auth flow.
- startGrantAuthFlow / startCookieAuthFlow: Explicit Grant and legacy cookie auth-flow methods.
- awaitGrantAuthApproval / awaitCookieAuthApproval: Await explicit Grant and legacy cookie auth flows.
- putWithSession: Upload content to a path using session-based authentication.
- deleteWithSession: Delete content at a path using session-based authentication.
signUp, signIn, startAuthFlow, and awaitAuthApproval are Grant-auth aliases. Use the explicit *Grant names when the distinction matters. Legacy cookie auth is still exposed through the explicit *Cookie methods because the native binding mirrors upstream pubky, but cookie auth is deprecated upstream.
import { auth } from '@synonymdev/react-native-pubky';
const authRes = await auth(
'pubkyauth:///?caps=/pub/pubky.app/:rw,/pub/foo.bar/file:r&secret=U55XnoH6vsMCpx1pxHtt8fReVg4Brvu9C0gUBuw-Jkw&relay=http://167.86.102.121:4173/',
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
);
if (authRes.isErr()) {
console.log(authRes.error.message);
return;
}
console.log(authRes.value);import { parseAuthUrl } from '@synonymdev/react-native-pubky';
const pubkyAuthUrl = 'pubkyauth:///?relay=https://demo.httprelay.io/link&capabilities=/pub/pubky.app/:rw,/pub/example.com/nested/:rw&secret=FyzJ3gJ1W7boyFZC1Do9fYrRmDNgCLNRwEu_gaBgPUA';
const parseRes = await parseAuthUrl(pubkyAuthUrl);
if (parseRes.isErr()) {
console.log(parseRes.error.message);
return;
}
console.log(parseRes.value);import { publish } from '@synonymdev/react-native-pubky';
const publishRes = await publish(
'recordnametest',
'recordcontenttest',
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
);
if (publishRes.isErr()) {
console.log(publishRes.error.message);
return;
}
console.log(publishRes.value);import { resolve } from '@synonymdev/react-native-pubky';
const resolveRes = await resolve(
'z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty'
);
if (resolveRes.isErr()) {
console.log(resolveRes.error.message);
return;
}
console.log(resolveRes.value);import { publishHttps } from '@synonymdev/react-native-pubky';
const publishHttpsRes = await publishHttps(
'example.com', // Record Name
'target.example.com', // Target
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' // Secret Key
);
if (publishHttpsRes.isErr()) {
console.log(publishHttpsRes.error.message);
return;
}
console.log(publishHttpsRes.value);import { resolveHttps } from '@synonymdev/react-native-pubky';
const resolveHttpsRes = await resolveHttps(
'z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty' // Public key
);
if (resolveHttpsRes.isErr()) {
console.log(resolveHttpsRes.error.message);
return;
}
console.log(resolveHttpsRes.value);import { put } from '@synonymdev/react-native-pubky';
const putRes = await put(
'pubky://z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty/pub/synonym.to', // URL
{ data: 'test content' }, // Content
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret Key
'my-app.example' // Client ID
);
if (putRes.isErr()) {
console.log(putRes.error.message);
return;
}
console.log(putRes.value);import { get } from '@synonymdev/react-native-pubky';
const getRes = await get(
'pubky://z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty/pub/synonym.to' // URL
);
if (getRes.isErr()) {
console.log(getRes.error.message);
return;
}
console.log(getRes.value);import { list } from '@synonymdev/react-native-pubky';
const listRes = await list(
'pubky://z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty/pub/' // URL
);
if (listRes.isErr()) {
console.log(listRes.error.message);
return;
}
console.log(listRes.value);import { deleteFile } from '@synonymdev/react-native-pubky';
const deleteFileRes = await deleteFile(
'pubky://z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty/pub/', // URL
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret Key
'my-app.example' // Client ID
);
if (deleteFileRes.isErr()) {
console.log(deleteFileRes.error.message);
return;
}
console.log(deleteFileRes.value);import { generateSecretKey } from '@synonymdev/react-native-pubky';
const generateSecretKeyRes = await generateSecretKey();
if (generateSecretKeyRes.isErr()) {
console.log(generateSecretKeyRes.error.message);
return;
}
console.log(generateSecretKeyRes.value);import { getPublicKeyFromSecretKey } from '@synonymdev/react-native-pubky';
const getPublicKeyFromSecretKeyRes = await getPublicKeyFromSecretKey('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
if (getPublicKeyFromSecretKeyRes.isErr()) {
console.log(getPublicKeyFromSecretKeyRes.error.message);
return;
}
console.log(getPublicKeyFromSecretKeyRes.value);import { getSignupToken } from '@synonymdev/react-native-pubky';
const getSignupTokenRes = await getSignupToken(
'8pinxxgqs41n4aididenw5apqp1urfmzdztr8jt4abrkdn435ewo', // Homeserver pubky
'admin_password' // Admin Password
);
if (getSignupTokenRes.isErr()) {
console.log(getSignupTokenRes.error.message);
return;
}
console.log('Signup Token:', getSignupTokenRes.value);import { signUp, signUpCookie } from '@synonymdev/react-native-pubky';
// Standard signup
const signUpRes = await signUp(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret
'pubky://8pinxxgqs41n4aididenw5apqp1urfmzdztr8jt4abrkdn435ewo', // Homeserver
undefined, // Optional signup token
'my-app.example' // Client ID
);
if (signUpRes.isErr()) {
console.log(signUpRes.error.message);
return;
}
console.log(signUpRes.value);
// Signup with token
const signUpWithTokenRes = await signUp(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret
'pubky://8pinxxgqs41n4aididenw5apqp1urfmzdztr8jt4abrkdn435ewo', // Homeserver
'your_signup_token', // Optional signup token
'my-app.example' // Client ID
);
if (signUpWithTokenRes.isErr()) {
console.log(signUpWithTokenRes.error.message);
return;
}
console.log(signUpWithTokenRes.value);
const cookieSignUpRes = await signUpCookie(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret
'pubky://8pinxxgqs41n4aididenw5apqp1urfmzdztr8jt4abrkdn435ewo', // Homeserver
undefined // Optional signup token
);
if (cookieSignUpRes.isErr()) {
console.log(cookieSignUpRes.error.message);
return;
}
console.log(cookieSignUpRes.value); // { pubky, capabilities, session_secret }import { republishHomeserver } from '@synonymdev/react-native-pubky';
const republishRes = await republishHomeserver(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret Key
'pubky://8pinxxgqs41n4aididenw5apqp1urfmzdztr8jt4abrkdn435ewo' // Homeserver
);
if (republishRes.isErr()) {
console.log(republishRes.error.message);
return;
}
console.log(republishRes.value); // "Homeserver republished successfully"import { signIn, signInCookie } from '@synonymdev/react-native-pubky';
const signInRes = await signIn(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret Key
'my-app.example' // Client ID
);
if (signInRes.isErr()) {
console.log(signInRes.error.message);
return;
}
console.log(signInRes.value);
const cookieSignInRes = await signInCookie(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' // Secret Key
);
if (cookieSignInRes.isErr()) {
console.log(cookieSignInRes.error.message);
return;
}
console.log(cookieSignInRes.value); // { pubky, capabilities, session_secret }import { getHomeserver } from '@synonymdev/react-native-pubky';
const getHomeserverRes = await getHomeserver(
'z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty' // Public Key
);
if (getHomeserverRes.isErr()) {
console.log(getHomeserverRes.error.message);
return;
}
console.log(getHomeserverRes.value);import { signOut } from '@synonymdev/react-native-pubky';
const signOutRes = await signOut(
'grant_or_cookie_session_secret' // grant_secret or session_secret
);
if (signOutRes.isErr()) {
console.log(signOutRes.error.message);
return;
}
console.log(signOutRes.value);import { createRecoveryFile } from '@synonymdev/react-native-pubky';
const createRecoveryFileRes = await createRecoveryFile(
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', // Secret Key
'passphrase', // Passphrase
);
if (createRecoveryFileRes.isErr()) {
console.log(createRecoveryFileRes.error.message);
return;
}
console.log(createRecoveryFileRes.value);import { decryptRecoveryFile } from '@synonymdev/react-native-pubky';
const decryptRecoveryFileRes = await decryptRecoveryFile(
'cHVia3kub3JnL3JlY292ZXJ5CkZRt1NHIjxyTo0whSSgTgNrH56MPpGrSxvAQSE0x5FeklVJpNJqcNP4zjdwW/OpdBOsEC1qZ5MI/mcEUKFKVAEZwikdclsLZg==', // Recovery File
'passphrase', // Passphrase
);
if (decryptRecoveryFileRes.isErr()) {
console.log(decryptRecoveryFileRes.error.message);
return;
}
console.log(decryptRecoveryFileRes.value);Start a Grant authentication flow with requested capabilities. Returns a URL to present to the user for approval.
import { startAuthFlow, startCookieAuthFlow } from '@synonymdev/react-native-pubky';
const startRes = await startAuthFlow('/pub/att.app/:rw', 'my-app.example');
if (startRes.isErr()) {
console.log(startRes.error.message);
return;
}
console.log(startRes.value); // Auth URL to present to user
const cookieStartRes = await startCookieAuthFlow('/pub/att.app/:rw');
if (cookieStartRes.isErr()) {
console.log(cookieStartRes.error.message);
return;
}
console.log(cookieStartRes.value); // Legacy cookie auth URLAwait approval of a pending Ring auth flow. Returns session info upon approval.
import { awaitAuthApproval, awaitCookieAuthApproval } from '@synonymdev/react-native-pubky';
const approvalRes = await awaitAuthApproval();
if (approvalRes.isErr()) {
console.log(approvalRes.error.message);
return;
}
console.log(approvalRes.value); // { pubky, capabilities, grant_secret }
const cookieApprovalRes = await awaitCookieAuthApproval();
if (cookieApprovalRes.isErr()) {
console.log(cookieApprovalRes.error.message);
return;
}
console.log(cookieApprovalRes.value); // { pubky, capabilities, session_secret }Upload content to a path using session-based authentication (instead of a secret key).
import { putWithSession } from '@synonymdev/react-native-pubky';
const putRes = await putWithSession(
'pubky://z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty/pub/app/profile.json', // URL
JSON.stringify({ name: 'Alice' }), // Content (string)
'grant_or_cookie_session_secret' // grant_secret or session_secret
);
if (putRes.isErr()) {
console.log(putRes.error.message);
return;
}
console.log(putRes.value);Delete content at a path using session-based authentication (instead of a secret key).
import { deleteWithSession } from '@synonymdev/react-native-pubky';
const deleteRes = await deleteWithSession(
'pubky://z4e8s17cou9qmuwen8p1556jzhf1wktmzo6ijsfnri9c4hnrdfty/pub/app/profile.json', // URL
'grant_or_cookie_session_secret' // grant_secret or session_secret
);
if (deleteRes.isErr()) {
console.log(deleteRes.error.message);
return;
}
console.log(deleteRes.value);- Clone & npm install:
git clone git@github.com:pubky/react-native-pubky.git && cd react-native-pubky && npm i- Delete the
rust/pubkydirectory to prevent a memory error (This step will be removed once pubky is public). - Yarn add it to your project:
yarn add path/to/react-native-pubky- Run Homeserver:
cd rust/pubky/pubky-homeserver && cargo run -- --config=./src/config.toml- Run the React Native Example App:
cd example && yarn install && cd ios && pod install && cd ../ && yarn iosThis command will download the current bindings from the SDK repo:
npm run update-remote-bindingsThis command will download the entire Rust project if it doesn't exist and set up the bindings locally for faster iteration and testing:
npm run update-local-bindingsFinally, ensure that PubkyModule.kt, Pubky.swift, Pubky.mm & src/index.tsx are updated accordingly based on the changes made to the Rust files.
MIT