@fedify/redis 0.2.0 → 0.3.0-dev.14

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/README.md CHANGED
@@ -62,6 +62,14 @@ bun add @fedify/redis
62
62
  Changelog
63
63
  ---------
64
64
 
65
+ ### Version 0.3.0
66
+
67
+ To be released.
68
+
69
+ - Polling is now more efficient.
70
+ - Renamed `RedisMessageQueueOptions.loopInterval` option to `pollInterval`
71
+ option.
72
+
65
73
  ### Version 0.2.0
66
74
 
67
75
  Released on September 26, 2024.
package/esm/src/mq.js CHANGED
@@ -9,10 +9,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_loopInterval, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
12
+ var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_pollIntervalMs, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
13
13
  // deno-lint-ignore-file no-explicit-any
14
14
  import * as dntShim from "../_dnt.shims.js";
15
+ import { getLogger } from "@logtape/logtape";
15
16
  import { JsonCodec } from "./codec.js";
17
+ const logger = getLogger(["fedify", "redis", "mq"]);
16
18
  /**
17
19
  * A message queue that uses Redis as the underlying storage.
18
20
  *
@@ -43,7 +45,7 @@ export class RedisMessageQueue {
43
45
  _RedisMessageQueue_queueKey.set(this, void 0);
44
46
  _RedisMessageQueue_lockKey.set(this, void 0);
45
47
  _RedisMessageQueue_codec.set(this, void 0);
46
- _RedisMessageQueue_loopInterval.set(this, void 0);
48
+ _RedisMessageQueue_pollIntervalMs.set(this, void 0);
47
49
  _RedisMessageQueue_loopHandle.set(this, void 0);
48
50
  __classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
49
51
  __classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
@@ -52,59 +54,89 @@ export class RedisMessageQueue {
52
54
  __classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
53
55
  __classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
54
56
  __classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new JsonCodec(), "f");
55
- __classPrivateFieldSet(this, _RedisMessageQueue_loopInterval, dntShim.Temporal.Duration.from(options.loopInterval ?? { seconds: 5 }), "f");
57
+ __classPrivateFieldSet(this, _RedisMessageQueue_pollIntervalMs, dntShim.Temporal.Duration.from(options.pollInterval ?? { seconds: 5 }).total("millisecond"), "f");
56
58
  }
57
59
  async enqueue(message, options) {
58
60
  const ts = options?.delay == null
59
61
  ? 0
60
62
  : dntShim.Temporal.Now.instant().add(options.delay).epochMilliseconds;
61
- const encodedMessage = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").encode(message);
63
+ const encodedMessage = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").encode([
64
+ crypto.randomUUID(),
65
+ message,
66
+ ]);
62
67
  await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zadd(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), ts, encodedMessage);
63
68
  if (ts < 1)
64
69
  __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
65
70
  }
66
- listen(handler, options = {}) {
71
+ async listen(handler, options = {}) {
67
72
  if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
68
73
  throw new Error("Already listening");
69
74
  }
70
75
  const signal = options.signal;
71
- __classPrivateFieldSet(this, _RedisMessageQueue_loopHandle, setInterval(async () => {
72
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
73
- if (message === undefined)
74
- return;
75
- await handler(message);
76
- }, __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "milliseconds" })), "f");
77
- const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
78
- const onMessage = async () => {
79
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
76
+ const poll = async () => {
77
+ while (!signal?.aborted) {
78
+ let message;
79
+ try {
80
+ message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
81
+ }
82
+ catch (error) {
83
+ logger.error("Error polling for messages: {error}", error);
84
+ return;
85
+ }
80
86
  if (message === undefined)
81
87
  return;
82
88
  await handler(message);
83
- };
84
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", onMessage);
89
+ }
90
+ };
91
+ const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
92
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", poll);
85
93
  signal?.addEventListener("abort", () => {
86
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", onMessage);
94
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", poll);
87
95
  });
88
96
  });
89
- return new Promise((resolve) => {
97
+ signal?.addEventListener("abort", () => {
98
+ for (const timeout of timeouts)
99
+ clearTimeout(timeout);
100
+ });
101
+ const timeouts = new Set();
102
+ while (!signal?.aborted) {
103
+ let timeout;
104
+ await new Promise((resolve) => {
105
+ signal?.addEventListener("abort", resolve);
106
+ timeout = setTimeout(() => {
107
+ signal?.removeEventListener("abort", resolve);
108
+ resolve(0);
109
+ }, __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f"));
110
+ timeouts.add(timeout);
111
+ });
112
+ if (timeout != null)
113
+ timeouts.delete(timeout);
114
+ await poll();
115
+ }
116
+ return await new Promise((resolve) => {
90
117
  signal?.addEventListener("abort", () => {
91
- clearInterval(__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f"));
92
- promise.then(() => resolve());
118
+ promise.catch(() => resolve()).then(() => resolve());
93
119
  });
120
+ promise.catch(() => resolve()).then(() => resolve());
94
121
  });
95
122
  }
96
- [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_loopInterval = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
97
- const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
98
- if (result < 1)
123
+ [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_pollIntervalMs = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
124
+ logger.debug("Polling for messages...");
125
+ const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").set(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"), "EX", Math.floor(__classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f") / 1000 * 2), "NX");
126
+ if (result == null) {
127
+ logger.debug("Another worker is already processing messages; skipping...");
99
128
  return;
100
- await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "seconds" }) * 2);
129
+ }
130
+ logger.debug("Acquired lock; processing messages...");
101
131
  const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
132
+ logger.debug("Found {messages} messages to process.", { messages: messages.length });
102
133
  try {
103
134
  if (messages.length < 1)
104
135
  return;
105
- const message = messages[0];
106
- await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrem(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), message);
107
- return __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").decode(message);
136
+ const encodedMessage = messages[0];
137
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrem(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), encodedMessage);
138
+ const [_, message] = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").decode(encodedMessage);
139
+ return message;
108
140
  }
109
141
  finally {
110
142
  await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").del(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/redis",
3
- "version": "0.2.0",
3
+ "version": "0.3.0-dev.14+1d5c67ec",
4
4
  "description": "Redis drivers for Fedify",
5
5
  "keywords": [
6
6
  "fedify",
@@ -60,7 +60,8 @@
60
60
  ],
61
61
  "dependencies": {
62
62
  "@fedify/fedify": "^1.0.0",
63
- "ioredis": "^5.4.0",
63
+ "@logtape/logtape": "^0.6.3",
64
+ "ioredis": "^5.4.1",
64
65
  "@deno/shim-deno": "~0.18.0",
65
66
  "@js-temporal/polyfill": "^0.4.4"
66
67
  },
package/script/src/mq.js CHANGED
@@ -33,12 +33,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
33
33
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
34
34
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
35
35
  };
36
- var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_loopInterval, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
36
+ var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_pollIntervalMs, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
38
  exports.RedisMessageQueue = void 0;
39
39
  // deno-lint-ignore-file no-explicit-any
40
40
  const dntShim = __importStar(require("../_dnt.shims.js"));
41
+ const logtape_1 = require("@logtape/logtape");
41
42
  const codec_js_1 = require("./codec.js");
43
+ const logger = (0, logtape_1.getLogger)(["fedify", "redis", "mq"]);
42
44
  /**
43
45
  * A message queue that uses Redis as the underlying storage.
44
46
  *
@@ -69,7 +71,7 @@ class RedisMessageQueue {
69
71
  _RedisMessageQueue_queueKey.set(this, void 0);
70
72
  _RedisMessageQueue_lockKey.set(this, void 0);
71
73
  _RedisMessageQueue_codec.set(this, void 0);
72
- _RedisMessageQueue_loopInterval.set(this, void 0);
74
+ _RedisMessageQueue_pollIntervalMs.set(this, void 0);
73
75
  _RedisMessageQueue_loopHandle.set(this, void 0);
74
76
  __classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
75
77
  __classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
@@ -78,59 +80,89 @@ class RedisMessageQueue {
78
80
  __classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
79
81
  __classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
80
82
  __classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new codec_js_1.JsonCodec(), "f");
81
- __classPrivateFieldSet(this, _RedisMessageQueue_loopInterval, dntShim.Temporal.Duration.from(options.loopInterval ?? { seconds: 5 }), "f");
83
+ __classPrivateFieldSet(this, _RedisMessageQueue_pollIntervalMs, dntShim.Temporal.Duration.from(options.pollInterval ?? { seconds: 5 }).total("millisecond"), "f");
82
84
  }
83
85
  async enqueue(message, options) {
84
86
  const ts = options?.delay == null
85
87
  ? 0
86
88
  : dntShim.Temporal.Now.instant().add(options.delay).epochMilliseconds;
87
- const encodedMessage = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").encode(message);
89
+ const encodedMessage = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").encode([
90
+ crypto.randomUUID(),
91
+ message,
92
+ ]);
88
93
  await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zadd(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), ts, encodedMessage);
89
94
  if (ts < 1)
90
95
  __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
91
96
  }
92
- listen(handler, options = {}) {
97
+ async listen(handler, options = {}) {
93
98
  if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
94
99
  throw new Error("Already listening");
95
100
  }
96
101
  const signal = options.signal;
97
- __classPrivateFieldSet(this, _RedisMessageQueue_loopHandle, setInterval(async () => {
98
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
99
- if (message === undefined)
100
- return;
101
- await handler(message);
102
- }, __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "milliseconds" })), "f");
103
- const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
104
- const onMessage = async () => {
105
- const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
102
+ const poll = async () => {
103
+ while (!signal?.aborted) {
104
+ let message;
105
+ try {
106
+ message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
107
+ }
108
+ catch (error) {
109
+ logger.error("Error polling for messages: {error}", error);
110
+ return;
111
+ }
106
112
  if (message === undefined)
107
113
  return;
108
114
  await handler(message);
109
- };
110
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", onMessage);
115
+ }
116
+ };
117
+ const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
118
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", poll);
111
119
  signal?.addEventListener("abort", () => {
112
- __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", onMessage);
120
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", poll);
113
121
  });
114
122
  });
115
- return new Promise((resolve) => {
123
+ signal?.addEventListener("abort", () => {
124
+ for (const timeout of timeouts)
125
+ clearTimeout(timeout);
126
+ });
127
+ const timeouts = new Set();
128
+ while (!signal?.aborted) {
129
+ let timeout;
130
+ await new Promise((resolve) => {
131
+ signal?.addEventListener("abort", resolve);
132
+ timeout = setTimeout(() => {
133
+ signal?.removeEventListener("abort", resolve);
134
+ resolve(0);
135
+ }, __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f"));
136
+ timeouts.add(timeout);
137
+ });
138
+ if (timeout != null)
139
+ timeouts.delete(timeout);
140
+ await poll();
141
+ }
142
+ return await new Promise((resolve) => {
116
143
  signal?.addEventListener("abort", () => {
117
- clearInterval(__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f"));
118
- promise.then(() => resolve());
144
+ promise.catch(() => resolve()).then(() => resolve());
119
145
  });
146
+ promise.catch(() => resolve()).then(() => resolve());
120
147
  });
121
148
  }
122
- [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_loopInterval = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
123
- const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
124
- if (result < 1)
149
+ [(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_pollIntervalMs = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
150
+ logger.debug("Polling for messages...");
151
+ const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").set(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"), "EX", Math.floor(__classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f") / 1000 * 2), "NX");
152
+ if (result == null) {
153
+ logger.debug("Another worker is already processing messages; skipping...");
125
154
  return;
126
- await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "seconds" }) * 2);
155
+ }
156
+ logger.debug("Acquired lock; processing messages...");
127
157
  const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
158
+ logger.debug("Found {messages} messages to process.", { messages: messages.length });
128
159
  try {
129
160
  if (messages.length < 1)
130
161
  return;
131
- const message = messages[0];
132
- await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrem(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), message);
133
- return __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").decode(message);
162
+ const encodedMessage = messages[0];
163
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrem(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), encodedMessage);
164
+ const [_, message] = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").decode(encodedMessage);
165
+ return message;
134
166
  }
135
167
  finally {
136
168
  await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").del(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"));
package/types/src/mq.d.ts CHANGED
@@ -16,31 +16,31 @@ export interface RedisMessageQueueOptions {
16
16
  /**
17
17
  * The Pub/Sub channel key to use for the message queue. `"fedify_channel"`
18
18
  * by default.
19
+ * @default `"fedify_channel"`
19
20
  */
