@privateclaw/privateclaw-relay 0.1.6 → 0.1.7
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/.env.example +3 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/relay-cluster.js +102 -6
- package/dist/relay-cluster.js.map +1 -1
- package/dist/relay-server.d.ts +15 -0
- package/dist/relay-server.js +139 -15
- package/dist/relay-server.js.map +1 -1
- package/dist/web/chat/index.html +2 -2
- package/dist/web/scripts/chat.js +166 -4
- package/dist/web/scripts/i18n.js +15 -0
- package/dist/web/scripts/session-client.js +65 -0
- package/dist/web/styles.css +180 -0
- package/package.json +1 -1
package/.env.example
CHANGED
|
@@ -2,6 +2,9 @@ PRIVATECLAW_RELAY_HOST=127.0.0.1
|
|
|
2
2
|
PRIVATECLAW_RELAY_PORT=8787
|
|
3
3
|
PRIVATECLAW_SESSION_TTL_MS=900000
|
|
4
4
|
PRIVATECLAW_FRAME_CACHE_SIZE=25
|
|
5
|
+
# PRIVATECLAW_MAX_MESSAGE_BYTES=25165824
|
|
6
|
+
# PRIVATECLAW_APP_MESSAGES_PER_MINUTE=120
|
|
7
|
+
# PRIVATECLAW_PROVIDER_MESSAGES_PER_MINUTE=600
|
|
5
8
|
# Optional: enable background wake through Firebase Cloud Messaging.
|
|
6
9
|
# Use either the full service-account JSON...
|
|
7
10
|
# PRIVATECLAW_FCM_SERVICE_ACCOUNT_JSON={"type":"service_account","project_id":"your-project","client_email":"...","private_key":"-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"}
|
package/dist/config.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ export interface RelayServerConfig {
|
|
|
3
3
|
port: number;
|
|
4
4
|
sessionTtlMs: number;
|
|
5
5
|
frameCacheSize: number;
|
|
6
|
+
maxMessageBytes?: number;
|
|
7
|
+
appMessagesPerMinute?: number;
|
|
8
|
+
providerMessagesPerMinute?: number;
|
|
6
9
|
webRootDir?: string;
|
|
7
10
|
instanceId?: string;
|
|
8
11
|
redisUrl?: string;
|
package/dist/config.js
CHANGED
|
@@ -13,6 +13,9 @@ export function loadRelayConfig(env = process.env) {
|
|
|
13
13
|
const port = parsePositiveInteger(env.PRIVATECLAW_RELAY_PORT?.trim() || env.PORT?.trim(), 8787, "PRIVATECLAW_RELAY_PORT");
|
|
14
14
|
const sessionTtlMs = parsePositiveInteger(env.PRIVATECLAW_SESSION_TTL_MS, 15 * 60 * 1000, "PRIVATECLAW_SESSION_TTL_MS");
|
|
15
15
|
const frameCacheSize = parsePositiveInteger(env.PRIVATECLAW_FRAME_CACHE_SIZE, 25, "PRIVATECLAW_FRAME_CACHE_SIZE");
|
|
16
|
+
const maxMessageBytes = parsePositiveInteger(env.PRIVATECLAW_MAX_MESSAGE_BYTES, 24 * 1024 * 1024, "PRIVATECLAW_MAX_MESSAGE_BYTES");
|
|
17
|
+
const appMessagesPerMinute = parsePositiveInteger(env.PRIVATECLAW_APP_MESSAGES_PER_MINUTE, 120, "PRIVATECLAW_APP_MESSAGES_PER_MINUTE");
|
|
18
|
+
const providerMessagesPerMinute = parsePositiveInteger(env.PRIVATECLAW_PROVIDER_MESSAGES_PER_MINUTE, 600, "PRIVATECLAW_PROVIDER_MESSAGES_PER_MINUTE");
|
|
16
19
|
const instanceId = env.PRIVATECLAW_RELAY_INSTANCE_ID?.trim() ||
|
|
17
20
|
env.RAILWAY_REPLICA_ID?.trim();
|
|
18
21
|
const redisUrl = env.PRIVATECLAW_REDIS_URL?.trim() || env.REDIS_URL?.trim();
|
|
@@ -25,6 +28,9 @@ export function loadRelayConfig(env = process.env) {
|
|
|
25
28
|
port,
|
|
26
29
|
sessionTtlMs,
|
|
27
30
|
frameCacheSize,
|
|
31
|
+
maxMessageBytes,
|
|
32
|
+
appMessagesPerMinute,
|
|
33
|
+
providerMessagesPerMinute,
|
|
28
34
|
...(instanceId ? { instanceId } : {}),
|
|
29
35
|
...(redisUrl ? { redisUrl } : {}),
|
|
30
36
|
...(fcmServiceAccountJson ? { fcmServiceAccountJson } : {}),
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/relay-cluster.js
CHANGED
|
@@ -29,8 +29,104 @@ function occupantKey(sessionId) {
|
|
|
29
29
|
function occupantValue(nodeId, appId) {
|
|
30
30
|
return JSON.stringify({ nodeId, appId });
|
|
31
31
|
}
|
|
32
|
+
function isObject(value) {
|
|
33
|
+
return typeof value === "object" && value !== null;
|
|
34
|
+
}
|
|
35
|
+
function isEncryptedEnvelope(value) {
|
|
36
|
+
if (!isObject(value)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return (value.version === 1 &&
|
|
40
|
+
typeof value.messageId === "string" &&
|
|
41
|
+
typeof value.iv === "string" &&
|
|
42
|
+
typeof value.ciphertext === "string" &&
|
|
43
|
+
typeof value.tag === "string" &&
|
|
44
|
+
typeof value.sentAt === "string");
|
|
45
|
+
}
|
|
46
|
+
function parseJsonObject(raw, label) {
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = JSON.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new Error(`${label} must be valid JSON.`);
|
|
53
|
+
}
|
|
54
|
+
if (!isObject(parsed)) {
|
|
55
|
+
throw new Error(`${label} must be a JSON object.`);
|
|
56
|
+
}
|
|
57
|
+
return parsed;
|
|
58
|
+
}
|
|
59
|
+
function parseRequiredString(value, field, label) {
|
|
60
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
61
|
+
throw new Error(`${label} is missing a valid ${field}.`);
|
|
62
|
+
}
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
32
65
|
function parseOccupant(raw) {
|
|
33
|
-
|
|
66
|
+
const parsed = parseJsonObject(raw, "Relay cluster occupant payload");
|
|
67
|
+
return {
|
|
68
|
+
nodeId: parseRequiredString(parsed.nodeId, "nodeId", "Relay cluster occupant payload"),
|
|
69
|
+
appId: parseRequiredString(parsed.appId, "appId", "Relay cluster occupant payload"),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function parseFrameMessage(raw, label) {
|
|
73
|
+
const parsed = parseJsonObject(raw, label);
|
|
74
|
+
if (!isEncryptedEnvelope(parsed.envelope)) {
|
|
75
|
+
throw new Error(`${label} is missing a valid encrypted envelope.`);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
originNodeId: parseRequiredString(parsed.originNodeId, "originNodeId", label),
|
|
79
|
+
sessionId: parseRequiredString(parsed.sessionId, "sessionId", label),
|
|
80
|
+
envelope: parsed.envelope,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function parseProviderReconnectMessage(raw) {
|
|
84
|
+
const label = "Relay provider reconnect payload";
|
|
85
|
+
const parsed = parseJsonObject(raw, label);
|
|
86
|
+
const kind = parseRequiredString(parsed.kind, "kind", label);
|
|
87
|
+
if (kind !== "provider_reconnected") {
|
|
88
|
+
throw new Error(`${label} has unsupported kind ${kind}.`);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
kind,
|
|
92
|
+
originNodeId: parseRequiredString(parsed.originNodeId, "originNodeId", label),
|
|
93
|
+
targetNodeId: parseRequiredString(parsed.targetNodeId, "targetNodeId", label),
|
|
94
|
+
providerId: parseRequiredString(parsed.providerId, "providerId", label),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function parseSessionControlMessage(raw) {
|
|
98
|
+
const label = "Relay session control payload";
|
|
99
|
+
const parsed = parseJsonObject(raw, label);
|
|
100
|
+
const kind = parseRequiredString(parsed.kind, "kind", label);
|
|
101
|
+
const originNodeId = parseRequiredString(parsed.originNodeId, "originNodeId", label);
|
|
102
|
+
const sessionId = parseRequiredString(parsed.sessionId, "sessionId", label);
|
|
103
|
+
if (kind === "session_closed") {
|
|
104
|
+
return {
|
|
105
|
+
kind,
|
|
106
|
+
originNodeId,
|
|
107
|
+
sessionId,
|
|
108
|
+
reason: parseRequiredString(parsed.reason, "reason", label),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
if (kind === "app_closed") {
|
|
112
|
+
return {
|
|
113
|
+
kind,
|
|
114
|
+
originNodeId,
|
|
115
|
+
sessionId,
|
|
116
|
+
appId: parseRequiredString(parsed.appId, "appId", label),
|
|
117
|
+
reason: parseRequiredString(parsed.reason, "reason", label),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (kind === "app_reconnected") {
|
|
121
|
+
return {
|
|
122
|
+
kind,
|
|
123
|
+
originNodeId,
|
|
124
|
+
sessionId,
|
|
125
|
+
appId: parseRequiredString(parsed.appId, "appId", label),
|
|
126
|
+
targetNodeId: parseRequiredString(parsed.targetNodeId, "targetNodeId", label),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
throw new Error(`${label} has unsupported kind ${kind}.`);
|
|
34
130
|
}
|
|
35
131
|
async function compareAndDelete(redis, key, expectedValue) {
|
|
36
132
|
await redis.eval(`
|
|
@@ -131,7 +227,7 @@ class BaseRelayClusterClient {
|
|
|
131
227
|
if (!providerMatch) {
|
|
132
228
|
return;
|
|
133
229
|
}
|
|
134
|
-
const message =
|
|
230
|
+
const message = parseProviderReconnectMessage(payload);
|
|
135
231
|
if (message.originNodeId === this.nodeId ||
|
|
136
232
|
message.targetNodeId !== this.nodeId) {
|
|
137
233
|
return;
|
|
@@ -141,7 +237,7 @@ class BaseRelayClusterClient {
|
|
|
141
237
|
}
|
|
142
238
|
const broadcastMatch = channel.match(/^privateclaw:bus:v1:session:([^:]+):app:broadcast$/);
|
|
143
239
|
if (broadcastMatch) {
|
|
144
|
-
const message =
|
|
240
|
+
const message = parseFrameMessage(payload, "Relay app broadcast payload");
|
|
145
241
|
if (message.originNodeId === this.nodeId) {
|
|
146
242
|
return;
|
|
147
243
|
}
|
|
@@ -150,7 +246,7 @@ class BaseRelayClusterClient {
|
|
|
150
246
|
}
|
|
151
247
|
const targetedAppMatch = channel.match(/^privateclaw:bus:v1:session:([^:]+):app:([^:]+)$/);
|
|
152
248
|
if (targetedAppMatch) {
|
|
153
|
-
const message =
|
|
249
|
+
const message = parseFrameMessage(payload, "Relay targeted app payload");
|
|
154
250
|
if (message.originNodeId === this.nodeId) {
|
|
155
251
|
return;
|
|
156
252
|
}
|
|
@@ -159,7 +255,7 @@ class BaseRelayClusterClient {
|
|
|
159
255
|
}
|
|
160
256
|
const providerFrameMatch = channel.match(/^privateclaw:bus:v1:session:([^:]+):provider$/);
|
|
161
257
|
if (providerFrameMatch) {
|
|
162
|
-
const message =
|
|
258
|
+
const message = parseFrameMessage(payload, "Relay provider frame payload");
|
|
163
259
|
if (message.originNodeId === this.nodeId) {
|
|
164
260
|
return;
|
|
165
261
|
}
|
|
@@ -170,7 +266,7 @@ class BaseRelayClusterClient {
|
|
|
170
266
|
if (!controlMatch) {
|
|
171
267
|
return;
|
|
172
268
|
}
|
|
173
|
-
const message =
|
|
269
|
+
const message = parseSessionControlMessage(payload);
|
|
174
270
|
if (message.originNodeId === this.nodeId) {
|
|
175
271
|
return;
|
|
176
272
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-cluster.js","sourceRoot":"","sources":["../src/relay-cluster.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relay-cluster.js","sourceRoot":"","sources":["../src/relay-cluster.ts"],"names":[],"mappings":"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"}
|
package/dist/relay-server.d.ts
CHANGED
|
@@ -4,6 +4,21 @@ import { type RelayPushRegistrationStore } from "./push-registration-store.js";
|
|
|
4
4
|
import { type RelayPushNotifier } from "./push-notifier.js";
|
|
5
5
|
import { type RelayClusterCallbacks, type RelayClusterClient } from "./relay-cluster.js";
|
|
6
6
|
import { type RelaySessionStore } from "./session-store.js";
|
|
7
|
+
export declare class WakeCooldownTracker {
|
|
8
|
+
private readonly params;
|
|
9
|
+
private readonly entries;
|
|
10
|
+
constructor(params: {
|
|
11
|
+
cooldownMs: number;
|
|
12
|
+
now?: () => number;
|
|
13
|
+
pruneAfterMs?: number;
|
|
14
|
+
});
|
|
15
|
+
private now;
|
|
16
|
+
private prune;
|
|
17
|
+
getLastSentAt(key: string): number | undefined;
|
|
18
|
+
recordSent(key: string): void;
|
|
19
|
+
clearSession(sessionId: string, appId?: string): void;
|
|
20
|
+
entryCount(): number;
|
|
21
|
+
}
|
|
7
22
|
export interface RelayServerInstance {
|
|
8
23
|
readonly port: number;
|
|
9
24
|
readonly url: string;
|
package/dist/relay-server.js
CHANGED
|
@@ -9,6 +9,11 @@ import { createRelaySessionStore, } from "./session-store.js";
|
|
|
9
9
|
import { serveRelayWebRequest } from "./relay-web.js";
|
|
10
10
|
const HEARTBEAT_INTERVAL_MS = 15_000;
|
|
11
11
|
const PUSH_WAKE_COOLDOWN_MS = 5_000;
|
|
12
|
+
const DEFAULT_PROTOCOL_MESSAGE_BYTES = 24 * 1024 * 1024;
|
|
13
|
+
const DEFAULT_APP_MESSAGES_PER_MINUTE = 120;
|
|
14
|
+
const DEFAULT_PROVIDER_MESSAGES_PER_MINUTE = 600;
|
|
15
|
+
const MESSAGE_SIZE_SLACK_BYTES = 1 * 1024 * 1024;
|
|
16
|
+
const APP_MESSAGE_RATE_LIMIT_WINDOW_MS = 60_000;
|
|
12
17
|
class RelayProtocolError extends Error {
|
|
13
18
|
code;
|
|
14
19
|
constructor(code, message) {
|
|
@@ -44,6 +49,93 @@ function parseJson(raw) {
|
|
|
44
49
|
throw new RelayProtocolError("invalid_json", "Relay messages must be valid JSON.");
|
|
45
50
|
}
|
|
46
51
|
}
|
|
52
|
+
function assertMessageSizeWithinLimit(raw, maxBytes, actorLabel) {
|
|
53
|
+
const rawBytes = Buffer.byteLength(raw, "utf8");
|
|
54
|
+
if (rawBytes <= maxBytes) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
throw new RelayProtocolError("message_too_large", `${actorLabel} message exceeds the ${maxBytes}-byte relay limit.`);
|
|
58
|
+
}
|
|
59
|
+
class FixedWindowRateLimiter {
|
|
60
|
+
params;
|
|
61
|
+
entries = new Map();
|
|
62
|
+
constructor(params) {
|
|
63
|
+
this.params = params;
|
|
64
|
+
}
|
|
65
|
+
now() {
|
|
66
|
+
return this.params.now?.() ?? Date.now();
|
|
67
|
+
}
|
|
68
|
+
allow(key) {
|
|
69
|
+
const now = this.now();
|
|
70
|
+
const existing = this.entries.get(key);
|
|
71
|
+
if (!existing || now - existing.windowStartedAt >= this.params.windowMs) {
|
|
72
|
+
this.entries.set(key, { count: 1, windowStartedAt: now });
|
|
73
|
+
this.prune(now);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
if (existing.count >= this.params.maxPerWindow) {
|
|
77
|
+
this.prune(now);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
existing.count += 1;
|
|
81
|
+
this.prune(now);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
prune(now) {
|
|
85
|
+
if (this.entries.size < 512) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
for (const [key, entry] of this.entries.entries()) {
|
|
89
|
+
if (now - entry.windowStartedAt >= this.params.windowMs * 2) {
|
|
90
|
+
this.entries.delete(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class WakeCooldownTracker {
|
|
96
|
+
params;
|
|
97
|
+
entries = new Map();
|
|
98
|
+
constructor(params) {
|
|
99
|
+
this.params = params;
|
|
100
|
+
}
|
|
101
|
+
now() {
|
|
102
|
+
return this.params.now?.() ?? Date.now();
|
|
103
|
+
}
|
|
104
|
+
prune(now) {
|
|
105
|
+
const pruneAfterMs = this.params.pruneAfterMs ?? this.params.cooldownMs;
|
|
106
|
+
for (const [key, sentAt] of this.entries.entries()) {
|
|
107
|
+
if (now - sentAt >= pruneAfterMs) {
|
|
108
|
+
this.entries.delete(key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
getLastSentAt(key) {
|
|
113
|
+
const now = this.now();
|
|
114
|
+
this.prune(now);
|
|
115
|
+
return this.entries.get(key);
|
|
116
|
+
}
|
|
117
|
+
recordSent(key) {
|
|
118
|
+
const now = this.now();
|
|
119
|
+
this.entries.set(key, now);
|
|
120
|
+
this.prune(now);
|
|
121
|
+
}
|
|
122
|
+
clearSession(sessionId, appId) {
|
|
123
|
+
if (appId) {
|
|
124
|
+
this.entries.delete(`${sessionId}:${appId}`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const prefix = `${sessionId}:`;
|
|
128
|
+
for (const key of this.entries.keys()) {
|
|
129
|
+
if (key.startsWith(prefix)) {
|
|
130
|
+
this.entries.delete(key);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
entryCount() {
|
|
135
|
+
this.prune(this.now());
|
|
136
|
+
return this.entries.size;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
47
139
|
function toRelayProtocolError(error) {
|
|
48
140
|
if (error instanceof RelayProtocolError) {
|
|
49
141
|
return error;
|
|
@@ -87,10 +179,14 @@ class SessionHub {
|
|
|
87
179
|
sessionProviders = new Map();
|
|
88
180
|
sessionApps = new Map();
|
|
89
181
|
appSessions = new Map();
|
|
90
|
-
|
|
182
|
+
wakeCooldownTracker;
|
|
91
183
|
cluster;
|
|
92
184
|
constructor(params) {
|
|
93
185
|
this.params = params;
|
|
186
|
+
this.wakeCooldownTracker = new WakeCooldownTracker({
|
|
187
|
+
cooldownMs: PUSH_WAKE_COOLDOWN_MS,
|
|
188
|
+
...(params.now ? { now: params.now } : {}),
|
|
189
|
+
});
|
|
94
190
|
}
|
|
95
191
|
setCluster(cluster) {
|
|
96
192
|
this.cluster = cluster;
|
|
@@ -102,16 +198,10 @@ class SessionHub {
|
|
|
102
198
|
return `${sessionId}:${appId}`;
|
|
103
199
|
}
|
|
104
200
|
clearWakeState(sessionId, appId) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const prefix = `${sessionId}:`;
|
|
110
|
-
for (const key of this.recentWakeSentAt.keys()) {
|
|
111
|
-
if (key.startsWith(prefix)) {
|
|
112
|
-
this.recentWakeSentAt.delete(key);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
201
|
+
this.wakeCooldownTracker.clearSession(sessionId, appId);
|
|
202
|
+
}
|
|
203
|
+
getProviderRateLimitKey(providerSocket) {
|
|
204
|
+
return this.requireProviderId(providerSocket);
|
|
115
205
|
}
|
|
116
206
|
get usesPersistentSessions() {
|
|
117
207
|
return this.params.sessionStore.persistent;
|
|
@@ -331,13 +421,13 @@ class SessionHub {
|
|
|
331
421
|
for (const registration of matchingRegistrations) {
|
|
332
422
|
const wakeKey = this.wakeKey(registration.sessionId, registration.appId);
|
|
333
423
|
const now = this.now();
|
|
334
|
-
const lastWakeSentAt = this.
|
|
424
|
+
const lastWakeSentAt = this.wakeCooldownTracker.getLastSentAt(wakeKey);
|
|
335
425
|
if (lastWakeSentAt !== undefined &&
|
|
336
426
|
now - lastWakeSentAt < PUSH_WAKE_COOLDOWN_MS) {
|
|
337
427
|
console.info(`[privateclaw-relay] wake skipped: cooldown session=${registration.sessionId} appId=${registration.appId} sinceMs=${now - lastWakeSentAt}`);
|
|
338
428
|
continue;
|
|
339
429
|
}
|
|
340
|
-
this.
|
|
430
|
+
this.wakeCooldownTracker.recordSent(wakeKey);
|
|
341
431
|
try {
|
|
342
432
|
const result = await this.params.pushNotifier.sendWake(registration);
|
|
343
433
|
console.info(`[privateclaw-relay] wake sent session=${registration.sessionId} appId=${registration.appId} unregisterToken=${result.unregisterToken}`);
|
|
@@ -655,6 +745,10 @@ class SessionHub {
|
|
|
655
745
|
}
|
|
656
746
|
}
|
|
657
747
|
export function createRelayServer(config, deps = {}) {
|
|
748
|
+
const maxMessageBytes = config.maxMessageBytes ?? DEFAULT_PROTOCOL_MESSAGE_BYTES;
|
|
749
|
+
const appMessagesPerMinute = config.appMessagesPerMinute ?? DEFAULT_APP_MESSAGES_PER_MINUTE;
|
|
750
|
+
const providerMessagesPerMinute = config.providerMessagesPerMinute ?? DEFAULT_PROVIDER_MESSAGES_PER_MINUTE;
|
|
751
|
+
const websocketMaxPayloadBytes = maxMessageBytes + MESSAGE_SIZE_SLACK_BYTES;
|
|
658
752
|
const ownsFrameCache = !deps.frameCache;
|
|
659
753
|
const frameCache = deps.frameCache ??
|
|
660
754
|
createEncryptedFrameCache({
|
|
@@ -687,6 +781,16 @@ export function createRelayServer(config, deps = {}) {
|
|
|
687
781
|
pushNotifier,
|
|
688
782
|
...(deps.now ? { now: deps.now } : {}),
|
|
689
783
|
});
|
|
784
|
+
const appMessageRateLimiter = new FixedWindowRateLimiter({
|
|
785
|
+
maxPerWindow: appMessagesPerMinute,
|
|
786
|
+
windowMs: APP_MESSAGE_RATE_LIMIT_WINDOW_MS,
|
|
787
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
788
|
+
});
|
|
789
|
+
const providerMessageRateLimiter = new FixedWindowRateLimiter({
|
|
790
|
+
maxPerWindow: providerMessagesPerMinute,
|
|
791
|
+
windowMs: APP_MESSAGE_RATE_LIMIT_WINDOW_MS,
|
|
792
|
+
...(deps.now ? { now: deps.now } : {}),
|
|
793
|
+
});
|
|
690
794
|
const clusterCallbacks = {
|
|
691
795
|
onRemoteAppFrame: async (sessionId, envelope, targetAppId) => {
|
|
692
796
|
sessionHub.deliverLocalToApp(sessionId, envelope, targetAppId);
|
|
@@ -762,8 +866,14 @@ export function createRelayServer(config, deps = {}) {
|
|
|
762
866
|
const server = createServer((request, response) => {
|
|
763
867
|
void handleHttpRequest(request, response);
|
|
764
868
|
});
|
|
765
|
-
const providerWss = new WebSocketServer({
|
|
766
|
-
|
|
869
|
+
const providerWss = new WebSocketServer({
|
|
870
|
+
noServer: true,
|
|
871
|
+
maxPayload: websocketMaxPayloadBytes,
|
|
872
|
+
});
|
|
873
|
+
const appWss = new WebSocketServer({
|
|
874
|
+
noServer: true,
|
|
875
|
+
maxPayload: websocketMaxPayloadBytes,
|
|
876
|
+
});
|
|
767
877
|
const expiryTimer = setInterval(() => {
|
|
768
878
|
void sessionHub.purgeExpiredSessions().catch((error) => {
|
|
769
879
|
console.error("[privateclaw-relay] failed to purge expired sessions", error);
|
|
@@ -789,10 +899,20 @@ export function createRelayServer(config, deps = {}) {
|
|
|
789
899
|
async function handleProviderMessage(socket, raw) {
|
|
790
900
|
let requestId;
|
|
791
901
|
try {
|
|
902
|
+
assertMessageSizeWithinLimit(raw, maxMessageBytes, "Provider");
|
|
792
903
|
const message = parseJson(raw);
|
|
793
904
|
if (!isObject(message) || typeof message.type !== "string") {
|
|
794
905
|
throw new RelayProtocolError("invalid_message", "Provider message is missing a type field.");
|
|
795
906
|
}
|
|
907
|
+
if ("requestId" in message &&
|
|
908
|
+
typeof message.requestId === "string" &&
|
|
909
|
+
message.requestId !== "") {
|
|
910
|
+
requestId = message.requestId;
|
|
911
|
+
}
|
|
912
|
+
const providerRateLimitKey = sessionHub.getProviderRateLimitKey(socket);
|
|
913
|
+
if (!providerMessageRateLimiter.allow(providerRateLimitKey)) {
|
|
914
|
+
throw new RelayProtocolError("rate_limit_exceeded", "Too many provider messages. Slow down and retry.");
|
|
915
|
+
}
|
|
796
916
|
switch (message.type) {
|
|
797
917
|
case "provider:create_session": {
|
|
798
918
|
const requestIdValue = message.requestId;
|
|
@@ -897,6 +1017,10 @@ export function createRelayServer(config, deps = {}) {
|
|
|
897
1017
|
}
|
|
898
1018
|
async function handleAppMessage(socket, sessionId, appId, raw) {
|
|
899
1019
|
try {
|
|
1020
|
+
assertMessageSizeWithinLimit(raw, maxMessageBytes, "App");
|
|
1021
|
+
if (!appMessageRateLimiter.allow(`${sessionId}:${appId}`)) {
|
|
1022
|
+
throw new RelayProtocolError("rate_limit_exceeded", "Too many app messages. Slow down and retry.");
|
|
1023
|
+
}
|
|
900
1024
|
const message = parseJson(raw);
|
|
901
1025
|
if (!isObject(message) || typeof message.type !== "string") {
|
|
902
1026
|
throw new RelayProtocolError("invalid_message", "App message is missing a type field.");
|