aboutsummaryrefslogtreecommitdiff
path: root/extension/src/entries/contentScript/util.ts
diff options
context:
space:
mode:
Diffstat (limited to 'extension/src/entries/contentScript/util.ts')
-rw-r--r--extension/src/entries/contentScript/util.ts96
1 files changed, 58 insertions, 38 deletions
diff --git a/extension/src/entries/contentScript/util.ts b/extension/src/entries/contentScript/util.ts
index aa6aac3..09b515a 100644
--- a/extension/src/entries/contentScript/util.ts
+++ b/extension/src/entries/contentScript/util.ts
@@ -49,17 +49,16 @@ const registerWindowHandler = (store: Store, extName: string) => {
const { selectedKey } = storeToRefs(store)
const { nostr } = store.plugins;
- //Only listen for messages if injection is enabled
- window.addEventListener('message', async ({ source, data, origin }) => {
+ const onAsyncCall = async ({ source, data, origin } : MessageEvent<any>) => {
//clean any junk/methods with json parse/stringify
data = JSON.parse(JSON.stringify(data))
- const invokePrompt = async (cb:(...args:any) => Promise<any>) => {
+ const requestPermission = async (cb: (...args: any) => Promise<any>) => {
//await propmt for user to allow the request
const allow = await _promptHandler.invoke({ ...data, origin })
//send request to background
- return response = allow ? await cb() : { error: 'User denied permission' }
+ return allow ? await cb() : { error: 'User denied permission' }
}
//Confirm the message format is correct
@@ -71,45 +70,66 @@ const registerWindowHandler = (store: Store, extName: string) => {
return
}
- // pass on to background
- var response;
- await apiCall(async () => {
- switch (data.type) {
- case 'getPublicKey':
- return invokePrompt(async () => selectedKey.value?.PublicKey)
- case 'signEvent':
- return invokePrompt(async () => {
- const event = data.payload.event
-
- //Set key id to selected key
- event.KeyId = selectedKey.value!.Id
- event.pubkey = selectedKey.value!.PublicKey;
-
- return await nostr.signEvent(event);
- })
- //Check the public key against selected key
- case 'getRelays':
- return invokePrompt(async () => await nostr.getRelays())
- case 'nip04.encrypt':
- return invokePrompt(async () => await nostr.nip04Encrypt({
+ switch (data.type) {
+ case 'getPublicKey':
+ return requestPermission(async () => selectedKey.value?.PublicKey);
+ case 'signEvent':
+ return requestPermission(async () => {
+ const event = data.payload.event
+ return await nostr.signEvent({
+ ...event,
+ KeyId: selectedKey.value!.Id,
+ pubkey: selectedKey.value!.PublicKey
+ });
+ })
+ //Check the public key against selected key
+ case 'getRelays':
+ return requestPermission(async () => await nostr.getRelays())
+ case 'nip04.encrypt':
+ return requestPermission(async () => {
+ return await nostr.nip04Encrypt({
pubkey: data.payload.peer,
content: data.payload.plaintext,
- //Set selected key id as our desired decryption key
- KeyId: selectedKey.value!.Id
- }))
- case 'nip04.decrypt':
- return invokePrompt(async () => await nostr.nip04Decrypt({
- pubkey: data.payload.peer,
- content: data.payload.ciphertext,
- //Set selected key id as our desired decryption key
+ //Set selected key id as our desired encryption key
KeyId: selectedKey.value!.Id
- }))
- default:
- throw new Error('Unknown nostr message type')
+ })
+ })
+ case 'nip04.decrypt':
+ return requestPermission(async () => {
+ const result = await apiCall(async () => {
+ return await nostr.nip04Decrypt({
+ pubkey: data.payload.peer,
+ content: data.payload.ciphertext,
+ //Set selected key id as our desired decryption key
+ KeyId: selectedKey.value!.Id
+ })
+ })
+ return isNil(result) ? 'Error: Failed to decrypt message' : result
+ })
+ }
+ }
+
+ //Only listen for messages if injection is enabled
+ window.addEventListener('message', async (args) => {
+
+ //Wrap in apicall to display errors
+ await apiCall(async () => {
+ let response;
+
+ try{
+ response = await onAsyncCall(args)
+ }
+ catch(e: any){
+ const error = JSON.stringify(e)
+ response = { error }
+ //rethrow for logging
+ throw e;
+ }
+ finally{
+ // always return response message, must have the same id as the request
+ window.postMessage({ ext: extName, id: args.data.id, response }, origin);
}
})
- // return response message, must have the same id as the request
- window.postMessage({ ext: extName, id: data.id, response }, origin);
});
}