@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.
Files changed (32) hide show
  1. package/package.json +1 -1
  2. package/src/cli.ts +3 -9
  3. package/src/emit.test.ts +28 -10
  4. package/src/emit.ts +70 -72
  5. package/src/handlers/delete-account-objects.test.ts +11 -13
  6. package/src/handlers/delete-account-objects.ts +5 -3
  7. package/src/handlers/message-copy.sqlite.test.ts +3 -3
  8. package/src/handlers/message-copy.ts +5 -2
  9. package/src/handlers/message-delete.sqlite.test.ts +1 -1
  10. package/src/handlers/message-delete.ts +7 -4
  11. package/src/handlers/message-move.sqlite.test.ts +1 -1
  12. package/src/handlers/message-move.ts +9 -6
  13. package/src/handlers/placement-move-push.ts +9 -6
  14. package/src/handlers/placement-push.sqlite.test.ts +2 -1
  15. package/src/handlers/probe-message-id.sqlite.test.ts +1 -1
  16. package/src/handlers/sync-mailboxes.ts +8 -4
  17. package/src/handlers/sync-message-body.sqlite.test.ts +2 -2
  18. package/src/handlers/sync-message-body.ts +2 -1
  19. package/src/handlers/sync-messages.sqlite.test.ts +14 -2
  20. package/src/handlers/sync-messages.ts +20 -8
  21. package/src/index.ts +3 -7
  22. package/src/mail-sync-selection.sqlite.test.ts +4 -11
  23. package/src/pending-sync.sqlite.test.ts +9 -10
  24. package/src/processor.ts +10 -8
  25. package/src/queues.ts +14 -23
  26. package/src/scheduler/attachment-sweep.sqlite.test.ts +2 -3
  27. package/src/scheduler/handler.ts +31 -26
  28. package/src/scheduler/run-tick.sqlite.test.ts +1 -1
  29. package/src/scheduler/runner.ts +5 -10
  30. package/src/stranded-placement.sqlite.test.ts +5 -0
  31. package/src/test-helpers/test-world.ts +30 -32
  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 { composeSqliteClient } from "@remit/backend/compose-sqlite";
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 { setWorkerQueues } from "../queues.js";
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 by the
91
- * backend's own SQLite composition root over filesystem storage — every
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
- let current = recordingQueue();
111
- const queue: QueueProducer<unknown> = {
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
- current = recordingQueue();
140
- return createWorld(client, current, accountConfigId);
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
+ });