@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 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 } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAcA,SAAS,oBAAoB,CAC3B,KAAyB,EACzB,QAAgB,EAChB,KAAa;IAEb,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;IAC/D,MAAM,IAAI,GAAG,oBAAoB,CAC/B,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EACtD,IAAI,EACJ,wBAAwB,CACzB,CAAC;IACF,MAAM,YAAY,GAAG,oBAAoB,CACvC,GAAG,CAAC,0BAA0B,EAC9B,EAAE,GAAG,EAAE,GAAG,IAAI,EACd,4BAA4B,CAC7B,CAAC;IACF,MAAM,cAAc,GAAG,oBAAoB,CACzC,GAAG,CAAC,4BAA4B,EAChC,EAAE,EACF,8BAA8B,CAC/B,CAAC;IACF,MAAM,UAAU,GACd,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE;QACzC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5E,MAAM,qBAAqB,GACzB,GAAG,CAAC,oCAAoC,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,YAAY,GAAG,GAAG,CAAC,0BAA0B,EAAE,IAAI,EAAE,CAAC;IAC5D,MAAM,cAAc,GAAG,GAAG,CAAC,4BAA4B,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,aAAa,GAAG,GAAG,CAAC,2BAA2B,EAAE,IAAI,EAAE,CAAC;IAE9D,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,YAAY;QACZ,cAAc;QACd,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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
- return JSON.parse(raw);
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 = JSON.parse(payload);
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 = JSON.parse(payload);
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 = JSON.parse(payload);
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 = JSON.parse(payload);
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 = JSON.parse(payload);
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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"}
@@ -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;
@@ -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
- recentWakeSentAt = new Map();
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
- if (appId) {
106
- this.recentWakeSentAt.delete(this.wakeKey(sessionId, appId));
107
- return;
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.recentWakeSentAt.get(wakeKey);
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.recentWakeSentAt.set(wakeKey, now);
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({ noServer: true });
766
- const appWss = new WebSocketServer({ noServer: true });
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.");