signal-desktop/js/modules/signal.js

408 lines
12 KiB
JavaScript
Raw Normal View History

2022-05-31 17:38:23 +00:00
// Copyright 2018-2022 Signal Messenger, LLC
2020-10-30 15:34:04 -05:00
// SPDX-License-Identifier: AGPL-3.0-only
// The idea with this file is to make it webpackable for the style guide
const Backbone = require('../../ts/backbone');
const Crypto = require('../../ts/Crypto');
const Curve = require('../../ts/Curve');
const {
start: conversationControllerStart,
} = require('../../ts/ConversationController');
const Data = require('../../ts/sql/Client').default;
const EmojiLib = require('../../ts/components/emoji/lib');
2020-09-08 19:25:05 -07:00
const Groups = require('../../ts/groups');
const GroupChange = require('../../ts/groupChange');
const OS = require('../../ts/OS');
2021-07-09 12:36:10 -07:00
const Stickers = require('../../ts/types/Stickers');
2020-05-27 17:37:06 -04:00
const RemoteConfig = require('../../ts/RemoteConfig');
const Util = require('../../ts/util');
// Components
const {
AttachmentList,
} = require('../../ts/components/conversation/AttachmentList');
2021-05-28 12:15:17 -04:00
const { ChatColorPicker } = require('../../ts/components/ChatColorPicker');
const {
ConfirmationDialog,
} = require('../../ts/components/ConfirmationDialog');
const {
ContactModal,
} = require('../../ts/components/conversation/ContactModal');
const { Emojify } = require('../../ts/components/conversation/Emojify');
const {
MessageDetail,
} = require('../../ts/components/conversation/MessageDetail');
const { Quote } = require('../../ts/components/conversation/Quote');
2019-01-15 19:03:56 -08:00
const {
StagedLinkPreview,
} = require('../../ts/components/conversation/StagedLinkPreview');
2021-06-01 13:45:43 -07:00
const {
DisappearingTimeDialog,
} = require('../../ts/components/DisappearingTimeDialog');
const {
SystemTraySettingsCheckboxes,
} = require('../../ts/components/conversation/SystemTraySettingsCheckboxes');
2019-01-14 13:49:58 -08:00
// State
2021-05-28 12:15:17 -04:00
const {
createChatColorPicker,
} = require('../../ts/state/roots/createChatColorPicker');
const {
createConversationDetails,
} = require('../../ts/state/roots/createConversationDetails');
2021-06-14 15:01:00 -04:00
const { createApp } = require('../../ts/state/roots/createApp');
2021-04-27 15:35:35 -07:00
const {
createForwardMessageModal,
} = require('../../ts/state/roots/createForwardMessageModal');
const {
createGroupLinkManagement,
} = require('../../ts/state/roots/createGroupLinkManagement');
const {
createGroupV1MigrationModal,
} = require('../../ts/state/roots/createGroupV1MigrationModal');
const {
createGroupV2JoinModal,
} = require('../../ts/state/roots/createGroupV2JoinModal');
const { createLeftPane } = require('../../ts/state/roots/createLeftPane');
const {
createMessageDetail,
} = require('../../ts/state/roots/createMessageDetail');
2021-08-05 07:35:33 -05:00
const {
createConversationNotificationsSettings,
} = require('../../ts/state/roots/createConversationNotificationsSettings');
const {
createGroupV2Permissions,
} = require('../../ts/state/roots/createGroupV2Permissions');
const {
createPendingInvites,
} = require('../../ts/state/roots/createPendingInvites');
const {
createSafetyNumberViewer,
} = require('../../ts/state/roots/createSafetyNumberViewer');
const {
createStickerManager,
} = require('../../ts/state/roots/createStickerManager');
const {
createStickerPreviewModal,
} = require('../../ts/state/roots/createStickerPreviewModal');
2019-11-07 13:36:16 -08:00
const {
createShortcutGuideModal,
} = require('../../ts/state/roots/createShortcutGuideModal');
2019-01-14 13:49:58 -08:00
const { createStore } = require('../../ts/state/createStore');
2021-06-14 15:01:00 -04:00
const appDuck = require('../../ts/state/ducks/app');
2020-06-04 11:16:19 -07:00
const callingDuck = require('../../ts/state/ducks/calling');
2019-01-14 13:49:58 -08:00
const conversationsDuck = require('../../ts/state/ducks/conversations');
2019-05-24 16:58:27 -07:00
const emojisDuck = require('../../ts/state/ducks/emojis');
const expirationDuck = require('../../ts/state/ducks/expiration');
const itemsDuck = require('../../ts/state/ducks/items');
2021-04-27 15:35:35 -07:00
const linkPreviewsDuck = require('../../ts/state/ducks/linkPreviews');
const networkDuck = require('../../ts/state/ducks/network');
2019-08-09 16:12:29 -07:00
const searchDuck = require('../../ts/state/ducks/search');
const stickersDuck = require('../../ts/state/ducks/stickers');
const updatesDuck = require('../../ts/state/ducks/updates');
2019-01-14 13:49:58 -08:00
const userDuck = require('../../ts/state/ducks/user');
2019-11-07 13:36:16 -08:00
const conversationsSelectors = require('../../ts/state/selectors/conversations');
const searchSelectors = require('../../ts/state/selectors/search');
2019-11-07 13:36:16 -08:00
// Types
2021-07-14 16:39:52 -07:00
const AttachmentType = require('../../ts/types/Attachment');
2021-09-23 17:49:05 -07:00
const VisualAttachment = require('../../ts/types/VisualAttachment');
const MessageType = require('./types/message');
const { UUID } = require('../../ts/types/UUID');
const { Address } = require('../../ts/types/Address');
const { QualifiedAddress } = require('../../ts/types/QualifiedAddress');
// Processes / Services
2020-09-08 19:25:05 -07:00
const {
initializeGroupCredentialFetcher,
} = require('../../ts/services/groupCredentialFetcher');
const {
initializeNetworkObserver,
} = require('../../ts/services/networkObserver');
const {
initializeUpdateListener,
} = require('../../ts/services/updateListener');
2020-06-04 11:16:19 -07:00
const { calling } = require('../../ts/services/calling');
2020-09-08 20:56:23 -04:00
const {
enableStorageService,
2020-09-08 20:56:23 -04:00
eraseAllStorageServiceState,
runStorageServiceSyncJob,
storageServiceUploadJob,
} = require('../../ts/services/storage');
function initializeMigrations({
userDataPath,
getRegionCode,
Attachments,
Type,
VisualType,
logger,
}) {
if (!Attachments) {
return null;
}
const {
2019-08-06 17:40:25 -07:00
createAbsolutePathGetter,
createReader,
createWriterForExisting,
createWriterForNew,
createDoesExist,
2021-08-05 20:17:05 -04:00
getAvatarsPath,
2019-08-06 17:40:25 -07:00
getDraftPath,
getPath,
getStickersPath,
2021-11-02 18:01:13 -05:00
getBadgesPath,
getTempPath,
openFileInFolder,
saveAttachmentToDisk,
} = Attachments;
const {
getImageDimensions,
makeImageThumbnail,
2019-08-06 17:40:25 -07:00
makeObjectUrl,
makeVideoScreenshot,
2019-08-06 17:40:25 -07:00
revokeObjectUrl,
} = VisualType;
const attachmentsPath = getPath(userDataPath);
const readAttachmentData = createReader(attachmentsPath);
const loadAttachmentData = Type.loadData(readAttachmentData);
const loadContactData = MessageType.loadContactData(loadAttachmentData);
const loadPreviewData = MessageType.loadPreviewData(loadAttachmentData);
const loadQuoteData = MessageType.loadQuoteData(loadAttachmentData);
const loadStickerData = MessageType.loadStickerData(loadAttachmentData);
const getAbsoluteAttachmentPath = createAbsolutePathGetter(attachmentsPath);
const deleteOnDisk = Attachments.createDeleter(attachmentsPath);
const writeNewAttachmentData = createWriterForNew(attachmentsPath);
2021-11-11 16:43:05 -06:00
const copyIntoAttachmentsDirectory =
Attachments.copyIntoAttachmentsDirectory(attachmentsPath);
const doesAttachmentExist = createDoesExist(attachmentsPath);
const stickersPath = getStickersPath(userDataPath);
const writeNewStickerData = createWriterForNew(stickersPath);
const getAbsoluteStickerPath = createAbsolutePathGetter(stickersPath);
const deleteSticker = Attachments.createDeleter(stickersPath);
const readStickerData = createReader(stickersPath);
2021-11-02 18:01:13 -05:00
const badgesPath = getBadgesPath(userDataPath);
const getAbsoluteBadgeImageFilePath = createAbsolutePathGetter(badgesPath);
const writeNewBadgeImageFileData = createWriterForNew(badgesPath, '.svg');
const tempPath = getTempPath(userDataPath);
const getAbsoluteTempPath = createAbsolutePathGetter(tempPath);
const writeNewTempData = createWriterForNew(tempPath);
const deleteTempFile = Attachments.createDeleter(tempPath);
const readTempData = createReader(tempPath);
2021-11-11 16:43:05 -06:00
const copyIntoTempDirectory =
Attachments.copyIntoAttachmentsDirectory(tempPath);
2019-08-06 17:40:25 -07:00
const draftPath = getDraftPath(userDataPath);
const getAbsoluteDraftPath = createAbsolutePathGetter(draftPath);
const writeNewDraftData = createWriterForNew(draftPath);
const deleteDraftFile = Attachments.createDeleter(draftPath);
const readDraftData = createReader(draftPath);
2021-08-05 20:17:05 -04:00
const avatarsPath = getAvatarsPath(userDataPath);
const getAbsoluteAvatarPath = createAbsolutePathGetter(avatarsPath);
const writeNewAvatarData = createWriterForNew(avatarsPath);
const deleteAvatar = Attachments.createDeleter(avatarsPath);
return {
attachmentsPath,
copyIntoAttachmentsDirectory,
2019-08-05 13:53:15 -07:00
copyIntoTempDirectory,
deleteAttachmentData: deleteOnDisk,
2021-08-05 20:17:05 -04:00
deleteAvatar,
2019-08-06 17:40:25 -07:00
deleteDraftFile,
deleteExternalMessageFiles: MessageType.deleteAllExternalFiles({
deleteAttachmentData: Type.deleteData(deleteOnDisk),
deleteOnDisk,
}),
deleteSticker,
deleteTempFile,
doesAttachmentExist,
getAbsoluteAttachmentPath,
2021-08-05 20:17:05 -04:00
getAbsoluteAvatarPath,
2021-11-02 18:01:13 -05:00
getAbsoluteBadgeImageFilePath,
2019-08-06 17:40:25 -07:00
getAbsoluteDraftPath,
getAbsoluteStickerPath,
2019-08-05 13:53:15 -07:00
getAbsoluteTempPath,
loadAttachmentData,
loadContactData,
loadMessage: MessageType.createAttachmentLoader(loadAttachmentData),
2019-01-15 19:03:56 -08:00
loadPreviewData,
loadQuoteData,
loadStickerData,
openFileInFolder,
2018-12-13 13:41:42 -08:00
readAttachmentData,
2019-08-06 17:40:25 -07:00
readDraftData,
readStickerData,
readTempData,
saveAttachmentToDisk,
processNewAttachment: attachment =>
MessageType.processNewAttachment(attachment, {
writeNewAttachmentData,
getAbsoluteAttachmentPath,
makeObjectUrl,
revokeObjectUrl,
getImageDimensions,
makeImageThumbnail,
makeVideoScreenshot,
logger,
}),
processNewSticker: stickerData =>
MessageType.processNewSticker(stickerData, {
writeNewStickerData,
getAbsoluteStickerPath,
getImageDimensions,
logger,
}),
processNewEphemeralSticker: stickerData =>
MessageType.processNewSticker(stickerData, {
writeNewStickerData: writeNewTempData,
getAbsoluteStickerPath: getAbsoluteTempPath,
getImageDimensions,
logger,
}),
upgradeMessageSchema: (message, options = {}) => {
const { maxVersion } = options;
return MessageType.upgradeSchema(message, {
writeNewAttachmentData,
getRegionCode,
getAbsoluteAttachmentPath,
makeObjectUrl,
revokeObjectUrl,
getImageDimensions,
makeImageThumbnail,
makeVideoScreenshot,
logger,
maxVersion,
});
},
writeMessageAttachments: MessageType.createAttachmentDataWriter({
writeExistingAttachmentData: createWriterForExisting(attachmentsPath),
logger,
}),
writeNewAttachmentData: createWriterForNew(attachmentsPath),
2021-08-05 20:17:05 -04:00
writeNewAvatarData,
2019-08-06 17:40:25 -07:00
writeNewDraftData,
2021-11-02 18:01:13 -05:00
writeNewBadgeImageFileData,
};
}
exports.setup = (options = {}) => {
const { Attachments, userDataPath, getRegionCode, logger } = options;
const Migrations = initializeMigrations({
userDataPath,
getRegionCode,
Attachments,
Type: AttachmentType,
VisualType: VisualAttachment,
logger,
});
const Components = {
AttachmentList,
2021-05-28 12:15:17 -04:00
ChatColorPicker,
ConfirmationDialog,
ContactModal,
Emojify,
MessageDetail,
Quote,
2019-01-15 19:03:56 -08:00
StagedLinkPreview,
2021-06-01 13:45:43 -07:00
DisappearingTimeDialog,
SystemTraySettingsCheckboxes,
};
2019-01-14 13:49:58 -08:00
const Roots = {
2021-06-14 15:01:00 -04:00
createApp,
2021-05-28 12:15:17 -04:00
createChatColorPicker,
createConversationDetails,
2021-04-27 15:35:35 -07:00
createForwardMessageModal,
createGroupLinkManagement,
createGroupV1MigrationModal,
createGroupV2JoinModal,
createGroupV2Permissions,
2019-01-14 13:49:58 -08:00
createLeftPane,
createMessageDetail,
2021-08-05 07:35:33 -05:00
createConversationNotificationsSettings,
createPendingInvites,
createSafetyNumberViewer,
2019-11-07 13:36:16 -08:00
createShortcutGuideModal,
createStickerManager,
createStickerPreviewModal,
2019-01-14 13:49:58 -08:00
};
2019-01-14 13:49:58 -08:00
const Ducks = {
2021-06-14 15:01:00 -04:00
app: appDuck,
2020-06-04 11:16:19 -07:00
calling: callingDuck,
2019-01-14 13:49:58 -08:00
conversations: conversationsDuck,
2019-05-24 16:58:27 -07:00
emojis: emojisDuck,
expiration: expirationDuck,
items: itemsDuck,
2021-04-27 15:35:35 -07:00
linkPreviews: linkPreviewsDuck,
network: networkDuck,
updates: updatesDuck,
2019-01-14 13:49:58 -08:00
user: userDuck,
2019-08-09 16:12:29 -07:00
search: searchDuck,
stickers: stickersDuck,
2019-01-14 13:49:58 -08:00
};
2019-11-07 13:36:16 -08:00
const Selectors = {
conversations: conversationsSelectors,
search: searchSelectors,
2019-11-07 13:36:16 -08:00
};
const Services = {
2020-09-08 20:56:23 -04:00
calling,
enableStorageService,
2020-09-08 20:56:23 -04:00
eraseAllStorageServiceState,
2020-09-08 19:25:05 -07:00
initializeGroupCredentialFetcher,
initializeNetworkObserver,
initializeUpdateListener,
2020-09-08 20:56:23 -04:00
runStorageServiceSyncJob,
storageServiceUploadJob,
};
2019-01-14 13:49:58 -08:00
const State = {
createStore,
Roots,
Ducks,
2019-11-07 13:36:16 -08:00
Selectors,
2019-01-14 13:49:58 -08:00
};
const Types = {
Message: MessageType,
2021-09-23 17:49:05 -07:00
// Mostly for debugging
UUID,
Address,
QualifiedAddress,
};
return {
Backbone,
Components,
Crypto,
Curve,
conversationControllerStart,
Data,
EmojiLib,
2020-09-08 19:25:05 -07:00
Groups,
GroupChange,
Migrations,
OS,
2020-05-27 17:37:06 -04:00
RemoteConfig,
Services,
2019-01-14 13:49:58 -08:00
State,
Stickers,
Types,
Util,
};
};