namirasoft-node-redis 1.4.10 → 1.4.11

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.
@@ -33,6 +33,8 @@ class RedisScopeDelay extends RedisScope_1.RedisScope {
33
33
  console.log({ LastRun });
34
34
  if (!LastRun)
35
35
  return;
36
+ LastRun = new Date(LastRun);
37
+ console.log({ LastRun });
36
38
  let difference = new Date().getTime() - LastRun.getTime();
37
39
  let delay_required = Math.max(delay_requested - difference, 0);
38
40
  console.log({ difference, delay_required });
@@ -1 +1 @@
1
- {"version":3,"file":"RedisScopeDelay.js","sourceRoot":"","sources":["../src/RedisScopeDelay.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkE;AAElE,6CAA0C;AAU1C,MAAsB,eAA4B,SAAQ,uBAAgB;IAGtE,YAAY,QAAuB,EAAE,MAAkC;QAEnE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEK,IAAI,CAAC,aAAyB,EAAE,SAAmC;;YAErE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;YACvD,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU;gBACnE,OAAO;YAEX,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAGlC,IAAI,eAAe,GAAG,mCAAiB,CAAC,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YACpG,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAA;YACrC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;YAEhF,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAE1C,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;YACxB,IAAI,CAAC,OAAO;gBACR,OAAO;YAEX,IAAI,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;YAE/D,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;YAC3C,IAAI,cAAc,GAAG,CAAC;gBAClB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1E,CAAC;KAAA;IACK,OAAO,CAAC,aAAyB,EAAE,SAAmC;;YAExE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;YAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU;gBACnE,OAAO;YAEX,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5C,CAAC;KAAA;CACJ;AAhDD,0CAgDC;AAAA,CAAC"}
1
+ {"version":3,"file":"RedisScopeDelay.js","sourceRoot":"","sources":["../src/RedisScopeDelay.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAkE;AAElE,6CAA0C;AAU1C,MAAsB,eAA4B,SAAQ,uBAAgB;IAGtE,YAAY,QAAuB,EAAE,MAAkC;QAEnE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEK,IAAI,CAAC,aAAyB,EAAE,SAAmC;;YAErE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;YACvD,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU;gBACnE,OAAO;YAEX,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAGlC,IAAI,eAAe,GAAG,mCAAiB,CAAC,cAAc,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YACpG,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAA;YACrC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;YAEhF,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;YACxB,IAAI,CAAC,OAAO;gBACR,OAAO;YACX,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;YAExB,IAAI,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;YAE/D,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAA;YAC3C,IAAI,cAAc,GAAG,CAAC;gBAClB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1E,CAAC;KAAA;IACK,OAAO,CAAC,aAAyB,EAAE,SAAmC;;YAExE,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;YAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU;gBACnE,OAAO;YAEX,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAClC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5C,CAAC;KAAA;CACJ;AAjDD,0CAiDC;AAAA,CAAC"}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "framework": "npm",
9
9
  "application": "package",
10
10
  "private": false,
11
- "version": "1.4.10",
11
+ "version": "1.4.11",
12
12
  "author": "Amir Abolhasani",
13
13
  "license": "MIT",
14
14
  "main": "./dist/index.js",
@@ -1,18 +1,18 @@
1
- import * as Redis from "ioredis";
2
- import { Logger } from "namirasoft-log";
3
-
4
- export abstract class RedisInstance
5
- {
6
- public client!: Redis.Redis;
7
- constructor(host: string, port: number, password: string, db: number = 0)
8
- {
9
- if (!process.env.NAMIRASOFT_MUTE)
10
- this.client = new Redis.Redis({ host, port, password, db });
11
- Logger.main?.success(`Redis was connected to: ${host}:${port}`);
12
- this.disconnect = this.disconnect.bind(this);
13
- }
14
- disconnect()
15
- {
16
- this.client?.disconnect();
17
- }
1
+ import * as Redis from "ioredis";
2
+ import { Logger } from "namirasoft-log";
3
+
4
+ export abstract class RedisInstance
5
+ {
6
+ public client!: Redis.Redis;
7
+ constructor(host: string, port: number, password: string, db: number = 0)
8
+ {
9
+ if (!process.env.NAMIRASOFT_MUTE)
10
+ this.client = new Redis.Redis({ host, port, password, db });
11
+ Logger.main?.success(`Redis was connected to: ${host}:${port}`);
12
+ this.disconnect = this.disconnect.bind(this);
13
+ }
14
+ disconnect()
15
+ {
16
+ this.client?.disconnect();
17
+ }
18
18
  };
package/src/RedisScope.ts CHANGED
@@ -1,53 +1,53 @@
1
- import { EncodingOperation } from "namirasoft-core";
2
- import { RedisInstance } from "./RedisInstance";
3
-
4
- export abstract class RedisScope<V>
5
- {
6
- protected instance: RedisInstance;
7
- constructor(instance: RedisInstance)
8
- {
9
- this.instance = instance;
10
- this._get = this._get.bind(this);
11
- this._set = this._set.bind(this);
12
- this._del = this._del.bind(this);
13
- }
14
- protected async _get(key: string, base64: boolean): Promise<V | null>
15
- {
16
- if (process.env.NAMIRASOFT_MUTE)
17
- return null;
18
- let data = await this.instance.client.get(key);
19
- if (data)
20
- {
21
- if (base64)
22
- data = EncodingOperation.Base64Decode(data);
23
- return JSON.parse(data) as V;
24
- }
25
- return null;
26
- }
27
- protected async _set(key: string, value: V, base64: boolean, ttl_seconds?: number, NotExists: boolean = false)
28
- {
29
- if (process.env.NAMIRASOFT_MUTE)
30
- return null;
31
- let data = JSON.stringify(value);
32
- if (base64)
33
- data = EncodingOperation.Base64Encode(data);
34
- if (NotExists)
35
- {
36
- if (ttl_seconds)
37
- return await this.instance.client.set(key, data, "EX", ttl_seconds, "NX");
38
- return await this.instance.client.set(key, data, "NX");
39
- }
40
- else
41
- {
42
- if (ttl_seconds)
43
- return await this.instance.client.set(key, data, "EX", ttl_seconds);
44
- return await this.instance.client.set(key, data);
45
- }
46
- }
47
- protected async _del(key: string)
48
- {
49
- if (process.env.NAMIRASOFT_MUTE)
50
- return;
51
- await this.instance.client.del(key);
52
- }
1
+ import { EncodingOperation } from "namirasoft-core";
2
+ import { RedisInstance } from "./RedisInstance";
3
+
4
+ export abstract class RedisScope<V>
5
+ {
6
+ protected instance: RedisInstance;
7
+ constructor(instance: RedisInstance)
8
+ {
9
+ this.instance = instance;
10
+ this._get = this._get.bind(this);
11
+ this._set = this._set.bind(this);
12
+ this._del = this._del.bind(this);
13
+ }
14
+ protected async _get(key: string, base64: boolean): Promise<V | null>
15
+ {
16
+ if (process.env.NAMIRASOFT_MUTE)
17
+ return null;
18
+ let data = await this.instance.client.get(key);
19
+ if (data)
20
+ {
21
+ if (base64)
22
+ data = EncodingOperation.Base64Decode(data);
23
+ return JSON.parse(data) as V;
24
+ }
25
+ return null;
26
+ }
27
+ protected async _set(key: string, value: V, base64: boolean, ttl_seconds?: number, NotExists: boolean = false)
28
+ {
29
+ if (process.env.NAMIRASOFT_MUTE)
30
+ return null;
31
+ let data = JSON.stringify(value);
32
+ if (base64)
33
+ data = EncodingOperation.Base64Encode(data);
34
+ if (NotExists)
35
+ {
36
+ if (ttl_seconds)
37
+ return await this.instance.client.set(key, data, "EX", ttl_seconds, "NX");
38
+ return await this.instance.client.set(key, data, "NX");
39
+ }
40
+ else
41
+ {
42
+ if (ttl_seconds)
43
+ return await this.instance.client.set(key, data, "EX", ttl_seconds);
44
+ return await this.instance.client.set(key, data);
45
+ }
46
+ }
47
+ protected async _del(key: string)
48
+ {
49
+ if (process.env.NAMIRASOFT_MUTE)
50
+ return;
51
+ await this.instance.client.del(key);
52
+ }
53
53
  };
@@ -1,61 +1,62 @@
1
- import { DurationUnit, TimeUnitOperation } from "namirasoft-core";
2
- import { RedisInstance } from "./RedisInstance";
3
- import { RedisScope } from "./RedisScope";
4
- import { RedisScopeLock } from "./RedisScopeLock";
5
-
6
- export type RedisScopeDelayParameter = {
7
- id: string;
8
- delay: boolean;
9
- delay_value: number | null;
10
- delay_unit: DurationUnit | null;
11
- };
12
-
13
- export abstract class RedisScopeDelay<Parameters> extends RedisScope<Date>
14
- {
15
- private locker: RedisScopeLock<Parameters>;
16
- constructor(instance: RedisInstance, locker: RedisScopeLock<Parameters>)
17
- {
18
- super(instance);
19
- this.locker = locker;
20
- this.key = this.key.bind(this);
21
- this.wait = this.wait.bind(this);
22
- this.release = this.release.bind(this);
23
- }
24
- protected abstract key(key_parameter: Parameters): string;
25
- async wait(key_parameter: Parameters, parameter: RedisScopeDelayParameter): Promise<void>
26
- {
27
- console.log({ name: "wait", key_parameter, parameter })
28
- if (!parameter.delay || !parameter.delay_value || !parameter.delay_unit)
29
- return;
30
-
31
- let key = this.key(key_parameter);
32
-
33
-
34
- let delay_requested = TimeUnitOperation.toMilliseconds(parameter.delay_value, parameter.delay_unit);
35
- console.log({ key, delay_requested })
36
- await this.locker.waitForLock(key_parameter, Math.ceil(delay_requested / 1000));
37
-
38
- let LastRun = await this._get(key, false);
39
-
40
- console.log({ LastRun })
41
- if (!LastRun)
42
- return;
43
-
44
- let difference = new Date().getTime() - LastRun.getTime();
45
- let delay_required = Math.max(delay_requested - difference, 0);
46
-
47
- console.log({ difference, delay_required })
48
- if (delay_required > 0)
49
- await new Promise(resolve => setTimeout(resolve, delay_required));
50
- }
51
- async release(key_parameter: Parameters, parameter: RedisScopeDelayParameter)
52
- {
53
- console.log({ name: "release", key_parameter, parameter })
54
- if (!parameter.delay || !parameter.delay_value || !parameter.delay_unit)
55
- return;
56
-
57
- let key = this.key(key_parameter);
58
- await this._set(key, new Date(), false);
59
- await this.locker.unlock(key_parameter);
60
- }
1
+ import { DurationUnit, TimeUnitOperation } from "namirasoft-core";
2
+ import { RedisInstance } from "./RedisInstance";
3
+ import { RedisScope } from "./RedisScope";
4
+ import { RedisScopeLock } from "./RedisScopeLock";
5
+
6
+ export type RedisScopeDelayParameter = {
7
+ id: string;
8
+ delay: boolean;
9
+ delay_value: number | null;
10
+ delay_unit: DurationUnit | null;
11
+ };
12
+
13
+ export abstract class RedisScopeDelay<Parameters> extends RedisScope<Date>
14
+ {
15
+ private locker: RedisScopeLock<Parameters>;
16
+ constructor(instance: RedisInstance, locker: RedisScopeLock<Parameters>)
17
+ {
18
+ super(instance);
19
+ this.locker = locker;
20
+ this.key = this.key.bind(this);
21
+ this.wait = this.wait.bind(this);
22
+ this.release = this.release.bind(this);
23
+ }
24
+ protected abstract key(key_parameter: Parameters): string;
25
+ async wait(key_parameter: Parameters, parameter: RedisScopeDelayParameter): Promise<void>
26
+ {
27
+ console.log({ name: "wait", key_parameter, parameter })
28
+ if (!parameter.delay || !parameter.delay_value || !parameter.delay_unit)
29
+ return;
30
+
31
+ let key = this.key(key_parameter);
32
+
33
+
34
+ let delay_requested = TimeUnitOperation.toMilliseconds(parameter.delay_value, parameter.delay_unit);
35
+ console.log({ key, delay_requested })
36
+ await this.locker.waitForLock(key_parameter, Math.ceil(delay_requested / 1000));
37
+
38
+ let LastRun = await this._get(key, false);
39
+ console.log({ LastRun })
40
+ if (!LastRun)
41
+ return;
42
+ LastRun = new Date(LastRun);
43
+ console.log({ LastRun })
44
+
45
+ let difference = new Date().getTime() - LastRun.getTime();
46
+ let delay_required = Math.max(delay_requested - difference, 0);
47
+
48
+ console.log({ difference, delay_required })
49
+ if (delay_required > 0)
50
+ await new Promise(resolve => setTimeout(resolve, delay_required));
51
+ }
52
+ async release(key_parameter: Parameters, parameter: RedisScopeDelayParameter)
53
+ {
54
+ console.log({ name: "release", key_parameter, parameter })
55
+ if (!parameter.delay || !parameter.delay_value || !parameter.delay_unit)
56
+ return;
57
+
58
+ let key = this.key(key_parameter);
59
+ await this._set(key, new Date(), false);
60
+ await this.locker.unlock(key_parameter);
61
+ }
61
62
  };
@@ -1,63 +1,63 @@
1
- import { DurationUnit, TimeOperation, TimeUnitOperation } from "namirasoft-core";
2
- import { RedisInstance } from "./RedisInstance";
3
- import { RedisScope } from "./RedisScope";
4
-
5
- export type RedisScopeLimitParameter = {
6
- id: string;
7
- name: string;
8
- limit: boolean;
9
- limit_count: number | null;
10
- limit_per_value: number | null;
11
- limit_per_unit: DurationUnit | null;
12
- };
13
-
14
- export abstract class RedisScopeLimit<Parameters> extends RedisScope<number>
15
- {
16
- constructor(instance: RedisInstance)
17
- {
18
- super(instance);
19
- this.key = this.key.bind(this);
20
- this.getCount = this.getCount.bind(this);
21
- this.add = this.add.bind(this);
22
- this.del = this.del.bind(this);
23
- }
24
- protected abstract key(key_parameter: Parameters): string;
25
- async getCount(key_parameter: Parameters, limit_per_value: number, limit_per_unit: DurationUnit): Promise<number>
26
- {
27
- let key = this.key(key_parameter);
28
-
29
- let milliseconds = TimeUnitOperation.toMilliseconds(limit_per_value, limit_per_unit);
30
- let date_finish = new Date();
31
- let date_start = TimeOperation.millisecondsAgo(milliseconds, date_finish);
32
-
33
- return await this.instance.client.zcount(key, date_start.getTime(), date_finish.getTime());
34
- }
35
- async add(key_parameter: Parameters, limit_per_value: number, limit_per_unit: DurationUnit)
36
- {
37
- let key = this.key(key_parameter);
38
-
39
- let milliseconds = TimeUnitOperation.toMilliseconds(limit_per_value, limit_per_unit);
40
- let date_finish = new Date();
41
- let date_start = TimeOperation.millisecondsAgo(milliseconds, date_finish)
42
-
43
- await this.instance.client.zadd(key, date_finish.getTime(), date_finish.getTime());
44
- await this.instance.client.zremrangebyscore(key, 0, date_start.getTime());
45
- }
46
- async del(key_parameter: Parameters)
47
- {
48
- let key = this.key(key_parameter);
49
- await this._del(key);
50
- }
51
- async check(key_parameter: Parameters, parameter: RedisScopeLimitParameter)
52
- {
53
- if (parameter.limit)
54
- if (parameter.limit_count && parameter.limit_per_value && parameter.limit_per_unit)
55
- {
56
- let count = await this.getCount(key_parameter, parameter.limit_per_value, parameter.limit_per_unit);
57
- if (count < parameter.limit_count)
58
- await this.add(key_parameter, parameter.limit_per_value, parameter.limit_per_unit);
59
- else
60
- throw new Error(`Limit has reached for '${parameter.name}' '${parameter.id}' for ${parameter.limit_count} messages every ${parameter.limit_per_value} ${parameter.limit_per_unit}`);
61
- }
62
- }
1
+ import { DurationUnit, TimeOperation, TimeUnitOperation } from "namirasoft-core";
2
+ import { RedisInstance } from "./RedisInstance";
3
+ import { RedisScope } from "./RedisScope";
4
+
5
+ export type RedisScopeLimitParameter = {
6
+ id: string;
7
+ name: string;
8
+ limit: boolean;
9
+ limit_count: number | null;
10
+ limit_per_value: number | null;
11
+ limit_per_unit: DurationUnit | null;
12
+ };
13
+
14
+ export abstract class RedisScopeLimit<Parameters> extends RedisScope<number>
15
+ {
16
+ constructor(instance: RedisInstance)
17
+ {
18
+ super(instance);
19
+ this.key = this.key.bind(this);
20
+ this.getCount = this.getCount.bind(this);
21
+ this.add = this.add.bind(this);
22
+ this.del = this.del.bind(this);
23
+ }
24
+ protected abstract key(key_parameter: Parameters): string;
25
+ async getCount(key_parameter: Parameters, limit_per_value: number, limit_per_unit: DurationUnit): Promise<number>
26
+ {
27
+ let key = this.key(key_parameter);
28
+
29
+ let milliseconds = TimeUnitOperation.toMilliseconds(limit_per_value, limit_per_unit);
30
+ let date_finish = new Date();
31
+ let date_start = TimeOperation.millisecondsAgo(milliseconds, date_finish);
32
+
33
+ return await this.instance.client.zcount(key, date_start.getTime(), date_finish.getTime());
34
+ }
35
+ async add(key_parameter: Parameters, limit_per_value: number, limit_per_unit: DurationUnit)
36
+ {
37
+ let key = this.key(key_parameter);
38
+
39
+ let milliseconds = TimeUnitOperation.toMilliseconds(limit_per_value, limit_per_unit);
40
+ let date_finish = new Date();
41
+ let date_start = TimeOperation.millisecondsAgo(milliseconds, date_finish)
42
+
43
+ await this.instance.client.zadd(key, date_finish.getTime(), date_finish.getTime());
44
+ await this.instance.client.zremrangebyscore(key, 0, date_start.getTime());
45
+ }
46
+ async del(key_parameter: Parameters)
47
+ {
48
+ let key = this.key(key_parameter);
49
+ await this._del(key);
50
+ }
51
+ async check(key_parameter: Parameters, parameter: RedisScopeLimitParameter)
52
+ {
53
+ if (parameter.limit)
54
+ if (parameter.limit_count && parameter.limit_per_value && parameter.limit_per_unit)
55
+ {
56
+ let count = await this.getCount(key_parameter, parameter.limit_per_value, parameter.limit_per_unit);
57
+ if (count < parameter.limit_count)
58
+ await this.add(key_parameter, parameter.limit_per_value, parameter.limit_per_unit);
59
+ else
60
+ throw new Error(`Limit has reached for '${parameter.name}' '${parameter.id}' for ${parameter.limit_count} messages every ${parameter.limit_per_value} ${parameter.limit_per_unit}`);
61
+ }
62
+ }
63
63
  };
@@ -1,35 +1,35 @@
1
- import { RedisInstance } from "./RedisInstance";
2
- import { RedisScope } from "./RedisScope";
3
-
4
- export abstract class RedisScopeLock<Parameters> extends RedisScope<number>
5
- {
6
- constructor(instance: RedisInstance, private ttl_seconds: number)
7
- {
8
- super(instance);
9
- this.lock = this.lock.bind(this);
10
- this.waitForLock = this.waitForLock.bind(this);
11
- this.unlock = this.unlock.bind(this);
12
- }
13
- protected abstract key(key_parameter: Parameters): string;
14
- async lock(key_parameter: Parameters, ttl_seconds?: number): Promise<boolean>
15
- {
16
- let ans = await this._set(this.key(key_parameter), Math.random(), true, ttl_seconds ?? this.ttl_seconds);
17
- if (ans)
18
- return true;
19
- return false;
20
- }
21
- async waitForLock(key_parameter: Parameters, ttl_seconds?: number): Promise<void>
22
- {
23
- while (true)
24
- {
25
- let ans = await this.lock(key_parameter, ttl_seconds);
26
- if (ans)
27
- break;
28
- await new Promise(res => setTimeout(res, 10));
29
- }
30
- }
31
- async unlock(key_parameter: Parameters)
32
- {
33
- await this._del(this.key(key_parameter));
34
- }
1
+ import { RedisInstance } from "./RedisInstance";
2
+ import { RedisScope } from "./RedisScope";
3
+
4
+ export abstract class RedisScopeLock<Parameters> extends RedisScope<number>
5
+ {
6
+ constructor(instance: RedisInstance, private ttl_seconds: number)
7
+ {
8
+ super(instance);
9
+ this.lock = this.lock.bind(this);
10
+ this.waitForLock = this.waitForLock.bind(this);
11
+ this.unlock = this.unlock.bind(this);
12
+ }
13
+ protected abstract key(key_parameter: Parameters): string;
14
+ async lock(key_parameter: Parameters, ttl_seconds?: number): Promise<boolean>
15
+ {
16
+ let ans = await this._set(this.key(key_parameter), Math.random(), true, ttl_seconds ?? this.ttl_seconds);
17
+ if (ans)
18
+ return true;
19
+ return false;
20
+ }
21
+ async waitForLock(key_parameter: Parameters, ttl_seconds?: number): Promise<void>
22
+ {
23
+ while (true)
24
+ {
25
+ let ans = await this.lock(key_parameter, ttl_seconds);
26
+ if (ans)
27
+ break;
28
+ await new Promise(res => setTimeout(res, 10));
29
+ }
30
+ }
31
+ async unlock(key_parameter: Parameters)
32
+ {
33
+ await this._del(this.key(key_parameter));
34
+ }
35
35
  };
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from "./RedisInstance";
2
- export * from "./RedisScope";
3
- export * from "./RedisScopeDelay";
4
- export * from "./RedisScopeLimit";
1
+ export * from "./RedisInstance";
2
+ export * from "./RedisScope";
3
+ export * from "./RedisScopeDelay";
4
+ export * from "./RedisScopeLimit";
5
5
  export * from "./RedisScopeLock";