@fedify/amqp 2.0.0-dev.221 → 2.0.0-dev.226

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 (3) hide show
  1. package/deno.json +1 -1
  2. package/package.json +4 -3
  3. package/src/mq.test.ts +23 -101
package/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/amqp",
3
- "version": "2.0.0-dev.221+f54af224",
3
+ "version": "2.0.0-dev.226+c28b813d",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": "./src/mod.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/amqp",
3
- "version": "2.0.0-dev.221+f54af224",
3
+ "version": "2.0.0-dev.226+c28b813d",
4
4
  "description": "AMQP/RabbitMQ driver for Fedify",
5
5
  "keywords": [
6
6
  "fedify",
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "peerDependencies": {
57
57
  "amqplib": "^0.10.9",
58
- "@fedify/fedify": "^2.0.0-dev.221+f54af224"
58
+ "@fedify/fedify": "^2.0.0-dev.226+c28b813d"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@alinea/suite": "^0.6.3",
@@ -64,7 +64,8 @@
64
64
  "@std/async": "npm:@jsr/std__async@^1.0.13",
65
65
  "@types/amqplib": "^0.10.7",
66
66
  "tsdown": "^0.12.9",
67
- "typescript": "^5.9.3"
67
+ "typescript": "^5.9.3",
68
+ "@fedify/testing": "^2.0.0-dev.226+c28b813d"
68
69
  },
69
70
  "scripts": {
70
71
  "build": "tsdown",
package/src/mq.test.ts CHANGED
@@ -1,19 +1,12 @@
1
1
  import { suite } from "@alinea/suite";
2
2
  import { AmqpMessageQueue } from "@fedify/amqp/mq";
3
- import * as temporal from "@js-temporal/polyfill";
3
+ import { getRandomKey, testMessageQueue, waitFor } from "@fedify/testing";
4
4
  import { assert, assertEquals, assertFalse, assertGreater } from "@std/assert";
5
5
  import { delay } from "@std/async/delay";
6
6
  // @deno-types="npm:@types/amqplib"
7
7
  import { type ChannelModel, connect } from "amqplib";
8
8
  import process from "node:process";
9
9
 
10
- let Temporal: typeof temporal.Temporal;
11
- if ("Temporal" in globalThis) {
12
- Temporal = globalThis.Temporal;
13
- } else {
14
- Temporal = temporal.Temporal;
15
- }
16
-
17
10
  const AMQP_URL = process.env.AMQP_URL;
18
11
  const test = AMQP_URL ? suite(import.meta) : suite(import.meta).skip;
19
12
 
@@ -21,86 +14,28 @@ function getConnection(): Promise<ChannelModel> {
21
14
  return connect(AMQP_URL!);
22
15
  }
23
16
 
24
- test("AmqpMessageQueue", {
25
- sanitizeOps: false,
26
- sanitizeExit: false,
27
- sanitizeResources: false,
28
- }, async () => {
29
- const conn = await getConnection();
30
- const conn2 = await getConnection();
31
- const randomSuffix = Math.random().toString(36).substring(2);
32
- const queue = `fedify_queue_${randomSuffix}`;
33
- const delayedQueuePrefix = `fedify_delayed_${randomSuffix}_`;
34
- const mq = new AmqpMessageQueue(conn, { queue, delayedQueuePrefix });
35
- const mq2 = new AmqpMessageQueue(conn2, { queue, delayedQueuePrefix });
36
-
37
- const messages1: string[] = [];
38
- const messages2: string[] = [];
39
- const allMessages: string[] = [];
40
- const controller = new AbortController();
41
- const listening = mq.listen((message: string) => {
42
- messages1.push(message);
43
- allMessages.push(message);
44
- }, { signal: controller.signal });
45
- const listening2 = mq2.listen((message: string) => {
46
- messages2.push(message);
47
- allMessages.push(message);
48
- }, { signal: controller.signal });
49
-
50
- await mq.enqueue("Hello, world!");
51
-
52
- await waitFor(() => allMessages.length > 0, 15_000);
53
-
54
- assertEquals(allMessages.includes("Hello, world!"), true);
55
-
56
- // enqueue() with delay
57
- const started = Date.now();
58
- await mq.enqueue(
59
- "Delayed message",
60
- { delay: Temporal.Duration.from({ seconds: 3 }) },
61
- );
62
-
63
- await waitFor(() => allMessages.includes("Delayed message"), 15_000);
64
-
65
- // listen() with delay
66
- assertEquals(allMessages.includes("Delayed message"), true);
67
- assertGreater(Date.now() - started, 3_000);
68
-
69
- await mq.enqueueMany(["Message 1", "Message 2", "Message 3"]);
70
-
71
- await waitFor(() =>
72
- allMessages.includes("Message 1") &&
73
- allMessages.includes("Message 2") &&
74
- allMessages.includes("Message 3"), 15_000);
75
-
76
- // listen() after enqueueMany()
77
- assertEquals(allMessages.includes("Message 1"), true);
78
- assertEquals(allMessages.includes("Message 2"), true);
79
- assertEquals(allMessages.includes("Message 3"), true);
80
-
81
- // enqueueMany() with delay
82
- const manyStarted = Date.now();
83
- await mq.enqueueMany(
84
- ["Delayed batch 1", "Delayed batch 2"],
85
- { delay: Temporal.Duration.from({ seconds: 3 }) },
86
- );
87
-
88
- await waitFor(() =>
89
- allMessages.includes("Delayed batch 1") &&
90
- allMessages.includes("Delayed batch 2"), 15_000);
91
-
92
- // listen() after enqueueMany() with delay
93
- assertEquals(allMessages.includes("Delayed batch 1"), true);
94
- assertEquals(allMessages.includes("Delayed batch 2"), true);
95
- assertGreater(Date.now() - manyStarted, 3_000);
96
-
97
- controller.abort();
98
- await listening;
99
- await listening2;
100
-
101
- await conn.close();
102
- await conn2.close();
103
- });
17
+ const connections: ChannelModel[] = [];
18
+ const queue = getRandomKey("queue");
19
+ const delayedQueuePrefix = getRandomKey("delayed") + "_";
20
+
21
+ test(
22
+ "AmqpMessageQueue",
23
+ { sanitizeOps: false, sanitizeExit: false, sanitizeResources: false },
24
+ () =>
25
+ testMessageQueue(
26
+ async () => {
27
+ const conn = await getConnection();
28
+ connections.push(conn);
29
+ return new AmqpMessageQueue(conn, { queue, delayedQueuePrefix });
30
+ },
31
+ async ({ controller }) => {
32
+ controller.abort();
33
+ for (const conn of connections) {
34
+ await conn.close();
35
+ }
36
+ },
37
+ ),
38
+ );
104
39
 
105
40
  test(
106
41
  "AmqpMessageQueue [nativeRetrial: false]",
@@ -171,16 +106,3 @@ test(
171
106
  assertGreater(i, 1);
172
107
  },
173
108
  );
174
-
175
- async function waitFor(
176
- predicate: () => boolean,
177
- timeoutMs: number,
178
- ): Promise<void> {
179
- const started = Date.now();
180
- while (!predicate()) {
181
- await delay(500);
182
- if (Date.now() - started > timeoutMs) {
183
- throw new Error("Timeout");
184
- }
185
- }
186
- }