@useorbis/db-sdk
Version:
Orbis' Typescript SDK for building open-data experiences.
47 lines (46 loc) • 1.76 kB
JavaScript
import { DIDSession, createDIDCacao, createDIDKey } from "did-session";
import { Cacao, } from "@didtools/cacao";
import { createOrbisSiwxMessage, SupportedChains } from "../index.js";
import { OrbisError } from "../util/results.js";
import { OrbisKeyDidAuth } from "./keyDid.js";
export const cacaoFromMessage = (message, chain) => {
switch (chain) {
case SupportedChains.evm:
return Cacao.fromSiweMessage(message);
case SupportedChains.solana:
return Cacao.fromSiwsMessage(message);
case SupportedChains.tezos:
return Cacao.fromSiwTezosMessage(message);
default:
throw new OrbisError("Unsupported chain " + chain);
}
};
export const authenticateDidWithSiwx = async ({ authenticator, siwxOverwrites, }) => {
const keySeed = (await OrbisKeyDidAuth.generateSeed("uint8"));
const didKey = await createDIDKey(keySeed);
const user = await authenticator.getUserInformation();
const siwxMessage = await createOrbisSiwxMessage({
siwxOverwrites: {
...siwxOverwrites,
uri: didKey.id,
},
chain: authenticator.chain,
provider: authenticator.provider,
});
const session = await authenticator.signSiwx(siwxMessage);
if (user.chain === SupportedChains.tezos) {
const siwx = session.siwx.message;
siwx.signature = siwx.signature + user.metadata.publicKey;
session.siwx.signature = siwx.signature;
}
const cacao = cacaoFromMessage(session.siwx.message, user.chain);
const didSession = new DIDSession({
keySeed,
cacao,
did: await createDIDCacao(didKey, cacao),
});
return {
did: didSession.did,
session: didSession,
};
};