@pangza/redis 0.0.0-stage → 1.0.1

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 (86) hide show
  1. package/README.md +2 -2
  2. package/dist/Redis.d.ts +98 -0
  3. package/dist/Redis.d.ts.map +1 -0
  4. package/dist/Redis.js +678 -0
  5. package/dist/Redis.js.map +1 -0
  6. package/dist/cache.d.ts +16 -0
  7. package/dist/cache.d.ts.map +1 -0
  8. package/dist/cache.js +82 -0
  9. package/dist/cache.js.map +1 -0
  10. package/dist/decorators.d.ts +15 -0
  11. package/dist/decorators.d.ts.map +1 -0
  12. package/dist/decorators.js +30 -0
  13. package/dist/decorators.js.map +1 -0
  14. package/dist/enable.d.ts +12 -0
  15. package/dist/enable.d.ts.map +1 -0
  16. package/dist/enable.js +30 -0
  17. package/dist/enable.js.map +1 -0
  18. package/dist/errors.d.ts +11 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +22 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/flag.d.ts +2 -0
  23. package/dist/flag.d.ts.map +1 -0
  24. package/dist/flag.js +8 -0
  25. package/dist/flag.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +43 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/rateLimit.d.ts +15 -0
  31. package/dist/rateLimit.d.ts.map +1 -0
  32. package/dist/rateLimit.js +90 -0
  33. package/dist/rateLimit.js.map +1 -0
  34. package/dist/redisson/RCountDownLatch.d.ts +12 -0
  35. package/dist/redisson/RCountDownLatch.d.ts.map +1 -0
  36. package/dist/redisson/RCountDownLatch.js +48 -0
  37. package/dist/redisson/RCountDownLatch.js.map +1 -0
  38. package/dist/redisson/RFairLock.d.ts +7 -0
  39. package/dist/redisson/RFairLock.d.ts.map +1 -0
  40. package/dist/redisson/RFairLock.js +32 -0
  41. package/dist/redisson/RFairLock.js.map +1 -0
  42. package/dist/redisson/RLock.d.ts +44 -0
  43. package/dist/redisson/RLock.d.ts.map +1 -0
  44. package/dist/redisson/RLock.js +156 -0
  45. package/dist/redisson/RLock.js.map +1 -0
  46. package/dist/redisson/RMultiLock.d.ts +18 -0
  47. package/dist/redisson/RMultiLock.d.ts.map +1 -0
  48. package/dist/redisson/RMultiLock.js +95 -0
  49. package/dist/redisson/RMultiLock.js.map +1 -0
  50. package/dist/redisson/RReadWriteLock.d.ts +9 -0
  51. package/dist/redisson/RReadWriteLock.d.ts.map +1 -0
  52. package/dist/redisson/RReadWriteLock.js +51 -0
  53. package/dist/redisson/RReadWriteLock.js.map +1 -0
  54. package/dist/redisson/RSemaphore.d.ts +13 -0
  55. package/dist/redisson/RSemaphore.d.ts.map +1 -0
  56. package/dist/redisson/RSemaphore.js +55 -0
  57. package/dist/redisson/RSemaphore.js.map +1 -0
  58. package/dist/redisson/Redisson.d.ts +45 -0
  59. package/dist/redisson/Redisson.d.ts.map +1 -0
  60. package/dist/redisson/Redisson.js +111 -0
  61. package/dist/redisson/Redisson.js.map +1 -0
  62. package/dist/redisson/index.d.ts +12 -0
  63. package/dist/redisson/index.d.ts.map +1 -0
  64. package/dist/redisson/index.js +32 -0
  65. package/dist/redisson/index.js.map +1 -0
  66. package/dist/redisson/objects.d.ts +116 -0
  67. package/dist/redisson/objects.d.ts.map +1 -0
  68. package/dist/redisson/objects.js +384 -0
  69. package/dist/redisson/objects.js.map +1 -0
  70. package/dist/redisson/scripts.d.ts +22 -0
  71. package/dist/redisson/scripts.d.ts.map +1 -0
  72. package/dist/redisson/scripts.js +196 -0
  73. package/dist/redisson/scripts.js.map +1 -0
  74. package/dist/redisson/types.d.ts +140 -0
  75. package/dist/redisson/types.d.ts.map +1 -0
  76. package/dist/redisson/types.js +8 -0
  77. package/dist/redisson/types.js.map +1 -0
  78. package/dist/redisson/utils.d.ts +12 -0
  79. package/dist/redisson/utils.d.ts.map +1 -0
  80. package/dist/redisson/utils.js +82 -0
  81. package/dist/redisson/utils.js.map +1 -0
  82. package/dist/types.d.ts +141 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +25 -0
  85. package/dist/types.js.map +1 -0
  86. package/package.json +36 -4
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createFairLock = createFairLock;
7
+ const Redis_1 = __importDefault(require("../Redis"));
8
+ const scripts_1 = require("./scripts");
9
+ const RLock_1 = require("./RLock");
10
+ const types_1 = require("./types");
11
+ const utils_1 = require("./utils");
12
+ /**
13
+ * 公平锁:按等待队列顺序获取(简化版 Redisson FairLock)。
14
+ */
15
+ function createFairLock(name, clientId, config = types_1.defaultRedissonConfig) {
16
+ const queueKey = () => Redis_1.default.key(`${name}:fair:queue`);
17
+ const timeoutPrefix = () => Redis_1.default.key(`${name}:fair:timeout:`);
18
+ return new RLock_1.RedissonLock(name, clientId, config, {
19
+ acquire: (threadId, leaseMs) => (0, utils_1.evalNumber)(scripts_1.FAIR_LOCK_ACQUIRE_LUA, [
20
+ Redis_1.default.key(name),
21
+ queueKey(),
22
+ timeoutPrefix(),
23
+ ], [leaseMs, `${clientId}:${threadId}`, Math.max(leaseMs * 2, 60000)]),
24
+ unlock: async (threadId, leaseMs) => {
25
+ const result = await (0, utils_1.evalScript)(scripts_1.LOCK_UNLOCK_LUA, [Redis_1.default.key(name), `pangza_lock_channel:{${name}}`], ["0", leaseMs, `${clientId}:${threadId}`]);
26
+ if (result === null || result === undefined)
27
+ return null;
28
+ return Number(result);
29
+ },
30
+ });
31
+ }
32
+ //# sourceMappingURL=RFairLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RFairLock.js","sourceRoot":"","sources":["../../src/redisson/RFairLock.ts"],"names":[],"mappings":";;;;;AAUA,wCA6BC;AAvCD,qDAA6B;AAC7B,uCAAmE;AACnE,mCAAuC;AAEvC,mCAAgD;AAChD,mCAAiD;AAEjD;;GAEG;AACH,SAAgB,cAAc,CAC5B,IAAY,EACZ,QAAgB,EAChB,SAAmC,6BAAqB;IAExD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,IAAI,gBAAgB,CAAC,CAAC;IAE/D,OAAO,IAAI,oBAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC9C,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC7B,IAAA,kBAAU,EACR,+BAAqB,EACrB;YACE,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YACf,QAAQ,EAAE;YACV,aAAa,EAAE;SAChB,EACD,CAAC,OAAO,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAM,CAAC,CAAC,CACpE;QACH,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAU,EAC7B,yBAAe,EACf,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,wBAAwB,IAAI,GAAG,CAAC,EAClD,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAC1C,CAAC;YACF,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;YACzD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { RedissonConfig, RLock } from "./types";
2
+ type AcquireFn = (threadId: string, leaseMs: number) => Promise<number | null>;
3
+ type UnlockFn = (threadId: string, leaseMs: number) => Promise<number | null>;
4
+ /**
5
+ * Redisson 风格可重入分布式锁(Hash + 看门狗 + pub/sub 唤醒)。
6
+ */
7
+ export declare class RedissonLock implements RLock {
8
+ readonly name: string;
9
+ private readonly clientId;
10
+ /** Redis 存储名(默认与 name 相同;读写锁读写端共享) */
11
+ private readonly storageName?;
12
+ private readonly watchdogTimeout;
13
+ private readonly watchInterval;
14
+ private renewTimer;
15
+ private heldThreadId;
16
+ private readonly doAcquire;
17
+ private readonly doUnlock;
18
+ constructor(name: string, clientId: string, config?: Required<RedissonConfig>, hooks?: {
19
+ acquire?: AcquireFn;
20
+ unlock?: UnlockFn;
21
+ },
22
+ /** Redis 存储名(默认与 name 相同;读写锁读写端共享) */
23
+ storageName?: string | undefined);
24
+ protected lockKey(): string;
25
+ protected channel(): string;
26
+ protected field(threadId: string): string;
27
+ private unlockInner;
28
+ lock(leaseTimeMs?: number): Promise<void>;
29
+ /**
30
+ * @param waitTimeMs 等待毫秒;undefined=0(立即);-1=无限等
31
+ * @param leaseTimeMs 租约;undefined/-1=看门狗
32
+ */
33
+ tryLock(waitTimeMs?: number, leaseTimeMs?: number): Promise<boolean>;
34
+ private scheduleWatchdog;
35
+ private cancelWatchdog;
36
+ unlock(): Promise<void>;
37
+ forceUnlock(): Promise<boolean>;
38
+ isLocked(): Promise<boolean>;
39
+ isHeldByCurrentThread(): Promise<boolean>;
40
+ getHoldCount(): Promise<number>;
41
+ remainTimeToLive(): Promise<number>;
42
+ }
43
+ export {};
44
+ //# sourceMappingURL=RLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RLock.d.ts","sourceRoot":"","sources":["../../src/redisson/RLock.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAYrD,KAAK,SAAS,GAAG,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B,KAAK,QAAQ,GAAG,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,qBAAa,YAAa,YAAW,KAAK;IAStC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAGzB,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAb/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;gBAGzB,IAAI,EAAE,MAAM,EACJ,QAAQ,EAAE,MAAM,EACjC,MAAM,GAAE,QAAQ,CAAC,cAAc,CAAyB,EACxD,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,CAAA;KAAE;IAClD,sCAAsC;IACrB,WAAW,CAAC,EAAE,MAAM,YAAA;IAiBvC,SAAS,CAAC,OAAO,IAAI,MAAM;IAI3B,SAAS,CAAC,OAAO,IAAI,MAAM;IAI3B,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;YAI3B,WAAW;IAcnB,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;;OAGG;IACG,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuC1E,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,cAAc;IAOhB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAW/B,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAM5B,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAOzC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAO/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAI1C"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedissonLock = void 0;
7
+ const Redis_1 = __importDefault(require("../Redis"));
8
+ const errors_1 = require("../errors");
9
+ const scripts_1 = require("./scripts");
10
+ const types_1 = require("./types");
11
+ const utils_1 = require("./utils");
12
+ /**
13
+ * Redisson 风格可重入分布式锁(Hash + 看门狗 + pub/sub 唤醒)。
14
+ */
15
+ class RedissonLock {
16
+ constructor(name, clientId, config = types_1.defaultRedissonConfig, hooks,
17
+ /** Redis 存储名(默认与 name 相同;读写锁读写端共享) */
18
+ storageName) {
19
+ this.name = name;
20
+ this.clientId = clientId;
21
+ this.storageName = storageName;
22
+ this.renewTimer = null;
23
+ this.heldThreadId = null;
24
+ this.watchdogTimeout = config.lockWatchdogTimeout;
25
+ this.watchInterval = config.lockWatchInterval;
26
+ this.doAcquire =
27
+ hooks?.acquire ??
28
+ ((threadId, leaseMs) => (0, utils_1.evalNumber)(scripts_1.LOCK_ACQUIRE_LUA, [this.lockKey()], [
29
+ leaseMs,
30
+ this.field(threadId),
31
+ ]));
32
+ this.doUnlock =
33
+ hooks?.unlock ??
34
+ ((threadId, leaseMs) => this.unlockInner(scripts_1.LOCK_UNLOCK_LUA, threadId, leaseMs));
35
+ }
36
+ lockKey() {
37
+ return Redis_1.default.key(this.storageName ?? this.name);
38
+ }
39
+ channel() {
40
+ return (0, utils_1.channelName)(this.storageName ?? this.name);
41
+ }
42
+ field(threadId) {
43
+ return `${this.clientId}:${threadId}`;
44
+ }
45
+ async unlockInner(script, threadId, leaseMs) {
46
+ const result = await (0, utils_1.evalScript)(script, [this.lockKey(), this.channel()], [
47
+ "0",
48
+ leaseMs,
49
+ this.field(threadId),
50
+ ]);
51
+ if (result === null || result === undefined)
52
+ return null;
53
+ return Number(result);
54
+ }
55
+ async lock(leaseTimeMs) {
56
+ const ok = await this.tryLock(-1, leaseTimeMs);
57
+ if (!ok)
58
+ throw new errors_1.LockError(`获取锁失败: ${this.name}`);
59
+ }
60
+ /**
61
+ * @param waitTimeMs 等待毫秒;undefined=0(立即);-1=无限等
62
+ * @param leaseTimeMs 租约;undefined/-1=看门狗
63
+ */
64
+ async tryLock(waitTimeMs, leaseTimeMs) {
65
+ // 同一 RLock 实例已持有时复用 threadId,保证跨 await 可重入
66
+ const threadId = this.heldThreadId ?? (0, utils_1.currentThreadId)(this.clientId);
67
+ return (0, utils_1.runWithThreadIdAsync)(threadId, async () => {
68
+ const wait = waitTimeMs === undefined ? 0 : waitTimeMs;
69
+ const useWatchdog = leaseTimeMs === undefined || leaseTimeMs < 0;
70
+ const lease = useWatchdog
71
+ ? this.watchdogTimeout
72
+ : Math.max(1, leaseTimeMs);
73
+ const deadline = wait < 0 ? Number.POSITIVE_INFINITY : Date.now() + Math.max(0, wait);
74
+ for (;;) {
75
+ const ttl = await this.doAcquire(threadId, lease);
76
+ if (ttl === null) {
77
+ this.heldThreadId = threadId;
78
+ if (useWatchdog)
79
+ this.scheduleWatchdog(threadId, lease);
80
+ return true;
81
+ }
82
+ if (Date.now() >= deadline)
83
+ return false;
84
+ const remain = Math.min(Math.max(ttl > 0 ? ttl : this.watchInterval, this.watchInterval), Math.max(0, deadline - Date.now()));
85
+ if (remain <= 0)
86
+ return false;
87
+ const notified = await (0, utils_1.waitNotify)(this.channel(), Math.min(remain, 3000));
88
+ if (!notified) {
89
+ await (0, utils_1.sleep)(Math.min(this.watchInterval, remain));
90
+ }
91
+ }
92
+ });
93
+ }
94
+ scheduleWatchdog(threadId, leaseMs) {
95
+ this.cancelWatchdog();
96
+ const every = Math.max(100, Math.floor(leaseMs / 3));
97
+ this.renewTimer = setInterval(() => {
98
+ void (0, utils_1.evalNumber)(scripts_1.LOCK_RENEW_LUA, [this.lockKey()], [
99
+ leaseMs,
100
+ this.field(threadId),
101
+ ]).then((ok) => {
102
+ if (ok !== 1)
103
+ this.cancelWatchdog();
104
+ });
105
+ }, every);
106
+ if (typeof this.renewTimer === "object" && "unref" in this.renewTimer) {
107
+ this.renewTimer.unref?.();
108
+ }
109
+ }
110
+ cancelWatchdog() {
111
+ if (this.renewTimer) {
112
+ clearInterval(this.renewTimer);
113
+ this.renewTimer = null;
114
+ }
115
+ }
116
+ async unlock() {
117
+ const threadId = this.heldThreadId ?? (0, utils_1.currentThreadId)(this.clientId);
118
+ const result = await this.doUnlock(threadId, this.watchdogTimeout);
119
+ if (result === null) {
120
+ throw new errors_1.LockError(`无法解锁(非持有者): ${this.name}`);
121
+ }
122
+ if (result === 1) {
123
+ this.cancelWatchdog();
124
+ this.heldThreadId = null;
125
+ }
126
+ }
127
+ async forceUnlock() {
128
+ this.cancelWatchdog();
129
+ this.heldThreadId = null;
130
+ const n = await (0, utils_1.evalNumber)(scripts_1.LOCK_FORCE_UNLOCK_LUA, [this.lockKey(), this.channel()], ["0"]);
131
+ return n === 1;
132
+ }
133
+ async isLocked() {
134
+ const client = await Redis_1.default.getClient();
135
+ const n = await client.exists(this.lockKey());
136
+ return Number(n) > 0;
137
+ }
138
+ async isHeldByCurrentThread() {
139
+ const threadId = this.heldThreadId ?? (0, utils_1.currentThreadId)(this.clientId);
140
+ const client = await Redis_1.default.getClient();
141
+ const n = await client.hExists(this.lockKey(), this.field(threadId));
142
+ return Number(n) === 1;
143
+ }
144
+ async getHoldCount() {
145
+ const threadId = this.heldThreadId ?? (0, utils_1.currentThreadId)(this.clientId);
146
+ const client = await Redis_1.default.getClient();
147
+ const v = await client.hGet(this.lockKey(), this.field(threadId));
148
+ return v == null ? 0 : Number(v);
149
+ }
150
+ async remainTimeToLive() {
151
+ const client = await Redis_1.default.getClient();
152
+ return client.pTTL(this.lockKey());
153
+ }
154
+ }
155
+ exports.RedissonLock = RedissonLock;
156
+ //# sourceMappingURL=RLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RLock.js","sourceRoot":"","sources":["../../src/redisson/RLock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RLock } from "./types";
2
+ /**
3
+ * 联锁:按顺序加锁,失败则回滚已加锁。
4
+ */
5
+ export declare class RedissonMultiLock implements RLock {
6
+ private readonly locks;
7
+ readonly name: string;
8
+ constructor(locks: RLock[]);
9
+ lock(leaseTimeMs?: number): Promise<void>;
10
+ tryLock(waitTimeMs?: number, leaseTimeMs?: number): Promise<boolean>;
11
+ unlock(): Promise<void>;
12
+ forceUnlock(): Promise<boolean>;
13
+ isLocked(): Promise<boolean>;
14
+ isHeldByCurrentThread(): Promise<boolean>;
15
+ getHoldCount(): Promise<number>;
16
+ remainTimeToLive(): Promise<number>;
17
+ }
18
+ //# sourceMappingURL=RMultiLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RMultiLock.d.ts","sourceRoot":"","sources":["../../src/redisson/RMultiLock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;GAEG;AACH,qBAAa,iBAAkB,YAAW,KAAK;IAGjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEO,KAAK,EAAE,KAAK,EAAE;IAKrC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BpE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAMvB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/B,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAO5B,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC;IAOzC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAO1C"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedissonMultiLock = void 0;
4
+ const errors_1 = require("../errors");
5
+ /**
6
+ * 联锁:按顺序加锁,失败则回滚已加锁。
7
+ */
8
+ class RedissonMultiLock {
9
+ constructor(locks) {
10
+ this.locks = locks;
11
+ if (!locks.length)
12
+ throw new errors_1.LockError("MultiLock 至少需要一把锁");
13
+ this.name = locks.map((l) => l.name).join(",");
14
+ }
15
+ async lock(leaseTimeMs) {
16
+ const ok = await this.tryLock(-1, leaseTimeMs);
17
+ if (!ok)
18
+ throw new errors_1.LockError(`获取联锁失败: ${this.name}`);
19
+ }
20
+ async tryLock(waitTimeMs, leaseTimeMs) {
21
+ const acquired = [];
22
+ try {
23
+ for (const lock of this.locks) {
24
+ const ok = await lock.tryLock(waitTimeMs, leaseTimeMs);
25
+ if (!ok) {
26
+ for (const a of acquired.reverse()) {
27
+ try {
28
+ await a.unlock();
29
+ }
30
+ catch {
31
+ // ignore
32
+ }
33
+ }
34
+ return false;
35
+ }
36
+ acquired.push(lock);
37
+ }
38
+ return true;
39
+ }
40
+ catch (e) {
41
+ for (const a of acquired.reverse()) {
42
+ try {
43
+ await a.unlock();
44
+ }
45
+ catch {
46
+ // ignore
47
+ }
48
+ }
49
+ throw e;
50
+ }
51
+ }
52
+ async unlock() {
53
+ for (const lock of [...this.locks].reverse()) {
54
+ await lock.unlock();
55
+ }
56
+ }
57
+ async forceUnlock() {
58
+ let any = false;
59
+ for (const lock of [...this.locks].reverse()) {
60
+ if (await lock.forceUnlock())
61
+ any = true;
62
+ }
63
+ return any;
64
+ }
65
+ async isLocked() {
66
+ for (const lock of this.locks) {
67
+ if (!(await lock.isLocked()))
68
+ return false;
69
+ }
70
+ return true;
71
+ }
72
+ async isHeldByCurrentThread() {
73
+ for (const lock of this.locks) {
74
+ if (!(await lock.isHeldByCurrentThread()))
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+ async getHoldCount() {
80
+ let min = Number.POSITIVE_INFINITY;
81
+ for (const lock of this.locks) {
82
+ min = Math.min(min, await lock.getHoldCount());
83
+ }
84
+ return Number.isFinite(min) ? min : 0;
85
+ }
86
+ async remainTimeToLive() {
87
+ let min = Number.POSITIVE_INFINITY;
88
+ for (const lock of this.locks) {
89
+ min = Math.min(min, await lock.remainTimeToLive());
90
+ }
91
+ return Number.isFinite(min) ? min : -2;
92
+ }
93
+ }
94
+ exports.RedissonMultiLock = RedissonMultiLock;
95
+ //# sourceMappingURL=RMultiLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RMultiLock.js","sourceRoot":"","sources":["../../src/redisson/RMultiLock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RedissonConfig, RLock, RReadWriteLock } from "./types";
2
+ export declare class RedissonReadWriteLock implements RReadWriteLock {
3
+ private readonly read;
4
+ private readonly write;
5
+ constructor(name: string, clientId: string, config?: Required<RedissonConfig>);
6
+ readLock(): RLock;
7
+ writeLock(): RLock;
8
+ }
9
+ //# sourceMappingURL=RReadWriteLock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RReadWriteLock.d.ts","sourceRoot":"","sources":["../../src/redisson/RReadWriteLock.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIrE,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAG5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,QAAQ,CAAC,cAAc,CAAyB;IAsD1D,QAAQ,IAAI,KAAK;IAIjB,SAAS,IAAI,KAAK;CAGnB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedissonReadWriteLock = void 0;
7
+ const Redis_1 = __importDefault(require("../Redis"));
8
+ const scripts_1 = require("./scripts");
9
+ const RLock_1 = require("./RLock");
10
+ const types_1 = require("./types");
11
+ const utils_1 = require("./utils");
12
+ class RedissonReadWriteLock {
13
+ constructor(name, clientId, config = types_1.defaultRedissonConfig) {
14
+ const storage = `${name}:rwlock`;
15
+ const key = () => Redis_1.default.key(storage);
16
+ const ch = () => (0, utils_1.channelName)(storage);
17
+ const field = (threadId) => `${clientId}:${threadId}`;
18
+ this.read = new RLock_1.RedissonLock(`${name}:read`, clientId, config, {
19
+ acquire: (threadId, leaseMs) => (0, utils_1.evalNumber)(scripts_1.READ_LOCK_ACQUIRE_LUA, [key()], [
20
+ leaseMs,
21
+ field(threadId),
22
+ ]),
23
+ unlock: async (threadId, leaseMs) => {
24
+ const result = await (0, utils_1.evalScript)(scripts_1.READ_LOCK_UNLOCK_LUA, [key(), ch()], ["0", field(threadId), leaseMs]);
25
+ if (result === null || result === undefined)
26
+ return null;
27
+ return Number(result);
28
+ },
29
+ }, storage);
30
+ this.write = new RLock_1.RedissonLock(`${name}:write`, clientId, config, {
31
+ acquire: (threadId, leaseMs) => (0, utils_1.evalNumber)(scripts_1.WRITE_LOCK_ACQUIRE_LUA, [key()], [
32
+ leaseMs,
33
+ field(threadId),
34
+ ]),
35
+ unlock: async (threadId, leaseMs) => {
36
+ const result = await (0, utils_1.evalScript)(scripts_1.WRITE_LOCK_UNLOCK_LUA, [key(), ch()], ["0", field(threadId), leaseMs]);
37
+ if (result === null || result === undefined)
38
+ return null;
39
+ return Number(result);
40
+ },
41
+ }, storage);
42
+ }
43
+ readLock() {
44
+ return this.read;
45
+ }
46
+ writeLock() {
47
+ return this.write;
48
+ }
49
+ }
50
+ exports.RedissonReadWriteLock = RedissonReadWriteLock;
51
+ //# sourceMappingURL=RReadWriteLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RReadWriteLock.js","sourceRoot":"","sources":["../../src/redisson/RReadWriteLock.ts"],"names":[],"mappings":";;;;;;AAAA,qDAA6B;AAC7B,uCAKmB;AACnB,mCAAuC;AAEvC,mCAAgD;AAChD,mCAA8D;AAE9D,MAAa,qBAAqB;IAIhC,YACE,IAAY,EACZ,QAAgB,EAChB,SAAmC,6BAAqB;QAExD,MAAM,OAAO,GAAG,GAAG,IAAI,SAAS,CAAC;QACjC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,eAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAE9D,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAY,CAC1B,GAAG,IAAI,OAAO,EACd,QAAQ,EACR,MAAM,EACN;YACE,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC7B,IAAA,kBAAU,EAAC,+BAAqB,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE;gBACzC,OAAO;gBACP,KAAK,CAAC,QAAQ,CAAC;aAChB,CAAC;YACJ,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAU,EAC7B,8BAAoB,EACpB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EACb,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAChC,CAAC;gBACF,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBACzD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;SACF,EACD,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG,IAAI,oBAAY,CAC3B,GAAG,IAAI,QAAQ,EACf,QAAQ,EACR,MAAM,EACN;YACE,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC7B,IAAA,kBAAU,EAAC,gCAAsB,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE;gBAC1C,OAAO;gBACP,KAAK,CAAC,QAAQ,CAAC;aAChB,CAAC;YACJ,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;gBAClC,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAU,EAC7B,+BAAqB,EACrB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EACb,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAChC,CAAC;gBACF,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC;gBACzD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;SACF,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AApED,sDAoEC"}
@@ -0,0 +1,13 @@
1
+ import type { RSemaphore } from "./types";
2
+ export declare class RedissonSemaphore implements RSemaphore {
3
+ readonly name: string;
4
+ constructor(name: string);
5
+ private key;
6
+ private channel;
7
+ trySetPermits(permits: number): Promise<boolean>;
8
+ availablePermits(): Promise<number>;
9
+ acquire(permits?: number): Promise<void>;
10
+ tryAcquire(permits?: number, waitTimeMs?: number): Promise<boolean>;
11
+ release(permits?: number): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=RSemaphore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RSemaphore.d.ts","sourceRoot":"","sources":["../../src/redisson/RSemaphore.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAS1C,qBAAa,iBAAkB,YAAW,UAAU;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;IAEjC,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;IAIT,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAKnC,OAAO,CAAC,OAAO,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnC,UAAU,CAAC,OAAO,SAAI,EAAE,UAAU,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBzD,OAAO,CAAC,OAAO,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAO1C"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedissonSemaphore = void 0;
7
+ const Redis_1 = __importDefault(require("../Redis"));
8
+ const scripts_1 = require("./scripts");
9
+ const utils_1 = require("./utils");
10
+ class RedissonSemaphore {
11
+ constructor(name) {
12
+ this.name = name;
13
+ }
14
+ key() {
15
+ return Redis_1.default.key(`semaphore:${this.name}`);
16
+ }
17
+ channel() {
18
+ return (0, utils_1.channelName)(`semaphore:${this.name}`);
19
+ }
20
+ async trySetPermits(permits) {
21
+ return Redis_1.default.setNX(`semaphore:${this.name}`, String(Math.max(0, permits)));
22
+ }
23
+ async availablePermits() {
24
+ const v = await Redis_1.default.get(`semaphore:${this.name}`);
25
+ return v == null ? 0 : Number(v);
26
+ }
27
+ async acquire(permits = 1) {
28
+ const ok = await this.tryAcquire(permits, -1);
29
+ if (!ok)
30
+ throw new Error(`获取信号量失败: ${this.name}`);
31
+ }
32
+ async tryAcquire(permits = 1, waitTimeMs = 0) {
33
+ const n = Math.max(1, permits);
34
+ const deadline = waitTimeMs < 0
35
+ ? Number.POSITIVE_INFINITY
36
+ : Date.now() + Math.max(0, waitTimeMs);
37
+ for (;;) {
38
+ // ARGV[1]=初始值(仅当 key 不存在时用,这里传 0 表示不自动初始化)
39
+ const ok = await (0, utils_1.evalNumber)(scripts_1.SEMAPHORE_TRY_ACQUIRE_LUA, [this.key()], [0, n]);
40
+ if (ok === 1)
41
+ return true;
42
+ if (Date.now() >= deadline)
43
+ return false;
44
+ const remain = Math.max(0, deadline - Date.now());
45
+ const notified = await (0, utils_1.waitNotify)(this.channel(), Math.min(remain, 2000));
46
+ if (!notified)
47
+ await (0, utils_1.sleep)(Math.min(50, remain));
48
+ }
49
+ }
50
+ async release(permits = 1) {
51
+ await (0, utils_1.evalScript)(scripts_1.SEMAPHORE_RELEASE_LUA, [this.key(), this.channel()], [Math.max(1, permits)]);
52
+ }
53
+ }
54
+ exports.RedissonSemaphore = RedissonSemaphore;
55
+ //# sourceMappingURL=RSemaphore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RSemaphore.js","sourceRoot":"","sources":["../../src/redisson/RSemaphore.ts"],"names":[],"mappings":";;;;;;AAAA,qDAA6B;AAC7B,uCAGmB;AAEnB,mCAMiB;AAEjB,MAAa,iBAAiB;IAC5B,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7B,GAAG;QACT,OAAO,eAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEO,OAAO;QACb,OAAO,IAAA,mBAAW,EAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,OAAO,eAAK,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,CAAC,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC;QACvB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,QAAQ,GACZ,UAAU,GAAG,CAAC;YACZ,CAAC,CAAC,MAAM,CAAC,iBAAiB;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAE3C,SAAS,CAAC;YACR,2CAA2C;YAC3C,MAAM,EAAE,GAAG,MAAM,IAAA,kBAAU,EACzB,mCAAyB,EACzB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACZ,CAAC,CAAC,EAAE,CAAC,CAAC,CACP,CAAC;YACF,IAAI,EAAE,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1B,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,MAAM,IAAA,kBAAU,EAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1E,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAA,aAAK,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC;QACvB,MAAM,IAAA,kBAAU,EACd,+BAAqB,EACrB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAC5B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CACvB,CAAC;IACJ,CAAC;CACF;AAtDD,8CAsDC"}
@@ -0,0 +1,45 @@
1
+ import type { RAtomicLong, RBitSet, RBucket, RCountDownLatch, RList, RLock, RMap, RQueue, RRateLimiter, RReadWriteLock, RScoredSortedSet, RSemaphore, RSet, RTopic, RedissonConfig } from "./types";
2
+ /**
3
+ * Redisson 风格门面(基于现有 Redis 连接)。
4
+ *
5
+ * @example
6
+ * const lock = Redisson.getLock('order:pay');
7
+ * await lock.lock();
8
+ * try { ... } finally { await lock.unlock(); }
9
+ */
10
+ declare class RedissonClient {
11
+ private readonly clientId;
12
+ private config;
13
+ constructor(config?: RedissonConfig);
14
+ /** 覆盖看门狗等配置 */
15
+ configure(config: RedissonConfig): void;
16
+ getClientId(): string;
17
+ getLock(name: string): RLock;
18
+ getFairLock(name: string): RLock;
19
+ getReadWriteLock(name: string): RReadWriteLock;
20
+ getMultiLock(...locks: RLock[]): RLock;
21
+ getSemaphore(name: string): RSemaphore;
22
+ getCountDownLatch(name: string): RCountDownLatch;
23
+ getAtomicLong(name: string): RAtomicLong;
24
+ getBucket<T = unknown>(name: string): RBucket<T>;
25
+ getMap<V = string>(name: string): RMap<V>;
26
+ getSet(name: string): RSet;
27
+ getList(name: string): RList;
28
+ getScoredSortedSet(name: string): RScoredSortedSet;
29
+ getTopic(name: string): RTopic;
30
+ getRateLimiter(name: string): RRateLimiter;
31
+ getBitSet(name: string): RBitSet;
32
+ getQueue(name: string): RQueue;
33
+ /**
34
+ * 持锁执行(看门狗);等价于 getLock + lock + unlock。
35
+ */
36
+ withLock<T>(name: string, fn: () => Promise<T> | T, leaseTimeMs?: number): Promise<T>;
37
+ }
38
+ /** 默认单例(进程级 clientId) */
39
+ export declare const Redisson: RedissonClient;
40
+ /** 创建独立客户端(不同 clientId,用于测试或多实例语义) */
41
+ export declare function createRedisson(config?: RedissonConfig): RedissonClient;
42
+ export type { RedissonClient };
43
+ /** 生成随机 token(测试辅助) */
44
+ export declare function randomLockToken(): string;
45
+ //# sourceMappingURL=Redisson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Redisson.d.ts","sourceRoot":"","sources":["../../src/redisson/Redisson.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,OAAO,EACP,eAAe,EACf,KAAK,EACL,KAAK,EACL,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,IAAI,EACJ,MAAM,EACN,cAAc,EACf,MAAM,SAAS,CAAC;AAIjB;;;;;;;GAOG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,MAAM,CAA2B;gBAE7B,MAAM,GAAE,cAAmB;IAKvC,eAAe;IACf,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAIvC,WAAW,IAAI,MAAM;IAMrB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAI5B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAIhC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAI9C,YAAY,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK;IAMtC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAItC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAMhD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIxC,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAIzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAI5B,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IAIlD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAI1C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACG,QAAQ,CAAC,CAAC,EACd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,CAAC;CASd;AAED,yBAAyB;AACzB,eAAO,MAAM,QAAQ,gBAAuB,CAAC;AAE7C,sCAAsC;AACtC,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,cAAc,CAEtE;AAED,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,uBAAuB;AACvB,wBAAgB,eAAe,IAAI,MAAM,CAExC"}