// Copyright (C) 2023 Vaughn Nugent // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . import { useSettings } from "./settings"; import { useAuthApi } from "./auth-api"; import { computed, ref, watch } from "vue"; import { find, isArray } from "lodash"; import { Endpoints, initApi } from "./server-api"; import { NostrRelay, NostrPubKey, EventMessage, NostrEvent } from './types' export const useNostrApi = (() => { const { currentConfig } = useSettings(); const { handleProtectedApicall, handleApiCall, handleProtectedMessage, loggedIn } = useAuthApi(); const nostrUrl = computed(() => currentConfig.value.nostrEndpoint || '/nostr') //Init the api endpooints const { execRequest } = initApi(nostrUrl); //Get the current selected key const selectedKey = ref({} as NostrPubKey) //Selected key is allowed from content script const onGetPubKey = () => ({ ...selectedKey.value }); const onDeleteKey = handleProtectedApicall(data => execRequest(Endpoints.DeleteKey, data)) //Set the selected key to the value const onSelectKey = handleProtectedMessage(data => (selectedKey.value = data, Promise.resolve())); const onGetAllKeys = handleProtectedApicall(async () => { //Get the keys from the server const data = await execRequest(Endpoints.GetKeys); //Response must be an array of key objects if (!isArray(data)) { return []; } //Make sure the selected keyid is in the list, otherwise unselect the key if (data?.length > 0) { if (!find(data, k => k.Id === selectedKey.value?.Id)) { selectedKey.value = null; } } return [...data] }) //Unprotect the signing handler so it can be called from the content script const onSignEvent = handleApiCall(async (data) => { //Set the key id from our current selection data.event.KeyId = selectedKey.value?.Id || ''; //Pass key selection error to server //Sign the event const event = await execRequest(Endpoints.SignEvent, data.event); return { event }; }) const onGetRelays = handleApiCall(async () => { //Get preferred relays for the current user const data = await execRequest(Endpoints.GetRelays) return [...data] }) const onSetRelay = handleProtectedApicall(data => execRequest(Endpoints.SetRelay, data)); const onNip04Encrypt = handleProtectedMessage(async (data) => { console.log('nip04.encrypt', data) return { ciphertext: 'ciphertext' } }) const onNip04Decrypt = handleProtectedMessage(async (data) => { console.log('nip04.decrypt', data) return { plaintext: 'plaintext' } }) //Clear the selected key if the user logs out watch(loggedIn, (li) => li ? null : selectedKey.value = null) return () => { return{ selectedKey, nostrUrl, onGetPubKey, onSelectKey, onGetAllKeys, onSignEvent, onGetRelays, onSetRelay, onNip04Encrypt, onNip04Decrypt, onDeleteKey } } })()