20
21
  channelKey?: RedisKey;
21
22
  /**
22
23
  * The Sorted Set key to use for the delayed message queue. `"fedify_queue"`
23
24
  * by default.
25
+ * @default `"fedify_queue"`
24
26
  */
25
27
  queueKey?: RedisKey;
26
28
  /**
27
29
  * The key to use for locking the message queue. `"fedify_lock"` by default.
30
+ * @default `"fedify_lock"`
28
31
  */
29
32
  lockKey?: RedisKey;
30
33
  /**
31
34
  * The codec to use for encoding and decoding messages in the key-value store.
32
35
  * Defaults to {@link JsonCodec}.
36
+ * @default {@link JsonCodec}
33
37
  */
34
38
  codec?: Codec;
35
39
  /**
36
- * The interval at which to poll the message queue for delayed messages.
37
- * If this interval is too short, it may cause excessive load on the Redis
38
- * server. If it is too long, it may cause messages to be delayed longer
39
- * than expected.
40
- *
41
- * 5 seconds by default.
40
+ * The poll interval for the message queue. 5 seconds by default.
41
+ * @default `{ seconds: 5 }`
42
42
  */
43
- loopInterval?: dntShim.Temporal.DurationLike;
43
+ pollInterval?: dntShim.Temporal.Duration | dntShim.Temporal.DurationLike;
44
44
  }
45
45
  /**
46
46
  * A message queue that uses Redis as the underlying storage.
@@ -1 +1 @@
1
- {"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC9C;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,YAAW,YAAY,EAAE,UAAU;;IAWhE;;;;OAIG;gBACS,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,GAAE,wBAA6B;IAahE,OAAO,CACX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IA+BhB,MAAM,CACJ,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IA6BhB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAKzB"}
1
+ {"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAInD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC1E;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,YAAW,YAAY,EAAE,UAAU;;IAWhE;;;;OAIG;gBACS,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,GAAE,wBAA6B;IAahE,OAAO,CACX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IAgDV,MAAM,CACV,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IAoDhB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAKzB"}