@fedify/redis 0.1.0-dev.6 → 0.1.0

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
@@ -31,4 +31,4 @@ Changelog
31
31
 
32
32
  ### Version 0.1.0
33
33
 
34
- To be released.
34
+ Initial release. Released on June 22, 2024.
@@ -0,0 +1,64 @@
1
+ import { Deno } from "@deno/shim-deno";
2
+ export { Deno } from "@deno/shim-deno";
3
+ import { Temporal as Temporal } from "@js-temporal/polyfill";
4
+ export { Temporal as Temporal } from "@js-temporal/polyfill";
5
+ const dntGlobals = {
6
+ Deno,
7
+ Temporal,
8
+ };
9
+ export const dntGlobalThis = createMergeProxy(globalThis, dntGlobals);
10
+ function createMergeProxy(baseObj, extObj) {
11
+ return new Proxy(baseObj, {
12
+ get(_target, prop, _receiver) {
13
+ if (prop in extObj) {
14
+ return extObj[prop];
15
+ }
16
+ else {
17
+ return baseObj[prop];
18
+ }
19
+ },
20
+ set(_target, prop, value) {
21
+ if (prop in extObj) {
22
+ delete extObj[prop];
23
+ }
24
+ baseObj[prop] = value;
25
+ return true;
26
+ },
27
+ deleteProperty(_target, prop) {
28
+ let success = false;
29
+ if (prop in extObj) {
30
+ delete extObj[prop];
31
+ success = true;
32
+ }
33
+ if (prop in baseObj) {
34
+ delete baseObj[prop];
35
+ success = true;
36
+ }
37
+ return success;
38
+ },
39
+ ownKeys(_target) {
40
+ const baseKeys = Reflect.ownKeys(baseObj);
41
+ const extKeys = Reflect.ownKeys(extObj);
42
+ const extKeysSet = new Set(extKeys);
43
+ return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];
44
+ },
45
+ defineProperty(_target, prop, desc) {
46
+ if (prop in extObj) {
47
+ delete extObj[prop];
48
+ }
49
+ Reflect.defineProperty(baseObj, prop, desc);
50
+ return true;
51
+ },
52
+ getOwnPropertyDescriptor(_target, prop) {
53
+ if (prop in extObj) {
54
+ return Reflect.getOwnPropertyDescriptor(extObj, prop);
55
+ }
56
+ else {
57
+ return Reflect.getOwnPropertyDescriptor(baseObj, prop);
58
+ }
59
+ },
60
+ has(_target, prop) {
61
+ return prop in extObj || prop in baseObj;
62
+ },
63
+ });
64
+ }
package/esm/src/mod.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from "./codec.js";
2
2
  export * from "./kv.js";
