Retry outbound "normal" messages for up to a day
This commit is contained in:
parent
62cf51c060
commit
a85dd1be36
30 changed files with 1414 additions and 603 deletions
|
@ -40,6 +40,7 @@ import {
|
|||
MessageModelCollectionType,
|
||||
} from '../model-types.d';
|
||||
import { StoredJob } from '../jobs/types';
|
||||
import { formatJobForInsert } from '../jobs/formatJobForInsert';
|
||||
|
||||
import {
|
||||
AttachmentDownloadJobType,
|
||||
|
@ -206,6 +207,7 @@ const dataInterface: ClientInterface = {
|
|||
|
||||
getMessageBySender,
|
||||
getMessageById,
|
||||
getMessagesById,
|
||||
getAllMessageIds,
|
||||
getMessagesBySentAt,
|
||||
getExpiredMessages,
|
||||
|
@ -1070,9 +1072,12 @@ async function getMessageCount(conversationId?: string) {
|
|||
|
||||
async function saveMessage(
|
||||
data: MessageType,
|
||||
options?: { forceSave?: boolean }
|
||||
options: { jobToInsert?: Readonly<StoredJob>; forceSave?: boolean } = {}
|
||||
) {
|
||||
const id = await channels.saveMessage(_cleanMessageData(data), options);
|
||||
const id = await channels.saveMessage(_cleanMessageData(data), {
|
||||
...options,
|
||||
jobToInsert: options.jobToInsert && formatJobForInsert(options.jobToInsert),
|
||||
});
|
||||
|
||||
window.Whisper.ExpiringMessagesListener.update();
|
||||
window.Whisper.TapToViewMessagesListener.update();
|
||||
|
@ -1124,6 +1129,13 @@ async function getMessageById(
|
|||
return new Message(message);
|
||||
}
|
||||
|
||||
async function getMessagesById(messageIds: Array<string>) {
|
||||
if (!messageIds.length) {
|
||||
return [];
|
||||
}
|
||||
return channels.getMessagesById(messageIds);
|
||||
}
|
||||
|
||||
// For testing only
|
||||
async function _getAllMessages({
|
||||
MessageCollection,
|
||||
|
|
|
@ -307,9 +307,13 @@ export type DataInterface = {
|
|||
options?: { limit?: number }
|
||||
) => Promise<Array<ConversationType>>;
|
||||
|
||||
getMessagesById: (messageIds: Array<string>) => Promise<Array<MessageType>>;
|
||||
saveMessage: (
|
||||
data: MessageType,
|
||||
options?: { forceSave?: boolean }
|
||||
options?: {
|
||||
jobToInsert?: StoredJob;
|
||||
forceSave?: boolean;
|
||||
}
|
||||
) => Promise<string>;
|
||||
saveMessages: (
|
||||
arrayOfMessages: Array<MessageType>,
|
||||
|
|
|
@ -196,6 +196,7 @@ const dataInterface: ServerInterface = {
|
|||
removeReactionFromConversation,
|
||||
getMessageBySender,
|
||||
getMessageById,
|
||||
getMessagesById,
|
||||
_getAllMessages,
|
||||
getAllMessageIds,
|
||||
getMessagesBySentAt,
|
||||
|
@ -2363,22 +2364,37 @@ function getInstance(): Database {
|
|||
return globalInstance;
|
||||
}
|
||||
|
||||
function batchMultiVarQuery<T>(
|
||||
values: Array<T>,
|
||||
query: (batch: Array<T>) => void
|
||||
): void {
|
||||
function batchMultiVarQuery<ValueT>(
|
||||
values: Array<ValueT>,
|
||||
query: (batch: Array<ValueT>) => void
|
||||
): [];
|
||||
function batchMultiVarQuery<ValueT, ResultT>(
|
||||
values: Array<ValueT>,
|
||||
query: (batch: Array<ValueT>) => Array<ResultT>
|
||||
): Array<ResultT>;
|
||||
function batchMultiVarQuery<ValueT, ResultT>(
|
||||
values: Array<ValueT>,
|
||||
query:
|
||||
| ((batch: Array<ValueT>) => void)
|
||||
| ((batch: Array<ValueT>) => Array<ResultT>)
|
||||
): Array<ResultT> {
|
||||
const db = getInstance();
|
||||
if (values.length > MAX_VARIABLE_COUNT) {
|
||||
const result: Array<ResultT> = [];
|
||||
db.transaction(() => {
|
||||
for (let i = 0; i < values.length; i += MAX_VARIABLE_COUNT) {
|
||||
const batch = values.slice(i, i + MAX_VARIABLE_COUNT);
|
||||
query(batch);
|
||||
const batchResult = query(batch);
|
||||
if (Array.isArray(batchResult)) {
|
||||
result.push(...batchResult);
|
||||
}
|
||||
}
|
||||
})();
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
|
||||
query(values);
|
||||
const result = query(values);
|
||||
return Array.isArray(result) ? result : [];
|
||||
}
|
||||
|
||||
const IDENTITY_KEYS_TABLE = 'identityKeys';
|
||||
|
@ -3577,11 +3593,15 @@ function hasUserInitiatedMessages(conversationId: string): boolean {
|
|||
|
||||
function saveMessageSync(
|
||||
data: MessageType,
|
||||
options?: { forceSave?: boolean; alreadyInTransaction?: boolean }
|
||||
options?: {
|
||||
jobToInsert?: StoredJob;
|
||||
forceSave?: boolean;
|
||||
alreadyInTransaction?: boolean;
|
||||
}
|
||||
): string {
|
||||
const db = getInstance();
|
||||
|
||||
const { forceSave, alreadyInTransaction } = options || {};
|
||||
const { jobToInsert, forceSave, alreadyInTransaction } = options || {};
|
||||
|
||||
if (!alreadyInTransaction) {
|
||||
return db.transaction(() => {
|
||||
|
@ -3670,6 +3690,10 @@ function saveMessageSync(
|
|||
`
|
||||
).run(payload);
|
||||
|
||||
if (jobToInsert) {
|
||||
insertJobSync(db, jobToInsert);
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
|
@ -3733,12 +3757,20 @@ function saveMessageSync(
|
|||
json: objectToJSON(toCreate),
|
||||
});
|
||||
|
||||
if (jobToInsert) {
|
||||
insertJobSync(db, jobToInsert);
|
||||
}
|
||||
|
||||
return toCreate.id;
|
||||
}
|
||||
|
||||
async function saveMessage(
|
||||
data: MessageType,
|
||||
options?: { forceSave?: boolean; alreadyInTransaction?: boolean }
|
||||
options?: {
|
||||
jobToInsert?: StoredJob;
|
||||
forceSave?: boolean;
|
||||
alreadyInTransaction?: boolean;
|
||||
}
|
||||
): Promise<string> {
|
||||
return saveMessageSync(data, options);
|
||||
}
|
||||
|
@ -3795,6 +3827,25 @@ async function getMessageById(id: string): Promise<MessageType | undefined> {
|
|||
return jsonToObject(row.json);
|
||||
}
|
||||
|
||||
async function getMessagesById(
|
||||
messageIds: Array<string>
|
||||
): Promise<Array<MessageType>> {
|
||||
const db = getInstance();
|
||||
|
||||
return batchMultiVarQuery(
|
||||
messageIds,
|
||||
(batch: Array<string>): Array<MessageType> => {
|
||||
const query = db.prepare<ArrayQuery>(
|
||||
`SELECT json FROM messages WHERE id IN (${Array(batch.length)
|
||||
.fill('?')
|
||||
.join(',')});`
|
||||
);
|
||||
const rows: JSONRows = query.all(batch);
|
||||
return rows.map(row => jsonToObject(row.json));
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
async function _getAllMessages(): Promise<Array<MessageType>> {
|
||||
const db = getInstance();
|
||||
const rows: JSONRows = db
|
||||
|
@ -5902,9 +5953,7 @@ async function getJobsInQueue(queueType: string): Promise<Array<StoredJob>> {
|
|||
}));
|
||||
}
|
||||
|
||||
async function insertJob(job: Readonly<StoredJob>): Promise<void> {
|
||||
const db = getInstance();
|
||||
|
||||
function insertJobSync(db: Database, job: Readonly<StoredJob>): void {
|
||||
db.prepare<Query>(
|
||||
`
|
||||
INSERT INTO jobs
|
||||
|
@ -5920,6 +5969,11 @@ async function insertJob(job: Readonly<StoredJob>): Promise<void> {
|
|||
});
|
||||
}
|
||||
|
||||
async function insertJob(job: Readonly<StoredJob>): Promise<void> {
|
||||
const db = getInstance();
|
||||
return insertJobSync(db, job);
|
||||
}
|
||||
|
||||
async function deleteJob(id: string): Promise<void> {
|
||||
const db = getInstance();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue