diff options
author | vnugent <public@vaughnnugent.com> | 2023-09-06 13:51:13 -0400 |
---|---|---|
committer | vnugent <public@vaughnnugent.com> | 2023-09-06 13:51:13 -0400 |
commit | cd8e865dad326f85ff2357ad90bbd6aa65dea68e (patch) | |
tree | 0d4a0bb8bafc4f807407e99c5e6bf4e1cb34217a /extension/src/entries/background/nostr-api.ts |
initial commit
Diffstat (limited to 'extension/src/entries/background/nostr-api.ts')
-rw-r--r-- | extension/src/entries/background/nostr-api.ts | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/extension/src/entries/background/nostr-api.ts b/extension/src/entries/background/nostr-api.ts new file mode 100644 index 0000000..fb9130b --- /dev/null +++ b/extension/src/entries/background/nostr-api.ts @@ -0,0 +1,124 @@ +// 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 <https://www.gnu.org/licenses/>. + +import { useSettings } from "./settings"; +import { useAuthApi } from "./auth-api"; +import { computed, ref, watch } from "vue"; + +import { find, isArray } from "lodash"; +import { BridgeMessage } from "webext-bridge"; +import { NostrRelay, NostrPubKey, EventMessage, NostrEvent } from './types' +import { Endpoints, initApi } from "./server-api"; + +export const useNostrApi = (() => { + + const { currentConfig } = useSettings(); + const { apiCall, protect, 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<NostrPubKey | null>({} as NostrPubKey) + + const onGetPubKey = () => { + //Selected key is allowed from content script + return { ...selectedKey.value } + } + + const onDeleteKey = protect<NostrPubKey>(({ data }) => apiCall(() => execRequest<NostrPubKey>(Endpoints.DeleteKey, data))) + + const onSelectKey = protect<NostrPubKey>(async ({ data }) => { + //Set the selected key to the value + selectedKey.value = data + }) + + const onGetAllKeys = protect(async () => { + return await apiCall(async () => { + + //Get the keys from the server + const data = await execRequest<NostrPubKey[]>(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 this handler so it can be called from the content script + const onSignEvent = (async ({ data }: BridgeMessage<EventMessage>) => { + //Set the key id from our current selection + data.event.KeyId = selectedKey.value?.Id || ''; //Pass key selection error to server + + //Sign the event + return await apiCall(async () => { + //Sign the event + const event = await execRequest<NostrEvent>(Endpoints.SignEvent, data.event); + return { event }; + }) + }) + + const onGetRelays = async () => { + return await apiCall(async () => { + //Get preferred relays for the current user + const data = await execRequest<NostrRelay[]>(Endpoints.GetRelays) + return [ ...data ] + }) + } + + + const onSetRelay = protect<NostrRelay>(({ data }) => apiCall(() => execRequest<NostrRelay>(Endpoints.SetRelay, data))); + + const onNip04Encrypt = protect(async ({ data }) => { + console.log('nip04.encrypt', data) + return { ciphertext: 'ciphertext' } + }) + + const onNip04Decrypt = protect(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 + } + } +})()
\ No newline at end of file |