Refactor: Move data-access code to Typescript w/ shared interface
This commit is contained in:
		
					parent
					
						
							
								9ab54b9b83
							
						
					
				
			
			
				commit
				
					
						6b094e1514
					
				
			
		
					 35 changed files with 1695 additions and 598 deletions
				
			
		
							
								
								
									
										382
									
								
								ts/sql/Interface.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										382
									
								
								ts/sql/Interface.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,382 @@
 | 
			
		|||
import { LocaleMessagesType } from '../types/I18N';
 | 
			
		||||
 | 
			
		||||
export type AttachmentDownloadJobType = any;
 | 
			
		||||
export type ConverationMetricsType = any;
 | 
			
		||||
export type ConversationType = any;
 | 
			
		||||
export type EmojiType = any;
 | 
			
		||||
export type IdentityKeyType = any;
 | 
			
		||||
export type ItemType = any;
 | 
			
		||||
export type MessageType = any;
 | 
			
		||||
export type MessageTypeUnhydrated = any;
 | 
			
		||||
export type PreKeyType = any;
 | 
			
		||||
export type SearchResultMessageType = any;
 | 
			
		||||
export type SessionType = any;
 | 
			
		||||
export type SignedPreKeyType = any;
 | 
			
		||||
export type StickerPackStatusType = string;
 | 
			
		||||
export type StickerPackType = any;
 | 
			
		||||
export type StickerType = any;
 | 
			
		||||
export type UnprocessedType = any;
 | 
			
		||||
 | 
			
		||||
export type BackboneConversationModelType = any;
 | 
			
		||||
export type BackboneConversationCollectionType = any;
 | 
			
		||||
export type BackboneMessageModelType = any;
 | 
			
		||||
export type BackboneMessageCollectionType = any;
 | 
			
		||||
 | 
			
		||||
export interface DataInterface {
 | 
			
		||||
  close: () => Promise<void>;
 | 
			
		||||
  removeDB: () => Promise<void>;
 | 
			
		||||
  removeIndexedDBFiles: () => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  createOrUpdateIdentityKey: (data: IdentityKeyType) => Promise<void>;
 | 
			
		||||
  getIdentityKeyById: (id: string) => Promise<IdentityKeyType | undefined>;
 | 
			
		||||
  bulkAddIdentityKeys: (array: Array<IdentityKeyType>) => Promise<void>;
 | 
			
		||||
  removeIdentityKeyById: (id: string) => Promise<void>;
 | 
			
		||||
  removeAllIdentityKeys: () => Promise<void>;
 | 
			
		||||
  getAllIdentityKeys: () => Promise<Array<IdentityKeyType>>;
 | 
			
		||||
 | 
			
		||||
  createOrUpdatePreKey: (data: PreKeyType) => Promise<void>;
 | 
			
		||||
  getPreKeyById: (id: number) => Promise<PreKeyType | undefined>;
 | 
			
		||||
  bulkAddPreKeys: (array: Array<PreKeyType>) => Promise<void>;
 | 
			
		||||
  removePreKeyById: (id: number) => Promise<void>;
 | 
			
		||||
  removeAllPreKeys: () => Promise<void>;
 | 
			
		||||
  getAllPreKeys: () => Promise<Array<PreKeyType>>;
 | 
			
		||||
 | 
			
		||||
  createOrUpdateSignedPreKey: (data: SignedPreKeyType) => Promise<void>;
 | 
			
		||||
  getSignedPreKeyById: (id: number) => Promise<SignedPreKeyType | undefined>;
 | 
			
		||||
  bulkAddSignedPreKeys: (array: Array<SignedPreKeyType>) => Promise<void>;
 | 
			
		||||
  removeSignedPreKeyById: (id: number) => Promise<void>;
 | 
			
		||||
  removeAllSignedPreKeys: () => Promise<void>;
 | 
			
		||||
  getAllSignedPreKeys: () => Promise<Array<SignedPreKeyType>>;
 | 
			
		||||
 | 
			
		||||
  createOrUpdateItem: (data: ItemType) => Promise<void>;
 | 
			
		||||
  getItemById: (id: string) => Promise<ItemType | undefined>;
 | 
			
		||||
  bulkAddItems: (array: Array<ItemType>) => Promise<void>;
 | 
			
		||||
  removeItemById: (id: string) => Promise<void>;
 | 
			
		||||
  removeAllItems: () => Promise<void>;
 | 
			