3
+ export * from "./mq.js";
package/esm/src/mq.js ADDED
@@ -0,0 +1,94 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
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;
13
+ // deno-lint-ignore-file no-explicit-any
14
+ import * as dntShim from "../_dnt.shims.js";
15
+ import { JsonCodec } from "./codec.js";
16
+ /**
17
+ * A message queue that uses Redis as the underlying storage.
18
+ */
19
+ export class RedisMessageQueue {
20
+ /**
21
+ * Creates a new Redis message queue.
22
+ * @param redis The Redis client factory.
23
+ * @param options The options for the message queue.
24
+ */
25
+ constructor(redis, options = {}) {
26
+ _RedisMessageQueue_instances.add(this);
27
+ _RedisMessageQueue_redis.set(this, void 0);
28
+ _RedisMessageQueue_subRedis.set(this, void 0);
29
+ _RedisMessageQueue_workerId.set(this, void 0);
30
+ _RedisMessageQueue_channelKey.set(this, void 0);
31
+ _RedisMessageQueue_queueKey.set(this, void 0);
32
+ _RedisMessageQueue_lockKey.set(this, void 0);
33
+ _RedisMessageQueue_codec.set(this, void 0);
34
+ _RedisMessageQueue_loopInterval.set(this, void 0);
35
+ _RedisMessageQueue_loopHandle.set(this, void 0);
36
+ __classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
37
+ __classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
38
+ __classPrivateFieldSet(this, _RedisMessageQueue_workerId, options.workerId ?? crypto.randomUUID(), "f");
39
+ __classPrivateFieldSet(this, _RedisMessageQueue_channelKey, options.channelKey ?? "fedify_channel", "f");
40
+ __classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
41
+ __classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
42
+ __classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new JsonCodec(), "f");
43
+ __classPrivateFieldSet(this, _RedisMessageQueue_loopInterval, dntShim.Temporal.Duration.from(options.loopInterval ?? { seconds: 5 }), "f");
44
+ }
45
+ async enqueue(message, options) {
46
+ const ts = options?.delay == null
47
+ ? 0
48
+ : dntShim.Temporal.Now.instant().add(options.delay).epochMilliseconds;
49
+ const encodedMessage = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").encode(message);
50
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zadd(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), ts, encodedMessage);
51
+ if (ts < 1)
52
+ __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
53
+ }
54
+ listen(handler) {
55
+ if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
56
+ throw new Error("Already listening");
57
+ }
58
+ __classPrivateFieldSet(this, _RedisMessageQueue_loopHandle, setInterval(async () => {
59
+ const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
60
+ if (message === undefined)
61
+ return;
62
+ await handler(message);
63
+ }, __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "milliseconds" })), "f");
64
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
65
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", async () => {
66
+ const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
67
+ if (message === undefined)
68
+ return;
69
+ await handler(message);
70
+ });
71
+ });
72
+ }
73
+ [(_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() {
74
+ const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
75
+ if (result < 1)
76
+ return;
77
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "seconds" }) * 2);
78
+ const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
79
+ try {
80
+ if (messages.length < 1)
81
+ return;
82
+ const message = messages[0];
83
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrem(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), message);
84
+ return __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").decode(message);
85
+ }
86
+ finally {
87
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").del(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"));
88
+ }
89
+ }, Symbol.dispose)]() {
90
+ clearInterval(__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f"));
91
+ __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").disconnect();
92
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").disconnect();
93
+ }
94
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/redis",
3
- "version": "0.1.0-dev.6+c7c9dbcd",
3
+ "version": "0.1.0",
4
4
  "description": "Redis drivers for Fedify",
5
5
  "keywords": [
6
6
  "fedify",
@@ -37,7 +37,9 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@fedify/fedify": "^0.10.0",
40
- "ioredis": "^5.4.0"
40
+ "ioredis": "^5.4.0",
41
+ "@deno/shim-deno": "~0.18.0",
42
+ "@js-temporal/polyfill": "^0.4.4"
41
43
  },
42
44
  "devDependencies": {
43
45
  "@types/node": "^20.9.0"
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dntGlobalThis = exports.Temporal = exports.Deno = void 0;
4
+ const shim_deno_1 = require("@deno/shim-deno");
5
+ var shim_deno_2 = require("@deno/shim-deno");
6
+ Object.defineProperty(exports, "Deno", { enumerable: true, get: function () { return shim_deno_2.Deno; } });
7
+ const polyfill_1 = require("@js-temporal/polyfill");
8
+ var polyfill_2 = require("@js-temporal/polyfill");
9
+ Object.defineProperty(exports, "Temporal", { enumerable: true, get: function () { return polyfill_2.Temporal; } });
10
+ const dntGlobals = {
11
+ Deno: shim_deno_1.Deno,
12
+ Temporal: polyfill_1.Temporal,
13
+ };
14
+ exports.dntGlobalThis = createMergeProxy(globalThis, dntGlobals);
15
+ function createMergeProxy(baseObj, extObj) {
16
+ return new Proxy(baseObj, {
17
+ get(_target, prop, _receiver) {
18
+ if (prop in extObj) {
19
+ return extObj[prop];
20
+ }
21
+ else {
22
+ return baseObj[prop];
23
+ }
24
+ },
25
+ set(_target, prop, value) {
26
+ if (prop in extObj) {
27
+ delete extObj[prop];
28
+ }
29
+ baseObj[prop] = value;
30
+ return true;
31
+ },
32
+ deleteProperty(_target, prop) {
33
+ let success = false;
34
+ if (prop in extObj) {
35
+ delete extObj[prop];
36
+ success = true;
37
+ }
38
+ if (prop in baseObj) {
39
+ delete baseObj[prop];
40
+ success = true;
41
+ }
42
+ return success;
43
+ },
44
+ ownKeys(_target) {
45
+ const baseKeys = Reflect.ownKeys(baseObj);
46
+ const extKeys = Reflect.ownKeys(extObj);
47
+ const extKeysSet = new Set(extKeys);
48
+ return [...baseKeys.filter((k) => !extKeysSet.has(k)), ...extKeys];
49
+ },
50
+ defineProperty(_target, prop, desc) {
51
+ if (prop in extObj) {
52
+ delete extObj[prop];
53
+ }
54
+ Reflect.defineProperty(baseObj, prop, desc);
55
+ return true;
56
+ },
57
+ getOwnPropertyDescriptor(_target, prop) {
58
+ if (prop in extObj) {
59
+ return Reflect.getOwnPropertyDescriptor(extObj, prop);
60
+ }
61
+ else {
62
+ return Reflect.getOwnPropertyDescriptor(baseObj, prop);
63
+ }
64
+ },
65
+ has(_target, prop) {
66
+ return prop in extObj || prop in baseObj;
67
+ },
68
+ });
69
+ }
package/script/src/mod.js CHANGED
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./codec.js"), exports);
18
18
  __exportStar(require("./kv.js"), exports);
19
+ __exportStar(require("./mq.js"), exports);
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
26
+ if (kind === "m") throw new TypeError("Private method is not writable");
27
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
28
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
29
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
30
+ };
31
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
32
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
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;
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.RedisMessageQueue = void 0;
39
+ // deno-lint-ignore-file no-explicit-any
40
+ const dntShim = __importStar(require("../_dnt.shims.js"));
41
+ const codec_js_1 = require("./codec.js");
42
+ /**
43
+ * A message queue that uses Redis as the underlying storage.
44
+ */
45
+ class RedisMessageQueue {
46
+ /**
47
+ * Creates a new Redis message queue.
48
+ * @param redis The Redis client factory.
49
+ * @param options The options for the message queue.
50
+ */
51
+ constructor(redis, options = {}) {
52
+ _RedisMessageQueue_instances.add(this);
53
+ _RedisMessageQueue_redis.set(this, void 0);
54
+ _RedisMessageQueue_subRedis.set(this, void 0);
55
+ _RedisMessageQueue_workerId.set(this, void 0);
56
+ _RedisMessageQueue_channelKey.set(this, void 0);
57
+ _RedisMessageQueue_queueKey.set(this, void 0);
58
+ _RedisMessageQueue_lockKey.set(this, void 0);
59
+ _RedisMessageQueue_codec.set(this, void 0);
60
+ _RedisMessageQueue_loopInterval.set(this, void 0);
61
+ _RedisMessageQueue_loopHandle.set(this, void 0);
62
+ __classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
63
+ __classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
64
+ __classPrivateFieldSet(this, _RedisMessageQueue_workerId, options.workerId ?? crypto.randomUUID(), "f");
65
+ __classPrivateFieldSet(this, _RedisMessageQueue_channelKey, options.channelKey ?? "fedify_channel", "f");
66
+ __classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
67
+ __classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
68
+ __classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new codec_js_1.JsonCodec(), "f");
69
+ __classPrivateFieldSet(this, _RedisMessageQueue_loopInterval, dntShim.Temporal.Duration.from(options.loopInterval ?? { seconds: 5 }), "f");
70
+ }
71
+ async enqueue(message, options) {
72
+ const ts = options?.delay == null
73
+ ? 0
74
+ : dntShim.Temporal.Now.instant().add(options.delay).epochMilliseconds;
75
+ const encodedMessage = __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").encode(message);
76
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zadd(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), ts, encodedMessage);
77
+ if (ts < 1)
78
+ __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
79
+ }
80
+ listen(handler) {
81
+ if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
82
+ throw new Error("Already listening");
83
+ }
84
+ __classPrivateFieldSet(this, _RedisMessageQueue_loopHandle, setInterval(async () => {
85
+ const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
86
+ if (message === undefined)
87
+ return;
88
+ await handler(message);
89
+ }, __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "milliseconds" })), "f");
90
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
91
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", async () => {
92
+ const message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
93
+ if (message === undefined)
94
+ return;
95
+ await handler(message);
96
+ });
97
+ });
98
+ }
99
+ [(_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() {
100
+ const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
101
+ if (result < 1)
102
+ return;
103
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_loopInterval, "f").total({ unit: "seconds" }) * 2);
104
+ const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
105
+ try {
106
+ if (messages.length < 1)
107
+ return;
108
+ const message = messages[0];
109
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrem(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), message);
110
+ return __classPrivateFieldGet(this, _RedisMessageQueue_codec, "f").decode(message);
111
+ }
112
+ finally {
113
+ await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").del(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"));
114
+ }
115
+ }, Symbol.dispose)]() {
116
+ clearInterval(__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f"));
117
+ __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").disconnect();
118
+ __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").disconnect();
119
+ }
120
+ }
121
+ exports.RedisMessageQueue = RedisMessageQueue;
@@ -0,0 +1,9 @@
1
+ import { Deno } from "@deno/shim-deno";
2
+ export { Deno } from "@deno/shim-deno";
3
+ import { Temporal as Temporal } from "@js-temporal/polyfill";
4
+ export { Temporal as Temporal } from "@js-temporal/polyfill";
5
+ export declare const dntGlobalThis: Omit<typeof globalThis, "Deno" | "Temporal"> & {
6
+ Deno: typeof Deno;
7
+ Temporal: typeof Temporal;
8
+ };
9
+ //# sourceMappingURL=_dnt.shims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_dnt.shims.d.ts","sourceRoot":"","sources":["../src/_dnt.shims.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,QAAQ,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,QAAQ,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAM7D,eAAO,MAAM,aAAa;;;CAA2C,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "./codec.js";
2
2
  export * from "./kv.js";
