Files
bitvid/js/services/authProviders/nip07.js
T
2026-01-28 23:49:33 +00:00

91 lines
2.3 KiB
JavaScript

import { accessControl } from "../../accessControl.js";
const PROVIDER_ID = "nip07";
const PROVIDER_LABEL = "extension (nip-07)";
const PROVIDER_DESCRIPTION =
"Authorize with a NIP-07 browser extension like Alby or nos2x.";
const PROVIDER_CAPABILITIES = Object.freeze([
Object.freeze({
id: "signing",
label: "Signs Nostr events",
variant: "info",
}),
Object.freeze({
id: "session",
label: "Loads your public key",
variant: "neutral",
}),
]);
const PROVIDER_BUTTON = Object.freeze({
variant: "primary",
});
const PROVIDER_MESSAGES = Object.freeze({
loading: "Connecting to your extension…",
slow: "Waiting for the extension prompt…",
error: "Failed to login with your browser extension. Please try again.",
});
function normalizePubkey(result) {
if (typeof result === "string") {
return result;
}
if (!result || typeof result !== "object") {
return "";
}
if (typeof result.pubkey === "string") {
return result.pubkey;
}
if (typeof result.publicKey === "string") {
return result.publicKey;
}
return "";
}
export default {
id: PROVIDER_ID,
label: PROVIDER_LABEL,
description: PROVIDER_DESCRIPTION,
eyebrow: "Recommended",
tone: "accent",
badgeVariant: "info",
capabilities: PROVIDER_CAPABILITIES,
button: PROVIDER_BUTTON,
messages: PROVIDER_MESSAGES,
errorMessage: PROVIDER_MESSAGES.error,
async login({ nostrClient, options } = {}) {
if (!nostrClient || typeof nostrClient.loginWithExtension !== "function") {
const error = new Error("Extension login is not available in this environment.");
error.code = "provider-unavailable";
throw error;
}
const validator = (pubkey) => {
if (!accessControl.canAccess(pubkey)) {
if (accessControl.isBlacklisted(pubkey)) {
throw new Error("Your account has been blocked on this platform.");
}
throw new Error("Access restricted to admins and moderators users only.");
}
return true;
};
const result = await nostrClient.loginWithExtension({ ...options, validator });
const pubkey = normalizePubkey(result);
const signer =
result && typeof result === "object" && result.signer
? result.signer
: null;
return {
authType: PROVIDER_ID,
pubkey,
signer,
rawResult: result,
};
},
};