Qortal-Hub/src/background-cases.ts

2171 lines
50 KiB
TypeScript

import {
addDataPublishes,
addEnteredQmailTimestamp,
addTimestampEnterChat,
addTimestampGroupAnnouncement,
addTimestampMention,
addUserSettings,
banFromGroup,
cancelBan,
cancelInvitationToGroup,
checkLocalFunc,
checkNewMessages,
checkThreads,
clearAllNotifications,
createEndpoint,
createGroup,
decryptDirectFunc,
decryptSingleForPublishes,
decryptSingleFunc,
decryptWallet,
findUsableApi,
getApiKeyFromStorage,
getBalanceInfo,
getCustomNodesFromStorage,
getDataPublishes,
getEnteredQmailTimestamp,
getGroupDataSingle,
getKeyPair,
getLTCBalance,
getLastRef,
getNameInfo,
getTempPublish,
getTimestampEnterChat,
getTimestampGroupAnnouncement,
getTimestampMention,
getUserInfo,
getUserSettings,
handleActiveGroupDataFromSocket,
inviteToGroup,
joinGroup,
kickFromGroup,
leaveGroup,
makeAdmin,
notifyAdminRegenerateSecretKey,
pauseAllQueues,
processTransactionVersion2,
registerName,
removeAdmin,
resumeAllQueues,
saveTempPublish,
sendChatDirect,
sendChatGroup,
sendChatNotification,
sendCoin,
setChatHeads,
setGroupData,
updateThreadActivity,
walletVersion,
} from './background';
import {
decryptGroupEncryption,
encryptAndPublishSymmetricKeyGroupChat,
encryptAndPublishSymmetricKeyGroupChatForAdmins,
publishGroupEncryptedResource,
publishOnQDN,
} from './backgroundFunctions/encryption';
import { PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY } from './constants/codes';
import Base58 from './deps/Base58';
import { encryptSingle } from './qdn/encryption/group-encryption';
import { _createPoll, _voteOnPoll } from './qortalRequests/get';
import { createTransaction } from './transactions/transactions';
import { getData, storeData } from './utils/chromeStorage';
export function versionCase(request, event) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'version',
payload: { version: '1.0' },
type: 'backgroundMessageResponse',
},
event.origin
);
}
export async function getWalletInfoCase(request, event) {
try {
const response = await getKeyPair();
try {
const walletInfo = await getData('walletInfo').catch((error) => null);
if (walletInfo) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getWalletInfo',
payload: { walletInfo, hasKeyPair: true },
type: 'backgroundMessageResponse',
},
event.origin
);
} else {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getWalletInfo',
error: 'No wallet info found',
type: 'backgroundMessageResponse',
},
event.origin
);
}
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getWalletInfo',
error: 'No wallet info found',
type: 'backgroundMessageResponse',
},
event.origin
);
}
} catch (error) {
try {
const walletInfo = await getData('walletInfo').catch((error) => null);
if (walletInfo) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getWalletInfo',
payload: { walletInfo, hasKeyPair: false },
type: 'backgroundMessageResponse',
},
event.origin
);
} else {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getWalletInfo',
error: 'Wallet not authenticated',
type: 'backgroundMessageResponse',
},
event.origin
);
}
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getWalletInfo',
error: 'Wallet not authenticated',
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
}
export async function validApiCase(request, event) {
try {
const usableApi = await findUsableApi();
event.source.postMessage(
{
requestId: request.requestId,
action: 'validApi',
payload: usableApi,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'validApi',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function nameCase(request, event) {
try {
const response = await getNameInfo();
event.source.postMessage(
{
requestId: request.requestId,
action: 'name',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'name',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function userInfoCase(request, event) {
try {
const response = await getUserInfo();
event.source.postMessage(
{
requestId: request.requestId,
action: 'userInfo',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'userInfo',
error: 'User not authenticated',
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function decryptWalletCase(request, event) {
try {
const { password, wallet } = request.payload;
const response = await decryptWallet({
password,
wallet,
walletVersion: wallet?.version || walletVersion,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptWallet',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptWallet',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function balanceCase(request, event) {
try {
const response = await getBalanceInfo();
event.source.postMessage(
{
requestId: request.requestId,
action: 'balance',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'balance',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function ltcBalanceCase(request, event) {
try {
const response = await getLTCBalance();
event.source.postMessage(
{
requestId: request.requestId,
action: 'ltcBalance',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'ltcBalance',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function sendCoinCase(request, event) {
try {
const { receiver, password, amount } = request.payload;
const { res } = await sendCoin({ receiver, password, amount });
if (!res?.success) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendCoin',
error: res?.data?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
return;
}
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendCoin',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendCoin',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function inviteToGroupCase(request, event) {
try {
const { groupId, qortalAddress, inviteTime } = request.payload;
const response = await inviteToGroup({
groupId,
qortalAddress,
inviteTime,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'inviteToGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'inviteToGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function saveTempPublishCase(request, event) {
try {
const { data, key } = request.payload;
const response = await saveTempPublish({ data, key });
event.source.postMessage(
{
requestId: request.requestId,
action: 'saveTempPublish',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'saveTempPublish',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getTempPublishCase(request, event) {
try {
const response = await getTempPublish();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getTempPublish',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getTempPublish',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function createGroupCase(request, event) {
try {
const {
groupName,
groupDescription,
groupType,
groupApprovalThreshold,
minBlock,
maxBlock,
} = request.payload;
const response = await createGroup({
groupName,
groupDescription,
groupType,
groupApprovalThreshold,
minBlock,
maxBlock,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'createGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'createGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function cancelInvitationToGroupCase(request, event) {
try {
const { groupId, qortalAddress } = request.payload;
const response = await cancelInvitationToGroup({ groupId, qortalAddress });
event.source.postMessage(
{
requestId: request.requestId,
action: 'cancelInvitationToGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'cancelInvitationToGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function leaveGroupCase(request, event) {
try {
const { groupId } = request.payload;
const response = await leaveGroup({ groupId });
event.source.postMessage(
{
requestId: request.requestId,
action: 'leaveGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'leaveGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function joinGroupCase(request, event) {
try {
const { groupId } = request.payload;
const response = await joinGroup({ groupId });
event.source.postMessage(
{
requestId: request.requestId,
action: 'joinGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'joinGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function kickFromGroupCase(request, event) {
try {
const { groupId, qortalAddress, rBanReason } = request.payload;
const response = await kickFromGroup({
groupId,
qortalAddress,
rBanReason,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'kickFromGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'kickFromGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function banFromGroupCase(request, event) {
try {
const { groupId, qortalAddress, rBanReason, rBanTime } = request.payload;
const response = await banFromGroup({
groupId,
qortalAddress,
rBanReason,
rBanTime,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'banFromGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'banFromGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function addDataPublishesCase(request, event) {
try {
const { data, groupId, type } = request.payload;
const response = await addDataPublishes(data, groupId, type);
event.source.postMessage(
{
requestId: request.requestId,
action: 'addDataPublishes',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'addDataPublishes',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getDataPublishesCase(request, event) {
try {
const { groupId, type } = request.payload;
const response = await getDataPublishes(groupId, type);
event.source.postMessage(
{
requestId: request.requestId,
action: 'getDataPublishes',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getDataPublishes',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function addUserSettingsCase(request, event) {
try {
const { keyValue } = request.payload;
const response = await addUserSettings({ keyValue });
event.source.postMessage(
{
requestId: request.requestId,
action: 'addUserSettings',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'addUserSettings',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getUserSettingsCase(request, event) {
try {
const { key } = request.payload;
const response = await getUserSettings({ key });
event.source.postMessage(
{
requestId: request.requestId,
action: 'getUserSettings',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getUserSettings',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function cancelBanCase(request, event) {
try {
const { groupId, qortalAddress } = request.payload;
const response = await cancelBan({ groupId, qortalAddress });
event.source.postMessage(
{
requestId: request.requestId,
action: 'cancelBan',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'cancelBan',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function registerNameCase(request, event) {
try {
const { name } = request.payload;
const response = await registerName({ name });
event.source.postMessage(
{
requestId: request.requestId,
action: 'registerName',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'registerName',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function createPollCase(request, event) {
try {
const { pollName, pollDescription, pollOptions } = request.payload;
const resCreatePoll = await _createPoll(
{
pollName,
pollDescription,
options: pollOptions,
},
true,
true // skip permission
);
event.source.postMessage(
{
requestId: request.requestId,
action: 'registerName',
payload: resCreatePoll,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'registerName',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function voteOnPollCase(request, event) {
try {
const res = await _voteOnPoll(request.payload, true, true);
event.source.postMessage(
{
requestId: request.requestId,
action: 'registerName',
payload: res,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'registerName',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function makeAdminCase(request, event) {
try {
const { groupId, qortalAddress } = request.payload;
const response = await makeAdmin({ groupId, qortalAddress });
event.source.postMessage(
{
requestId: request.requestId,
action: 'makeAdmin',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'makeAdmin',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function removeAdminCase(request, event) {
try {
const { groupId, qortalAddress } = request.payload;
const response = await removeAdmin({ groupId, qortalAddress });
event.source.postMessage(
{
requestId: request.requestId,
action: 'removeAdmin',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'removeAdmin',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function notificationCase(request, event) {
try {
const notificationId = 'chat_notification_' + Date.now(); // Create a unique ID
// chrome.notifications.create(notificationId, {
// type: "basic",
// iconUrl: "qort.png", // Add an appropriate icon for chat notifications
// title: "New Group Message!",
// message: "You have received a new message from one of your groups",
// priority: 2, // Use the maximum priority to ensure it's
// });
// Set a timeout to clear the notification after 'timeout' milliseconds
// setTimeout(() => {
// chrome.notifications.clear(notificationId);
// }, 3000);
// event.source.postMessage(
// {
// requestId: request.requestId,
// action: "notification",
// payload: true,
// type: "backgroundMessageResponse",
// },
// event.origin
// );
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'notification',
error: 'Error displaying notifaction',
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function addTimestampEnterChatCase(request, event) {
try {
const { groupId, timestamp } = request.payload;
const response = await addTimestampEnterChat({ groupId, timestamp });
event.source.postMessage(
{
requestId: request.requestId,
action: 'addTimestampEnterChat',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'addTimestampEnterChat',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function setApiKeyCase(request, event) {
try {
const payload = request.payload;
storeData('apiKey', payload);
event.source.postMessage(
{
requestId: request.requestId,
action: 'setApiKey',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'setApiKey',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function setCustomNodesCase(request, event) {
try {
const nodes = request.payload;
storeData('customNodes', nodes);
event.source.postMessage(
{
requestId: request.requestId,
action: 'setCustomNodes',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'setCustomNodes',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getApiKeyCase(request, event) {
try {
const response = await getApiKeyFromStorage();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getApiKey',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getApiKey',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getCustomNodesFromStorageCase(request, event) {
try {
const response = await getCustomNodesFromStorage();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getCustomNodesFromStorage',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getCustomNodesFromStorage',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function notifyAdminRegenerateSecretKeyCase(request, event) {
try {
const { groupName, adminAddress } = request.payload;
const response = await notifyAdminRegenerateSecretKey({
groupName,
adminAddress,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'notifyAdminRegenerateSecretKey',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'notifyAdminRegenerateSecretKey',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function addGroupNotificationTimestampCase(request, event) {
try {
const { groupId, timestamp } = request.payload;
const response = await addTimestampGroupAnnouncement({
groupId,
timestamp,
seenTimestamp: true,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'addGroupNotificationTimestamp',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'addGroupNotificationTimestamp',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function addEnteredQmailTimestampCase(request, event) {
try {
const response = await addEnteredQmailTimestamp();
event.source.postMessage(
{
requestId: request.requestId,
action: 'addEnteredQmailTimestamp',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'addEnteredQmailTimestamp',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getEnteredQmailTimestampCase(request, event) {
try {
const response = await getEnteredQmailTimestamp();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getEnteredQmailTimestamp',
payload: { timestamp: response },
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getEnteredQmailTimestamp',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function clearAllNotificationsCase(request, event) {
try {
await clearAllNotifications();
event.source.postMessage(
{
requestId: request.requestId,
action: 'clearAllNotifications',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'clearAllNotifications',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function setGroupDataCase(request, event) {
try {
const { groupId, secretKeyData, secretKeyResource, admins } =
request.payload;
const response = await setGroupData({
groupId,
secretKeyData,
secretKeyResource,
admins,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'setGroupData',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'setGroupData',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getGroupDataSingleCase(request, event) {
try {
const { groupId } = request.payload;
const response = await getGroupDataSingle({ groupId });
event.source.postMessage(
{
requestId: request.requestId,
action: 'getGroupDataSingle',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getGroupDataSingle',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getTimestampEnterChatCase(request, event) {
try {
const response = await getTimestampEnterChat();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getTimestampEnterChat',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getTimestampEnterChat',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function listActionsCase(request, event) {
try {
const { type, listName = '', items = [] } = request.payload;
let responseData;
if (type === 'get') {
const url = await createEndpoint(`/lists/${listName}`);
const response = await fetch(url);
if (!response.ok) throw new Error('Failed to fetch');
responseData = await response.json();
} else if (type === 'remove') {
const url = await createEndpoint(`/lists/${listName}`);
const body = {
items: items,
};
const bodyToString = JSON.stringify(body);
const response = await fetch(url, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: bodyToString,
});
if (!response.ok) throw new Error('Failed to remove from list');
let res;
try {
res = await response.clone().json();
} catch (e) {
res = await response.text();
}
responseData = res;
} else if (type === 'add') {
const url = await createEndpoint(`/lists/${listName}`);
const body = {
items: items,
};
const bodyToString = JSON.stringify(body);
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: bodyToString,
});
if (!response.ok) throw new Error('Failed to add to list');
let res;
try {
res = await response.clone().json();
} catch (e) {
res = await response.text();
}
responseData = res;
}
event.source.postMessage(
{
requestId: request.requestId,
action: 'listActions',
payload: responseData,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'listActions',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getTimestampMentionCase(request, event) {
try {
const response = await getTimestampMention();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getTimestampMention',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getTimestampMention',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function addTimestampMentionCase(request, event) {
try {
const { groupId, timestamp } = request.payload;
const response = await addTimestampMention({ groupId, timestamp });
event.source.postMessage(
{
requestId: request.requestId,
action: 'addTimestampMention',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'addTimestampMention',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getGroupNotificationTimestampCase(request, event) {
try {
const response = await getTimestampGroupAnnouncement();
event.source.postMessage(
{
requestId: request.requestId,
action: 'getGroupNotificationTimestamp',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getGroupNotificationTimestamp',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function encryptAndPublishSymmetricKeyGroupChatCase(
request,
event
) {
try {
const { groupId, previousData, previousNumber } = request.payload;
const { data, numberOfMembers } =
await encryptAndPublishSymmetricKeyGroupChat({
groupId,
previousData,
previousNumber,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'encryptAndPublishSymmetricKeyGroupChat',
payload: data,
type: 'backgroundMessageResponse',
},
event.origin
);
if (!previousData) {
try {
sendChatGroup({
groupId,
typeMessage: undefined,
chatReference: undefined,
messageText: PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY,
});
} catch (error) {
// error in sending chat message
}
}
try {
sendChatNotification(data, groupId, previousData, numberOfMembers);
} catch (error) {
// error in sending notification
}
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'encryptAndPublishSymmetricKeyGroupChat',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function encryptAndPublishSymmetricKeyGroupChatForAdminsCase(
request,
event
) {
try {
const { groupId, previousData, admins } = request.payload;
const { data, numberOfMembers } =
await encryptAndPublishSymmetricKeyGroupChatForAdmins({
groupId,
previousData,
admins,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'encryptAndPublishSymmetricKeyGroupChatForAdmins',
payload: data,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'encryptAndPublishSymmetricKeyGroupChat',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function publishGroupEncryptedResourceCase(request, event) {
try {
const { encryptedData, identifier } = request.payload;
const response = await publishGroupEncryptedResource({
encryptedData,
identifier,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'publishGroupEncryptedResource',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'publishGroupEncryptedResource',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function publishOnQDNCase(request, event) {
try {
const {
data,
name = '',
identifier,
service,
title,
description,
category,
tag1,
tag2,
tag3,
tag4,
tag5,
uploadType,
} = request.payload;
const response = await publishOnQDN({
data,
name,
identifier,
service,
title,
description,
category,
tag1,
tag2,
tag3,
tag4,
tag5,
uploadType,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'publishOnQDN',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'publishOnQDN',
error: error?.message || 'Unable to publish',
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function handleActiveGroupDataFromSocketCase(request, event) {
try {
const { groups, directs } = request.payload;
const response = await handleActiveGroupDataFromSocket({ groups, directs });
event.source.postMessage(
{
requestId: request.requestId,
action: 'handleActiveGroupDataFromSocket',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'handleActiveGroupDataFromSocket',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getThreadActivityCase(request, event) {
try {
const response = await checkThreads(true);
event.source.postMessage(
{
requestId: request.requestId,
action: 'getThreadActivity',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getThreadActivity',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function updateThreadActivityCase(request, event) {
try {
const { threadId, qortalName, groupId, thread } = request.payload;
const response = await updateThreadActivity({
threadId,
qortalName,
groupId,
thread,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'updateThreadActivity',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'updateThreadActivity',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function decryptGroupEncryptionCase(request, event) {
try {
const { data } = request.payload;
const response = await decryptGroupEncryption({ data });
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptGroupEncryption',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptGroupEncryption',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function encryptSingleCase(request, event) {
try {
const { data, secretKeyObject, typeNumber } = request.payload;
const response = await encryptSingle({
data64: data,
secretKeyObject,
typeNumber,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'encryptSingle',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'encryptSingle',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function decryptSingleCase(request, event) {
try {
const { data, secretKeyObject, skipDecodeBase64 } = request.payload;
const response = await decryptSingleFunc({
messages: data,
secretKeyObject,
skipDecodeBase64,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptSingle',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptSingle',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function pauseAllQueuesCase(request, event) {
try {
await pauseAllQueues();
event.source.postMessage(
{
requestId: request.requestId,
action: 'pauseAllQueues',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'pauseAllQueues',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function resumeAllQueuesCase(request, event) {
try {
await resumeAllQueues();
event.source.postMessage(
{
requestId: request.requestId,
action: 'resumeAllQueues',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'resumeAllQueues',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function checkLocalCase(request, event) {
try {
const response = await checkLocalFunc();
event.source.postMessage(
{
requestId: request.requestId,
action: 'pauseAllQueues',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'checkLocal',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function decryptSingleForPublishesCase(request, event) {
try {
const { data, secretKeyObject, skipDecodeBase64 } = request.payload;
const response = await decryptSingleForPublishes({
messages: data,
secretKeyObject,
skipDecodeBase64,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptSingleForPublishes',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptSingle',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function decryptDirectCase(request, event) {
try {
const { data, involvingAddress } = request.payload;
const response = await decryptDirectFunc({
messages: data,
involvingAddress,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptDirect',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'decryptDirect',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function sendChatGroupCase(request, event) {
try {
const {
groupId,
typeMessage = undefined,
chatReference = undefined,
messageText,
} = request.payload;
const response = await sendChatGroup({
groupId,
typeMessage,
chatReference,
messageText,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendChatGroup',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendChatGroup',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function sendChatDirectCase(request, event) {
try {
const {
directTo,
typeMessage = undefined,
chatReference = undefined,
messageText,
publicKeyOfRecipient,
address,
otherData,
} = request.payload;
const response = await sendChatDirect({
directTo,
chatReference,
messageText,
typeMessage,
publicKeyOfRecipient,
address,
otherData,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendChatDirect',
payload: response,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendChatDirect',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function setupGroupWebsocketCase(request, event) {
try {
checkNewMessages();
checkThreads();
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendChatDirect',
payload: true,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'sendChatDirect',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function createRewardShareCase(request, event) {
try {
const { recipientPublicKey } = request.payload;
const resKeyPair = await getKeyPair();
const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = {
privateKey: uint8PrivateKey,
publicKey: uint8PublicKey,
};
let lastRef = await getLastRef();
const tx = await createTransaction(38, keyPair, {
recipientPublicKey,
percentageShare: 0,
lastReference: lastRef,
});
const signedBytes = Base58.encode(tx.signedBytes);
const res = await processTransactionVersion2(signedBytes);
if (!res?.signature)
throw new Error('Transaction was not able to be processed');
event.source.postMessage(
{
requestId: request.requestId,
action: 'createRewardShare',
payload: res,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'createRewardShare',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function removeRewardShareCase(request, event) {
try {
const { rewardShareKeyPairPublicKey, recipient, percentageShare } =
request.payload;
const resKeyPair = await getKeyPair();
const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = {
privateKey: uint8PrivateKey,
publicKey: uint8PublicKey,
};
let lastRef = await getLastRef();
const tx = await createTransaction(381, keyPair, {
rewardShareKeyPairPublicKey,
recipient,
percentageShare,
lastReference: lastRef,
});
const signedBytes = Base58.encode(tx.signedBytes);
const res = await processTransactionVersion2(signedBytes);
if (!res?.signature)
throw new Error('Transaction was not able to be processed');
event.source.postMessage(
{
requestId: request.requestId,
action: 'removeRewardShare',
payload: res,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'removeRewardShare',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}
export async function getRewardSharePrivateKeyCase(request, event) {
try {
const { recipientPublicKey } = request.payload;
const resKeyPair = await getKeyPair();
const parsedData = resKeyPair;
const uint8PrivateKey = Base58.decode(parsedData.privateKey);
const uint8PublicKey = Base58.decode(parsedData.publicKey);
const keyPair = {
privateKey: uint8PrivateKey,
publicKey: uint8PublicKey,
};
let lastRef = await getLastRef();
const tx = await createTransaction(38, keyPair, {
recipientPublicKey,
percentageShare: 0,
lastReference: lastRef,
});
event.source.postMessage(
{
requestId: request.requestId,
action: 'getRewardSharePrivateKey',
payload: tx?._base58RewardShareSeed,
type: 'backgroundMessageResponse',
},
event.origin
);
} catch (error) {
event.source.postMessage(
{
requestId: request.requestId,
action: 'getRewardSharePrivateKey',
error: error?.message,
type: 'backgroundMessageResponse',
},
event.origin
);
}
}