		||||
  getAllItems: () => Promise<Array<ItemType>>;
 | 
			
		||||
 | 
			
		||||
  createOrUpdateSession: (data: SessionType) => Promise<void>;
 | 
			
		||||
  createOrUpdateSessions: (array: Array<SessionType>) => Promise<void>;
 | 
			
		||||
  getSessionById: (id: string) => Promise<SessionType | undefined>;
 | 
			
		||||
  getSessionsById: (conversationId: string) => Promise<Array<SessionType>>;
 | 
			
		||||
  bulkAddSessions: (array: Array<SessionType>) => Promise<void>;
 | 
			
		||||
  removeSessionById: (id: string) => Promise<void>;
 | 
			
		||||
  removeSessionsByConversation: (conversationId: string) => Promise<void>;
 | 
			
		||||
  removeAllSessions: () => Promise<void>;
 | 
			
		||||
  getAllSessions: () => Promise<Array<SessionType>>;
 | 
			
		||||
 | 
			
		||||
  getConversationCount: () => Promise<number>;
 | 
			
		||||
  saveConversation: (data: ConversationType) => Promise<void>;
 | 
			
		||||
  saveConversations: (array: Array<ConversationType>) => Promise<void>;
 | 
			
		||||
  updateConversations: (array: Array<ConversationType>) => Promise<void>;
 | 
			
		||||
  getAllConversationIds: () => Promise<Array<string>>;
 | 
			
		||||
 | 
			
		||||
  searchConversations: (
 | 
			
		||||
    query: string,
 | 
			
		||||
    options?: { limit?: number }
 | 
			
		||||
  ) => Promise<Array<ConversationType>>;
 | 
			
		||||
  searchMessages: (
 | 
			
		||||
    query: string,
 | 
			
		||||
    options?: { limit?: number }
 | 
			
		||||
  ) => Promise<Array<SearchResultMessageType>>;
 | 
			
		||||
  searchMessagesInConversation: (
 | 
			
		||||
    query: string,
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options?: { limit?: number }
 | 
			
		||||
  ) => Promise<Array<SearchResultMessageType>>;
 | 
			
		||||
 | 
			
		||||
  getMessageCount: () => Promise<number>;
 | 
			