3
+ export * from "./mq.js";
3
4
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/src/mod.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/src/mod.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,61 @@
1
+ /// <reference types="node" />
2
+ import * as dntShim from "../_dnt.shims.js";
3
+ import type { MessageQueue, MessageQueueEnqueueOptions } from "@fedify/fedify";
4
+ import type { Redis, RedisKey } from "ioredis";
5
+ import { type Codec } from "./codec.js";
6
+ /**
7
+ * Options for {@link RedisMessageQueue} class.
8
+ */
9
+ export interface RedisMessageQueueOptions {
10
+ /**
11
+ * The unique identifier for the worker that is processing messages from the
12
+ * queue. If this is not specified, a random identifier will be generated.
13
+ * This is used to prevent multiple workers from processing the same message,
14
+ * so it should be unique for each worker.
15
+ */
16
+ workerId?: string;
17
+ /**
18
+ * The Pub/Sub channel key to use for the message queue. `"fedify_channel"`
19
+ * by default.
20
+ */
21
+ channelKey?: RedisKey;
22
+ /**
23
+ * The Sorted Set key to use for the delayed message queue. `"fedify_queue"`
24
+ * by default.
25
+ */
26
+ queueKey?: RedisKey;
27
+ /**
28
+ * The key to use for locking the message queue. `"fedify_lock"` by default.
29
+ */
30
+ lockKey?: RedisKey;
31
+ /**
32
+ * The codec to use for encoding and decoding messages in the key-value store.
33
+ * Defaults to {@link JsonCodec}.
34
+ */
35
+ codec?: Codec;
36
+ /**
37
+ * The interval at which to poll the message queue for delayed messages.
38
+ * If this interval is too short, it may cause excessive load on the Redis
39
+ * server. If it is too long, it may cause messages to be delayed longer
40
+ * than expected.
41
+ *
42
+ * 5 seconds by default.
43
+ */
44
+ loopInterval?: dntShim.Temporal.DurationLike;
45
+ }
46
+ /**
47
+ * A message queue that uses Redis as the underlying storage.
48
+ */
49
+ export declare class RedisMessageQueue implements MessageQueue, Disposable {
50
+ #private;
51
+ /**
52
+ * Creates a new Redis message queue.
53
+ * @param redis The Redis client factory.
54
+ * @param options The options for the message queue.
55
+ */
56
+ constructor(redis: () => Redis, options?: RedisMessageQueueOptions);
57
+ enqueue(message: any, options?: MessageQueueEnqueueOptions): Promise<void>;
58
+ listen(handler: (message: any) => void | Promise<void>): void;
59
+ [Symbol.dispose](): void;
60
+ }
61
+ //# sourceMappingURL=mq.d.ts.map
@@ -0,0 +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,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC/E,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;;GAEG;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,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAkB7D,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAKzB"}