@remit/imap-worker 0.0.89 → 0.0.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/cli.ts +3 -9
- package/src/emit.test.ts +28 -10
- package/src/emit.ts +70 -72
- package/src/handlers/delete-account-objects.test.ts +11 -13
- package/src/handlers/delete-account-objects.ts +5 -3
- package/src/handlers/message-copy.sqlite.test.ts +3 -3
- package/src/handlers/message-copy.ts +5 -2
- package/src/handlers/message-delete.sqlite.test.ts +1 -1
- package/src/handlers/message-delete.ts +7 -4
- package/src/handlers/message-move.sqlite.test.ts +1 -1
- package/src/handlers/message-move.ts +9 -6
- package/src/handlers/placement-move-push.ts +9 -6
- package/src/handlers/placement-push.sqlite.test.ts +2 -1
- package/src/handlers/probe-message-id.sqlite.test.ts +1 -1
- package/src/handlers/sync-mailboxes.ts +8 -4
- package/src/handlers/sync-message-body.sqlite.test.ts +2 -2
- package/src/handlers/sync-message-body.ts +2 -1
- package/src/handlers/sync-messages.sqlite.test.ts +14 -2
- package/src/handlers/sync-messages.ts +20 -8
- package/src/index.ts +3 -7
- package/src/mail-sync-selection.sqlite.test.ts +4 -11
- package/src/pending-sync.sqlite.test.ts +9 -10
- package/src/processor.ts +10 -8
- package/src/queues.ts +14 -23
- package/src/scheduler/attachment-sweep.sqlite.test.ts +2 -3
- package/src/scheduler/handler.ts +31 -26
- package/src/scheduler/run-tick.sqlite.test.ts +1 -1
- package/src/scheduler/runner.ts +5 -10
- package/src/stranded-placement.sqlite.test.ts +5 -0
- package/src/test-helpers/test-world.ts +30 -32
- package/src/test-helpers/worker-queues.ts +11 -0
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
type RemitClient,
|
|
9
9
|
setClient,
|
|
10
10
|
} from "@remit/backend/client";
|
|
11
|
-
import {
|
|
11
|
+
import { createRemitClient } from "@remit/backend/create-remit-client";
|
|
12
12
|
import { buildSharedDeps } from "@remit/backend/shared-deps";
|
|
13
13
|
import type {
|
|
14
14
|
AccountItem,
|
|
@@ -16,7 +16,6 @@ import type {
|
|
|
16
16
|
MailboxSpecialUseValue,
|
|
17
17
|
MessageItem,
|
|
18
18
|
OutboxMessageItem,
|
|
19
|
-
QueueProducer,
|
|
20
19
|
} from "@remit/data-ports";
|
|
21
20
|
import {
|
|
22
21
|
type RecordingQueue,
|
|
@@ -27,6 +26,11 @@ import {
|
|
|
27
26
|
ConnectionState,
|
|
28
27
|
MailboxCursorState,
|
|
29
28
|
} from "@remit/domain-enums";
|
|
29
|
+
import {
|
|
30
|
+
createSqliteRepositories,
|
|
31
|
+
openSqliteDatabases,
|
|
32
|
+
sqliteDatabasePathsFromEnv,
|
|
33
|
+
} from "@remit/drizzle-service";
|
|
30
34
|
import { createShippedSqliteFiles } from "@remit/drizzle-service/test-sqlite";
|
|
31
35
|
import type { Logger } from "@remit/logger";
|
|
32
36
|
import type { ManagedConnectionFactory } from "@remit/mailbox-service";
|
|
@@ -37,7 +41,8 @@ import {
|
|
|
37
41
|
import { serializeEncryptedPayload } from "@remit/secrets-service";
|
|
38
42
|
import type { createConnectionScopeWithCredentials } from "../connection-scope.js";
|
|
39
43
|
import { syncMessages } from "../handlers/sync-messages.js";
|
|
40
|
-
import {
|
|
44
|
+
import type { WorkerQueues } from "../queues.js";
|
|
45
|
+
import { workerQueuesOn } from "./worker-queues.js";
|
|
41
46
|
|
|
42
47
|
export interface LogLine {
|
|
43
48
|
level: string;
|
|
@@ -87,8 +92,8 @@ export interface SeededMessage {
|
|
|
87
92
|
}
|
|
88
93
|
|
|
89
94
|
/**
|
|
90
|
-
* One SQLite store per test file, over the shipped migrations, composed
|
|
91
|
-
* backend's
|
|
95
|
+
* One SQLite store per test file, over the shipped migrations, composed from
|
|
96
|
+
* the backend's SQLite repositories over filesystem storage — every
|
|
92
97
|
* repository and service a handler reaches is the one a self-host process
|
|
93
98
|
* runs. Each `world()` is a fresh account on it, with its own in-memory mail
|
|
94
99
|
* server at the IMAP port, and a message reaches the store the way mail does:
|
|
@@ -96,7 +101,6 @@ export interface SeededMessage {
|
|
|
96
101
|
*/
|
|
97
102
|
export const openStore = async (): Promise<{
|
|
98
103
|
client: RemitClient;
|
|
99
|
-
bindWorkerQueues: () => void;
|
|
100
104
|
world: (accountConfigId?: string) => Promise<World>;
|
|
101
105
|
close: () => void;
|
|
102
106
|
}> => {
|
|
@@ -107,37 +111,28 @@ export const openStore = async (): Promise<{
|
|
|
107
111
|
process.env.BETTER_AUTH_URL = "https://mail.example.com";
|
|
108
112
|
process.env.BETTER_AUTH_SECRET = "a-signing-secret-of-at-least-32-characters";
|
|
109
113
|
_resetForTest();
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
send: (message) => current.send(message),
|
|
113
|
-
sendBatch: (messages) => current.sendBatch(messages),
|
|
114
|
-
};
|
|
115
|
-
const client = await composeSqliteClient(
|
|
116
|
-
buildSharedDeps({
|
|
117
|
-
sync: queue,
|
|
118
|
-
accountFanout: queue,
|
|
119
|
-
smtp: queue,
|
|
120
|
-
messageManagement: queue,
|
|
121
|
-
body: queue,
|
|
122
|
-
}),
|
|
114
|
+
const repositories = createSqliteRepositories(
|
|
115
|
+
await openSqliteDatabases(sqliteDatabasePathsFromEnv()),
|
|
123
116
|
);
|
|
117
|
+
const queuesOn = (queue: RecordingQueue) => ({
|
|
118
|
+
sync: queue.fifo,
|
|
119
|
+
accountFanout: queue,
|
|
120
|
+
smtp: queue,
|
|
121
|
+
messageManagement: queue,
|
|
122
|
+
body: queue,
|
|
123
|
+
});
|
|
124
|
+
const shared = buildSharedDeps(queuesOn(recordingQueue()));
|
|
125
|
+
const clientOn = (queue: RecordingQueue): RemitClient =>
|
|
126
|
+
createRemitClient({ repositories, ...shared, queues: queuesOn(queue) });
|
|
127
|
+
const client = clientOn(recordingQueue());
|
|
124
128
|
setClient(client);
|
|
125
|
-
const bindWorkerQueues = (): void =>
|
|
126
|
-
setWorkerQueues({
|
|
127
|
-
mailboxes: queue,
|
|
128
|
-
messages: queue,
|
|
129
|
-
flags: queue,
|
|
130
|
-
body: queue,
|
|
131
|
-
mailboxManagement: queue,
|
|
132
|
-
messageManagement: queue,
|
|
133
|
-
});
|
|
134
|
-
bindWorkerQueues();
|
|
135
129
|
return {
|
|
136
130
|
client,
|
|
137
|
-
bindWorkerQueues,
|
|
138
131
|
world: (accountConfigId = `cfg-${randomUUID()}`) => {
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
const queue = recordingQueue();
|
|
133
|
+
const worldClient = clientOn(queue);
|
|
134
|
+
setClient(worldClient);
|
|
135
|
+
return createWorld(worldClient, queue, accountConfigId);
|
|
141
136
|
},
|
|
142
137
|
close: () => {
|
|
143
138
|
_resetForTest();
|
|
@@ -166,6 +161,7 @@ export interface World {
|
|
|
166
161
|
queued: () => Array<Record<string, unknown>>;
|
|
167
162
|
refuseSends: (error: Error | undefined) => void;
|
|
168
163
|
queue: RecordingQueue;
|
|
164
|
+
queues: WorkerQueues;
|
|
169
165
|
draft: (
|
|
170
166
|
attachment?: Buffer,
|
|
171
167
|
) => Promise<{ outbox: OutboxMessageItem; attachmentId?: string }>;
|
|
@@ -297,6 +293,7 @@ const createWorld = async (
|
|
|
297
293
|
mailboxId: mailbox.mailboxId,
|
|
298
294
|
},
|
|
299
295
|
capturingLogger([]),
|
|
296
|
+
workerQueuesOn(queue),
|
|
300
297
|
connectionFactory,
|
|
301
298
|
);
|
|
302
299
|
imap.connections = baseline.connections;
|
|
@@ -420,6 +417,7 @@ const createWorld = async (
|
|
|
420
417
|
queued,
|
|
421
418
|
refuseSends,
|
|
422
419
|
queue,
|
|
420
|
+
queues: workerQueuesOn(queue),
|
|
423
421
|
draft,
|
|
424
422
|
scope,
|
|
425
423
|
connectionFactory,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RecordingQueue } from "@remit/data-ports/recording-queue";
|
|
2
|
+
import type { WorkerQueues } from "../queues.js";
|
|
3
|
+
|
|
4
|
+
export const workerQueuesOn = (queue: RecordingQueue): WorkerQueues => ({
|
|
5
|
+
mailboxes: queue.fifo,
|
|
6
|
+
messages: queue.fifo,
|
|
7
|
+
flags: queue.fifo,
|
|
8
|
+
body: queue,
|
|
9
|
+
mailboxManagement: queue,
|
|
10
|
+
messageManagement: queue,
|
|
11
|
+
});
|