		||||
  saveMessages: (
 | 
			
		||||
    arrayOfMessages: Array<MessageType>,
 | 
			
		||||
    options: { forceSave?: boolean }
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  getAllMessageIds: () => Promise<Array<string>>;
 | 
			
		||||
  getMessageMetricsForConversation: (
 | 
			
		||||
    conversationId: string
 | 
			
		||||
  ) => Promise<ConverationMetricsType>;
 | 
			
		||||
 | 
			
		||||
  getUnprocessedCount: () => Promise<number>;
 | 
			
		||||
  getAllUnprocessed: () => Promise<Array<UnprocessedType>>;
 | 
			
		||||
  saveUnprocessed: (
 | 
			
		||||
    data: UnprocessedType,
 | 
			
		||||
    options?: { forceSave?: boolean }
 | 
			
		||||
  ) => Promise<number>;
 | 
			
		||||
  updateUnprocessedAttempts: (id: string, attempts: number) => Promise<void>;
 | 
			
		||||
  updateUnprocessedWithData: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    data: UnprocessedType
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  updateUnprocessedsWithData: (array: Array<UnprocessedType>) => Promise<void>;
 | 
			
		||||
  getUnprocessedById: (id: string) => Promise<UnprocessedType | undefined>;
 | 
			
		||||
  saveUnprocesseds: (
 | 
			
		||||
    arrayOfUnprocessed: Array<UnprocessedType>,
 | 
			
		||||
    options?: { forceSave?: boolean }
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  removeUnprocessed: (id: string) => Promise<void>;
 | 
			
		||||
  removeAllUnprocessed: () => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  getNextAttachmentDownloadJobs: (
 | 
			
		||||
    limit?: number,
 | 
			
		||||
    options?: { timestamp?: number }
 | 
			
		||||
  ) => Promise<Array<AttachmentDownloadJobType>>;
 | 
			
		||||
  saveAttachmentDownloadJob: (job: AttachmentDownloadJobType) => Promise<void>;
 | 
			
		||||
  setAttachmentDownloadJobPending: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    pending: boolean
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  resetAttachmentDownloadPending: () => Promise<void>;
 | 
			
		||||
  removeAttachmentDownloadJob: (id: string) => Promise<void>;
 | 
			
		||||
  removeAllAttachmentDownloadJobs: () => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  createOrUpdateStickerPack: (pack: StickerPackType) => Promise<void>;
 | 
			
		||||
  updateStickerPackStatus: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    status: StickerPackStatusType,
 | 
			
		||||
    options?: { timestamp: number }
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  createOrUpdateSticker: (sticker: StickerType) => Promise<void>;
 | 
			
		||||
  updateStickerLastUsed: (
 | 
			
		||||
    packId: string,
 | 
			
		||||
    stickerId: number,
 | 
			
		||||
    lastUsed: number
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  addStickerPackReference: (messageId: string, packId: string) => Promise<void>;
 | 
			
		||||
  deleteStickerPackReference: (
 | 
			
		||||
    messageId: string,
 | 
			
		||||
    packId: string
 | 
			
		||||
  ) => Promise<Array<string>>;
 | 
			
		||||
  getStickerCount: () => Promise<number>;
 | 
			
		||||
  deleteStickerPack: (packId: string) => Promise<Array<string>>;
 | 
			
		||||
  getAllStickerPacks: () => Promise<Array<StickerPackType>>;
 | 
			
		||||
  getAllStickers: () => Promise<Array<StickerType>>;
 | 
			
		||||
  getRecentStickers: (options?: {
 | 
			
		||||
    limit?: number;
 | 
			
		||||
  }) => Promise<Array<StickerType>>;
 | 
			
		||||
 | 
			
		||||
  updateEmojiUsage: (shortName: string, timeUsed?: number) => Promise<void>;
 | 
			
		||||
  getRecentEmojis: (limit?: number) => Promise<Array<EmojiType>>;
 | 
			
		||||
 | 
			
		||||
  removeAll: () => Promise<void>;
 | 
			
		||||
  removeAllConfiguration: () => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  getMessagesNeedingUpgrade: (
 | 
			
		||||
    limit: number,
 | 
			
		||||
    options: { maxVersion: number }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  getMessagesWithVisualMediaAttachments: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options: { limit: number }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  getMessagesWithFileAttachments: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options: { limit: number }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The reason for client/server divergence is the need to inject Backbone models and
 | 
			
		||||
//   collections into data calls so those are the objects returned. This was necessary in
 | 
			
		||||
//   July 2018 when creating the Data API as a drop-in replacement for previous database
 | 
			
		||||
//   requests via ORM.
 | 
			
		||||
 | 
			
		||||
// Note: It is extremely important that items are duplicated between these two. Client.js
 | 
			
		||||
//   loops over all of its local functions to generate the server-side IPC-based API.
 | 
			
		||||
 | 
			
		||||
export type ServerInterface = DataInterface & {
 | 
			
		||||
  getAllConversations: () => Promise<Array<ConversationType>>;
 | 
			
		||||
  getAllGroupsInvolvingId: (id: string) => Promise<Array<ConversationType>>;
 | 
			
		||||
  getAllPrivateConversations: () => Promise<Array<ConversationType>>;
 | 
			
		||||
  getConversationById: (id: string) => Promise<ConversationType>;
 | 
			
		||||
  getExpiredMessages: () => Promise<Array<MessageType>>;
 | 
			
		||||
  getMessageById: (id: string) => Promise<MessageType | undefined>;
 | 
			
		||||
  getMessageBySender: (options: {
 | 
			
		||||
    source: string;
 | 
			
		||||
    sourceUuid: string;
 | 
			
		||||
    sourceDevice: string;
 | 
			
		||||
    sent_at: number;
 | 
			
		||||
  }) => Promise<Array<MessageType>>;
 | 
			
		||||
  getMessagesBySentAt: (sentAt: number) => Promise<Array<MessageType>>;
 | 
			
		||||
  getOlderMessagesByConversation: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options?: { limit?: number; receivedAt?: number }
 | 
			
		||||
  ) => Promise<Array<MessageTypeUnhydrated>>;
 | 
			
		||||
  getNewerMessagesByConversation: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options?: { limit?: number; receivedAt?: number }
 | 
			
		||||
  ) => Promise<Array<MessageTypeUnhydrated>>;
 | 
			
		||||
  getNextExpiringMessage: () => Promise<MessageType>;
 | 
			
		||||
  getNextTapToViewMessageToAgeOut: () => Promise<MessageType>;
 | 
			
		||||
  getOutgoingWithoutExpiresAt: () => Promise<Array<MessageType>>;
 | 
			
		||||
  getTapToViewMessagesNeedingErase: () => Promise<Array<MessageType>>;
 | 
			
		||||
  getUnreadByConversation: (
 | 
			
		||||
    conversationId: string
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  removeConversation: (id: Array<string> | string) => Promise<void>;
 | 
			
		||||
  removeMessage: (id: Array<string> | string) => Promise<void>;
 | 
			
		||||
  saveMessage: (
 | 
			
		||||
    data: MessageType,
 | 
			
		||||
    options: { forceSave?: boolean }
 | 
			
		||||
  ) => Promise<number>;
 | 
			
		||||
  updateConversation: (data: ConversationType) => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  // For testing only
 | 
			
		||||
  _getAllMessages: () => Promise<Array<MessageType>>;
 | 
			
		||||
 | 
			
		||||
  // Server-only
 | 
			
		||||
 | 
			
		||||
  initialize: (options: {
 | 
			
		||||
    configDir: string;
 | 
			
		||||
    key: string;
 | 
			
		||||
    messages: LocaleMessagesType;
 | 
			
		||||
  }) => Promise<boolean>;
 | 
			
		||||
 | 
			
		||||
  removeKnownAttachments: (
 | 
			
		||||
    allAttachments: Array<string>
 | 
			
		||||
  ) => Promise<Array<string>>;
 | 
			
		||||
  removeKnownStickers: (allStickers: Array<string>) => Promise<Array<string>>;
 | 
			
		||||
  removeKnownDraftAttachments: (
 | 
			
		||||
    allStickers: Array<string>
 | 
			
		||||
  ) => Promise<Array<string>>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type ClientInterface = DataInterface & {
 | 
			
		||||
  getAllConversations: ({
 | 
			
		||||
    ConversationCollection,
 | 
			
		||||
  }: {
 | 
			
		||||
    ConversationCollection: BackboneConversationCollectionType;
 | 
			
		||||
  }) => Promise<Array<ConversationType>>;
 | 
			
		||||
  getAllGroupsInvolvingId: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    {
 | 
			
		||||
      ConversationCollection,
 | 
			
		||||
    }: {
 | 
			
		||||
      ConversationCollection: BackboneConversationCollectionType;
 | 
			
		||||
    }
 | 
			
		||||
  ) => Promise<Array<ConversationType>>;
 | 
			
		||||
  getAllPrivateConversations: ({
 | 
			
		||||
    ConversationCollection,
 | 
			
		||||
  }: {
 | 
			
		||||
    ConversationCollection: BackboneConversationCollectionType;
 | 
			
		||||
  }) => Promise<Array<ConversationType>>;
 | 
			
		||||
  getConversationById: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    { Conversation }: { Conversation: BackboneConversationModelType }
 | 
			
		||||
  ) => Promise<ConversationType>;
 | 
			
		||||
  getExpiredMessages: ({
 | 
			
		||||
    MessageCollection,
 | 
			
		||||
  }: {
 | 
			
		||||
    MessageCollection: BackboneMessageCollectionType;
 | 
			
		||||
  }) => Promise<Array<MessageType>>;
 | 
			
		||||
  getMessageById: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    { Message }: { Message: BackboneMessageModelType }
 | 
			
		||||
  ) => Promise<MessageType | undefined>;
 | 
			
		||||
  getMessageBySender: (
 | 
			
		||||
    options: {
 | 
			
		||||
      source: string;
 | 
			
		||||
      sourceUuid: string;
 | 
			
		||||
      sourceDevice: string;
 | 
			
		||||
      sent_at: number;
 | 
			
		||||
    },
 | 
			
		||||
    { Message }: { Message: BackboneMessageModelType }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  getMessagesBySentAt: (
 | 
			
		||||
    sentAt: number,
 | 
			
		||||
    { MessageCollection }: { MessageCollection: BackboneMessageCollectionType }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  getOlderMessagesByConversation: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options: {
 | 
			
		||||
      limit?: number;
 | 
			
		||||
      receivedAt?: number;
 | 
			
		||||
      MessageCollection: BackboneMessageCollectionType;
 | 
			
		||||
    }
 | 
			
		||||
  ) => Promise<Array<MessageTypeUnhydrated>>;
 | 
			
		||||
  getNewerMessagesByConversation: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    options: {
 | 
			
		||||
      limit?: number;
 | 
			
		||||
      receivedAt?: number;
 | 
			
		||||
      MessageCollection: BackboneMessageCollectionType;
 | 
			
		||||
    }
 | 
			
		||||
  ) => Promise<Array<MessageTypeUnhydrated>>;
 | 
			
		||||
  getNextExpiringMessage: ({
 | 
			
		||||
    Message,
 | 
			
		||||
  }: {
 | 
			
		||||
    Message: BackboneMessageModelType;
 | 
			
		||||
  }) => Promise<MessageType>;
 | 
			
		||||
  getNextTapToViewMessageToAgeOut: ({
 | 
			
		||||
    Message,
 | 
			
		||||
  }: {
 | 
			
		||||
    Message: BackboneMessageModelType;
 | 
			
		||||
  }) => Promise<MessageType>;
 | 
			
		||||
  getOutgoingWithoutExpiresAt: ({
 | 
			
		||||
    MessageCollection,
 | 
			
		||||
  }: {
 | 
			
		||||
    MessageCollection: BackboneMessageCollectionType;
 | 
			
		||||
  }) => Promise<Array<MessageType>>;
 | 
			
		||||
  getTapToViewMessagesNeedingErase: ({
 | 
			
		||||
    MessageCollection,
 | 
			
		||||
  }: {
 | 
			
		||||
    MessageCollection: BackboneMessageCollectionType;
 | 
			
		||||
  }) => Promise<Array<MessageType>>;
 | 
			
		||||
  getUnreadByConversation: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    { MessageCollection }: { MessageCollection: BackboneMessageCollectionType }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  removeConversation: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    { Conversation }: { Conversation: BackboneConversationModelType }
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  removeMessage: (
 | 
			
		||||
    id: string,
 | 
			
		||||
    { Message }: { Message: BackboneMessageModelType }
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  saveMessage: (
 | 
			
		||||
    data: MessageType,
 | 
			
		||||
    options: { forceSave?: boolean; Message: BackboneMessageModelType }
 | 
			
		||||
  ) => Promise<number>;
 | 
			
		||||
  updateConversation: (data: ConversationType) => void;
 | 
			
		||||
 | 
			
		||||
  // Test-only
 | 
			
		||||
 | 
			
		||||
  _getAllMessages: ({
 | 
			
		||||
    MessageCollection,
 | 
			
		||||
  }: {
 | 
			
		||||
    MessageCollection: BackboneMessageCollectionType;
 | 
			
		||||
  }) => Promise<Array<MessageType>>;
 | 
			
		||||
 | 
			
		||||
  // Client-side only
 | 
			
		||||
 | 
			
		||||
  shutdown: () => Promise<void>;
 | 
			
		||||
  removeAllMessagesInConversation: (
 | 
			
		||||
    conversationId: string,
 | 
			
		||||
    { MessageCollection }: { MessageCollection: BackboneMessageCollectionType }
 | 
			
		||||
  ) => Promise<void>;
 | 
			
		||||
  removeOtherData: () => Promise<void>;
 | 
			
		||||
  cleanupOrphanedAttachments: () => Promise<void>;
 | 
			
		||||
  ensureFilePermissions: () => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  getLegacyMessagesNeedingUpgrade: (
 | 
			
		||||
    limit: number,
 | 
			
		||||
    options: { maxVersion: number }
 | 
			
		||||
  ) => Promise<Array<MessageType>>;
 | 
			
		||||
  saveLegacyMessage: (data: MessageType) => Promise<void>;
 | 
			
		||||
 | 
			
		||||
  // Client-side only, and test-only
 | 
			
		||||
 | 
			
		||||
  _removeConversations: (ids: Array<string>) => Promise<void>;
 | 
			
		||||
  _removeMessages: (ids: Array<string>) => Promise<void>;
 | 
			
		||||
  _cleanData: (data: any, path?: string) => any;
 | 
			
		||||
  _jobs: { [id: string]: ClientJobType };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type ClientJobType = {
 | 
			
		||||
  fnName: string;
 | 
			
		||||
  start: number;
 | 
			
		||||
  resolve?: Function;
 | 
			
		||||
  reject?: Function;
 | 
			
		||||
 | 
			
		||||
  // Only in DEBUG mode
 | 
			
		||||
  complete?: boolean;
 | 
			
		||||
  args?: Array<any>;
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue