@nosana/kit
Version:
Nosana KIT
42 lines • 2.15 kB
JavaScript
import { NosanaError, ErrorCodes } from '../errors/NosanaError.js';
/**
* Extract signature from a signatures dictionary.
*/
function extractSignature(signatures, signerAddress, errorContext) {
if (!signatures) {
throw new NosanaError(errorContext, ErrorCodes.AUTH_ERROR);
}
const signature = signatures[signerAddress];
if (!signature) {
throw new NosanaError('Failed to get signature from signer', ErrorCodes.AUTH_ERROR);
}
return signature instanceof Uint8Array ? signature : new Uint8Array(signature);
}
/**
* Convert a MessageSigner to a SignMessageFn for use with createNosanaAuthorization.
* MessageSigner always supports message signing (either via modifyAndSignMessages or signMessages).
*
* @param signer - The message signer to convert
* @returns A SignMessageFn that can be used with createNosanaAuthorization
*/
export function walletToAuthorizationSigner(signer) {
const signerAddress = signer.address;
return async (message) => {
const messageToSign = { content: message, signatures: {} };
// Try modifyAndSignMessages first (MessageModifyingSigner)
if ('modifyAndSignMessages' in signer && typeof signer.modifyAndSignMessages === 'function') {
const signedMessages = await signer.modifyAndSignMessages([messageToSign]);
const signedMessage = signedMessages[0];
return extractSignature(signedMessage?.signatures, signerAddress, 'Failed to get signed message from signer');
}
// Fallback to signMessages (MessagePartialSigner)
if ('signMessages' in signer && typeof signer.signMessages === 'function') {
const signatures = await signer.signMessages([messageToSign]);
const signatureDict = signatures[0];
return extractSignature(signatureDict, signerAddress, 'Failed to get signatures from signer');
}
// This should never happen since MessageSigner always has one of these methods
throw new NosanaError('MessageSigner does not support message signing', ErrorCodes.AUTH_ERROR);
};
}
//# sourceMappingURL=walletToAuthorizationSigner.js.map