@memberjunction/livekit-room-server 6.2.0-edge.4 → 6.2.0-edge.5
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.
|
@@ -13,28 +13,51 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { BaseSingleton } from '@memberjunction/global';
|
|
15
15
|
import { type IMetadataProvider, type UserInfo } from '@memberjunction/core';
|
|
16
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Rate limiter with configurable attempt limits and lockout windows.
|
|
18
|
+
*
|
|
19
|
+
* Keys are caller-supplied (caller and dialed numbers), so the number of tracked keys is capped.
|
|
20
|
+
* Two things keep that cap from becoming a weakness under a flood of distinct keys:
|
|
21
|
+
* - **Constant cost per call.** Expired entries are swept at most once every
|
|
22
|
+
* {@link sweepThreshold} inserts, not on every failure, and enforcing the cap drops one entry.
|
|
23
|
+
* Before, each failure past 1,000 keys walked the whole map, so a flood cost O(n) per attempt.
|
|
24
|
+
* - **Lockouts are evicted last.** Locked-out keys live in their own map, and the cap drops the
|
|
25
|
+
* oldest key that is still only counting attempts. A locked-out caller can no longer flood
|
|
26
|
+
* distinct numbers to push their own lockout out of the map; a lockout is dropped only when
|
|
27
|
+
* every tracked key is locked out.
|
|
28
|
+
*/
|
|
17
29
|
export declare class DialInRateLimiter {
|
|
18
30
|
private readonly maxAttempts;
|
|
19
31
|
private readonly windowMs;
|
|
20
32
|
private readonly lockoutMs;
|
|
33
|
+
/** Keys still counting attempts, oldest first (Map keeps insertion order). */
|
|
21
34
|
private readonly attempts;
|
|
35
|
+
/** Keys locked out (or whose lockout ended inside their window), oldest lockout first. */
|
|
36
|
+
private readonly lockouts;
|
|
37
|
+
/** New keys inserted since the last sweep of expired entries. */
|
|
38
|
+
private insertsSinceSweep;
|
|
22
39
|
constructor(maxAttempts?: number, windowMs?: number, lockoutMs?: number);
|
|
23
40
|
CheckAllowed(key: string): {
|
|
24
41
|
allowed: boolean;
|
|
25
42
|
remainingMs?: number;
|
|
26
43
|
};
|
|
27
|
-
/** Above this many tracked keys,
|
|
44
|
+
/** Above this many tracked keys, expired entries are swept, at most once per this many new keys. */
|
|
28
45
|
private static readonly sweepThreshold;
|
|
29
|
-
/** Hard ceiling;
|
|
46
|
+
/** Hard ceiling on tracked keys; when a new key would pass it, one entry is dropped (see the class doc). */
|
|
30
47
|
private static readonly maxEntries;
|
|
31
|
-
/** Removes entries whose window and lockout have both elapsed. */
|
|
32
|
-
private sweepExpired;
|
|
33
48
|
/** Number of tracked keys (diagnostics/tests). */
|
|
34
49
|
get Size(): number;
|
|
35
50
|
RecordFailure(key: string): void;
|
|
36
51
|
RecordSuccess(key: string): void;
|
|
37
52
|
Clear(): void;
|
|
53
|
+
private entryFor;
|
|
54
|
+
private remove;
|
|
55
|
+
/** Locks the key out from `now`, moving it to the lockout map as its newest entry. */
|
|
56
|
+
private lock;
|
|
57
|
+
/** Called before a new key is inserted: sweeps on the amortized schedule, then enforces the cap. */
|
|
58
|
+
private makeRoomForNewKey;
|
|
59
|
+
/** Removes entries whose window and lockout have both elapsed. */
|
|
60
|
+
private sweepExpired;
|
|
38
61
|
}
|
|
39
62
|
/** Input parameters for verifying a dial-in code. */
|
|
40
63
|
export interface VerifyDialInCodeParams {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meeting-dial-in-service.d.ts","sourceRoot":"","sources":["../src/meeting-dial-in-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAAmB,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAUhG
|
|
1
|
+
{"version":3,"file":"meeting-dial-in-service.d.ts","sourceRoot":"","sources":["../src/meeting-dial-in-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAAmB,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAqB,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAUhG;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAS1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAV5B,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,iEAAiE;IACjE,OAAO,CAAC,iBAAiB,CAAK;gBAGX,WAAW,GAAE,MAAU,EACvB,QAAQ,GAAE,MAAuB,EACjC,SAAS,GAAE,MAAuB;IAG9C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAoB5E,oGAAoG;IACpG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAC9C,4GAA4G;IAC5G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAS;IAE3C,kDAAkD;IAClD,IAAW,IAAI,IAAI,MAAM,CAExB;IAEM,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAkBhC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIhC,KAAK,IAAI,IAAI;IAMpB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;IAKd,sFAAsF;IACtF,OAAO,CAAC,IAAI;IAOZ,oGAAoG;IACpG,OAAO,CAAC,iBAAiB;IAgBzB,kEAAkE;IAClE,OAAO,CAAC,YAAY;CAUrB;AAED,qDAAqD;AACrD,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa,CAAC,oBAAoB,CAAC;IAE3E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4D;IAE1F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6D;;IAM3F,WAAkB,QAAQ,IAAI,oBAAoB,CAEjD;IAED;;OAEG;IACI,kBAAkB,IAAI,MAAM;IAInC;;OAEG;IACU,wBAAwB,CACnC,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,CAAC,EAAE,iBAAiB,GAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAqB9B;;;OAGG;IACU,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA0E/F,kDAAkD;IAC3C,yBAAyB,IAAI,IAAI;CAIzC"}
|
|
@@ -14,16 +14,33 @@
|
|
|
14
14
|
import { randomInt } from 'node:crypto';
|
|
15
15
|
import { BaseSingleton, EscapeSQLString } from '@memberjunction/global';
|
|
16
16
|
import { LogError, RunView } from '@memberjunction/core';
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Rate limiter with configurable attempt limits and lockout windows.
|
|
19
|
+
*
|
|
20
|
+
* Keys are caller-supplied (caller and dialed numbers), so the number of tracked keys is capped.
|
|
21
|
+
* Two things keep that cap from becoming a weakness under a flood of distinct keys:
|
|
22
|
+
* - **Constant cost per call.** Expired entries are swept at most once every
|
|
23
|
+
* {@link sweepThreshold} inserts, not on every failure, and enforcing the cap drops one entry.
|
|
24
|
+
* Before, each failure past 1,000 keys walked the whole map, so a flood cost O(n) per attempt.
|
|
25
|
+
* - **Lockouts are evicted last.** Locked-out keys live in their own map, and the cap drops the
|
|
26
|
+
* oldest key that is still only counting attempts. A locked-out caller can no longer flood
|
|
27
|
+
* distinct numbers to push their own lockout out of the map; a lockout is dropped only when
|
|
28
|
+
* every tracked key is locked out.
|
|
29
|
+
*/
|
|
18
30
|
export class DialInRateLimiter {
|
|
19
31
|
constructor(maxAttempts = 5, windowMs = 15 * 60 * 1000, lockoutMs = 15 * 60 * 1000) {
|
|
20
32
|
this.maxAttempts = maxAttempts;
|
|
21
33
|
this.windowMs = windowMs;
|
|
22
34
|
this.lockoutMs = lockoutMs;
|
|
35
|
+
/** Keys still counting attempts, oldest first (Map keeps insertion order). */
|
|
23
36
|
this.attempts = new Map();
|
|
37
|
+
/** Keys locked out (or whose lockout ended inside their window), oldest lockout first. */
|
|
38
|
+
this.lockouts = new Map();
|
|
39
|
+
/** New keys inserted since the last sweep of expired entries. */
|
|
40
|
+
this.insertsSinceSweep = 0;
|
|
24
41
|
}
|
|
25
42
|
CheckAllowed(key) {
|
|
26
|
-
const entry = this.
|
|
43
|
+
const entry = this.entryFor(key);
|
|
27
44
|
if (!entry) {
|
|
28
45
|
return { allowed: true };
|
|
29
46
|
}
|
|
@@ -32,60 +49,88 @@ export class DialInRateLimiter {
|
|
|
32
49
|
return { allowed: false, remainingMs: entry.lockedUntil - now };
|
|
33
50
|
}
|
|
34
51
|
if (now - entry.firstAttemptAt > this.windowMs) {
|
|
35
|
-
this.
|
|
52
|
+
this.remove(key);
|
|
36
53
|
return { allowed: true };
|
|
37
54
|
}
|
|
38
55
|
if (entry.attempts >= this.maxAttempts) {
|
|
39
|
-
|
|
56
|
+
this.lock(key, entry, now);
|
|
40
57
|
return { allowed: false, remainingMs: this.lockoutMs };
|
|
41
58
|
}
|
|
42
59
|
return { allowed: true };
|
|
43
60
|
}
|
|
44
|
-
/** Above this many tracked keys,
|
|
61
|
+
/** Above this many tracked keys, expired entries are swept, at most once per this many new keys. */
|
|
45
62
|
static { this.sweepThreshold = 1000; }
|
|
46
|
-
/** Hard ceiling;
|
|
63
|
+
/** Hard ceiling on tracked keys; when a new key would pass it, one entry is dropped (see the class doc). */
|
|
47
64
|
static { this.maxEntries = 10000; }
|
|
48
|
-
/** Removes entries whose window and lockout have both elapsed. */
|
|
49
|
-
sweepExpired(now) {
|
|
50
|
-
for (const [key, entry] of this.attempts) {
|
|
51
|
-
const lockExpired = !entry.lockedUntil || entry.lockedUntil <= now;
|
|
52
|
-
if (lockExpired && now - entry.firstAttemptAt > this.windowMs) {
|
|
53
|
-
this.attempts.delete(key);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Map iterates in insertion order, so the first keys are the oldest. Leave room for the entry about to be inserted.
|
|
57
|
-
for (const key of this.attempts.keys()) {
|
|
58
|
-
if (this.attempts.size < DialInRateLimiter.maxEntries) {
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
this.attempts.delete(key);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
65
|
/** Number of tracked keys (diagnostics/tests). */
|
|
65
66
|
get Size() {
|
|
66
|
-
return this.attempts.size;
|
|
67
|
+
return this.attempts.size + this.lockouts.size;
|
|
67
68
|
}
|
|
68
69
|
RecordFailure(key) {
|
|
69
70
|
const now = Date.now();
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
const entry = this.entryFor(key);
|
|
72
|
+
if (entry?.lockedUntil && entry.lockedUntil > now) {
|
|
73
|
+
return; // already locked out: a further failure neither extends nor resets the lockout
|
|
72
74
|
}
|
|
73
|
-
const entry = this.attempts.get(key);
|
|
74
75
|
if (!entry || now - entry.firstAttemptAt > this.windowMs) {
|
|
76
|
+
this.remove(key);
|
|
77
|
+
this.makeRoomForNewKey(now);
|
|
75
78
|
this.attempts.set(key, { attempts: 1, firstAttemptAt: now });
|
|
79
|
+
return;
|
|
76
80
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
entry.lockedUntil = now + this.lockoutMs;
|
|
81
|
-
}
|
|
81
|
+
entry.attempts++;
|
|
82
|
+
if (entry.attempts >= this.maxAttempts) {
|
|
83
|
+
this.lock(key, entry, now);
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
RecordSuccess(key) {
|
|
85
|
-
this.
|
|
87
|
+
this.remove(key);
|
|
86
88
|
}
|
|
87
89
|
Clear() {
|
|
88
90
|
this.attempts.clear();
|
|
91
|
+
this.lockouts.clear();
|
|
92
|
+
this.insertsSinceSweep = 0;
|
|
93
|
+
}
|
|
94
|
+
entryFor(key) {
|
|
95
|
+
return this.attempts.get(key) ?? this.lockouts.get(key);
|
|
96
|
+
}
|
|
97
|
+
remove(key) {
|
|
98
|
+
this.attempts.delete(key);
|
|
99
|
+
this.lockouts.delete(key);
|
|
100
|
+
}
|
|
101
|
+
/** Locks the key out from `now`, moving it to the lockout map as its newest entry. */
|
|
102
|
+
lock(key, entry, now) {
|
|
103
|
+
entry.lockedUntil = now + this.lockoutMs;
|
|
104
|
+
this.attempts.delete(key);
|
|
105
|
+
this.lockouts.delete(key);
|
|
106
|
+
this.lockouts.set(key, entry);
|
|
107
|
+
}
|
|
108
|
+
/** Called before a new key is inserted: sweeps on the amortized schedule, then enforces the cap. */
|
|
109
|
+
makeRoomForNewKey(now) {
|
|
110
|
+
this.insertsSinceSweep++;
|
|
111
|
+
if (this.Size >= DialInRateLimiter.sweepThreshold && this.insertsSinceSweep >= DialInRateLimiter.sweepThreshold) {
|
|
112
|
+
this.sweepExpired(now);
|
|
113
|
+
this.insertsSinceSweep = 0;
|
|
114
|
+
}
|
|
115
|
+
while (this.Size >= DialInRateLimiter.maxEntries) {
|
|
116
|
+
const victims = this.attempts.size > 0 ? this.attempts : this.lockouts;
|
|
117
|
+
const oldest = victims.keys().next();
|
|
118
|
+
if (oldest.done) {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
victims.delete(oldest.value);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Removes entries whose window and lockout have both elapsed. */
|
|
125
|
+
sweepExpired(now) {
|
|
126
|
+
for (const map of [this.attempts, this.lockouts]) {
|
|
127
|
+
for (const [key, entry] of map) {
|
|
128
|
+
const lockExpired = !entry.lockedUntil || entry.lockedUntil <= now;
|
|
129
|
+
if (lockExpired && now - entry.firstAttemptAt > this.windowMs) {
|
|
130
|
+
map.delete(key);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
89
134
|
}
|
|
90
135
|
}
|
|
91
136
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meeting-dial-in-service.js","sourceRoot":"","sources":["../src/meeting-dial-in-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAyC,MAAM,sBAAsB,CAAC;AAUhG
|
|
1
|
+
{"version":3,"file":"meeting-dial-in-service.js","sourceRoot":"","sources":["../src/meeting-dial-in-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/livekit-room-server",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.2.0-edge.
|
|
4
|
+
"version": "6.2.0-edge.5",
|
|
5
5
|
"description": "MemberJunction: Server-side LiveKit room support — mints scoped client/bot access tokens (livekit-server-sdk) and provides the session-start coordinator that opens a realtime model session and bridges it into a LiveKit room via AIBridgeEngine. The MJ realtime-bridge ↔ LiveKit UI seam.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -11,20 +11,20 @@
|
|
|
11
11
|
"author": "MemberJunction.com",
|
|
12
12
|
"license": "BUSL-1.1",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
15
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
16
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
17
|
-
"@memberjunction/ai": "6.2.0-edge.
|
|
18
|
-
"@memberjunction/aiengine": "6.2.0-edge.
|
|
19
|
-
"@memberjunction/ai-bridge-base": "6.2.0-edge.
|
|
20
|
-
"@memberjunction/ai-bridge-server": "6.2.0-edge.
|
|
21
|
-
"@memberjunction/ai-bridge-livekit": "6.2.0-edge.
|
|
22
|
-
"@memberjunction/ai-bridge-livekit-native": "6.2.0-edge.
|
|
14
|
+
"@memberjunction/core": "6.2.0-edge.5",
|
|
15
|
+
"@memberjunction/global": "6.2.0-edge.5",
|
|
16
|
+
"@memberjunction/core-entities": "6.2.0-edge.5",
|
|
17
|
+
"@memberjunction/ai": "6.2.0-edge.5",
|
|
18
|
+
"@memberjunction/aiengine": "6.2.0-edge.5",
|
|
19
|
+
"@memberjunction/ai-bridge-base": "6.2.0-edge.5",
|
|
20
|
+
"@memberjunction/ai-bridge-server": "6.2.0-edge.5",
|
|
21
|
+
"@memberjunction/ai-bridge-livekit": "6.2.0-edge.5",
|
|
22
|
+
"@memberjunction/ai-bridge-livekit-native": "6.2.0-edge.5",
|
|
23
23
|
"livekit-server-sdk": "^2.9.7",
|
|
24
|
-
"@memberjunction/storage": "6.2.0-edge.
|
|
25
|
-
"@memberjunction/ai-prompts": "6.2.0-edge.
|
|
24
|
+
"@memberjunction/storage": "6.2.0-edge.5",
|
|
25
|
+
"@memberjunction/ai-prompts": "6.2.0-edge.5",
|
|
26
26
|
"mpg123-decoder": "^1.0.3",
|
|
27
|
-
"@memberjunction/network-utils": "6.2.0-edge.
|
|
27
|
+
"@memberjunction/network-utils": "6.2.0-edge.5"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/node": "24.10.11",
|