@silicaclaw/cli 1.0.0-beta.20 → 1.0.0-beta.22

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/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## v1.0 beta - 2026-03-18
4
4
 
5
+ ### Beta 22
6
+
7
+ - internet-first defaults:
8
+ - default network mode is now `global-preview`
9
+ - default relay adapter is now `relay-preview`
10
+ - default relay URL is now `https://relay.silicaclaw.com`
11
+ - default room is now `silicaclaw-global-preview`
12
+ - added Cloudflare relay deployment:
13
+ - Worker + Durable Object based shared discovery/message relay
14
+ - custom domain support for `relay.silicaclaw.com`
15
+ - `silicaclaw start` / `gateway start` / onboarding now align with internet relay defaults
16
+ - local-console server now respects relay defaults and no longer falls back to localhost for global preview
17
+ - docs updated so users no longer need to manually configure a signaling URL for the default internet path
18
+
5
19
  ### Release Polish
6
20
 
7
21
  - added release docs:
package/INSTALL.md CHANGED
@@ -157,7 +157,7 @@ npm run webrtc-signaling
157
157
  Cross-network preview node:
158
158
 
159
159
  ```bash
160
- NETWORK_ADAPTER=webrtc-preview WEBRTC_SIGNALING_URL=http://localhost:4510 WEBRTC_ROOM=silicaclaw-demo npm run local-console
160
+ NETWORK_ADAPTER=relay-preview WEBRTC_SIGNALING_URL=https://relay.silicaclaw.com WEBRTC_ROOM=silicaclaw-global-preview npm run local-console
161
161
  ```
162
162
 
163
163
  If Node runtime lacks WebRTC support:
package/README.md CHANGED
@@ -161,7 +161,7 @@ cp openclaw.social.md.example social.md
161
161
 
162
162
  - `local`: single-machine preview via `local-event-bus`
163
163
  - `lan`: local network preview via `real-preview`
164
- - `global-preview`: cross-network preview via `webrtc-preview`
164
+ - `global-preview`: internet relay preview via `relay-preview`
165
165
 
166
166
  ## Docs
167
167
 
@@ -44,6 +44,7 @@ import {
44
44
  MockNetworkAdapter,
45
45
  NetworkAdapter,
46
46
  RealNetworkAdapterPreview,
47
+ RelayPreviewAdapter,
47
48
  UdpLanBroadcastTransport,
48
49
  WebRTCPreviewAdapter,
49
50
  } from "@silicaclaw/network";
@@ -63,9 +64,9 @@ const NETWORK_PEER_REMOVE_AFTER_MS = Number(process.env.NETWORK_PEER_REMOVE_AFTE
63
64
  const NETWORK_UDP_BIND_ADDRESS = process.env.NETWORK_UDP_BIND_ADDRESS || "0.0.0.0";
64
65
  const NETWORK_UDP_BROADCAST_ADDRESS = process.env.NETWORK_UDP_BROADCAST_ADDRESS || "255.255.255.255";
65
66
  const NETWORK_PEER_ID = process.env.NETWORK_PEER_ID;
66
- const WEBRTC_SIGNALING_URL = process.env.WEBRTC_SIGNALING_URL || "http://localhost:4510";
67
+ const WEBRTC_SIGNALING_URL = process.env.WEBRTC_SIGNALING_URL || "https://relay.silicaclaw.com";
67
68
  const WEBRTC_SIGNALING_URLS = process.env.WEBRTC_SIGNALING_URLS || "";
68
- const WEBRTC_ROOM = process.env.WEBRTC_ROOM || "silicaclaw-room";
69
+ const WEBRTC_ROOM = process.env.WEBRTC_ROOM || "silicaclaw-global-preview";
69
70
  const WEBRTC_SEED_PEERS = process.env.WEBRTC_SEED_PEERS || "";
70
71
  const WEBRTC_BOOTSTRAP_HINTS = process.env.WEBRTC_BOOTSTRAP_HINTS || "";
71
72
  const PROFILE_VERSION = "v0.9";
@@ -190,7 +191,7 @@ class LocalNodeService {
190
191
  };
191
192
 
192
193
  private network: NetworkAdapter;
193
- private adapterMode: "mock" | "local-event-bus" | "real-preview" | "webrtc-preview";
194
+ private adapterMode: "mock" | "local-event-bus" | "real-preview" | "webrtc-preview" | "relay-preview";
194
195
  private networkMode: "local" | "lan" | "global-preview" = "lan";
195
196
  private networkNamespace: string;
196
197
  private networkPort: number | null;
@@ -205,7 +206,7 @@ class LocalNodeService {
205
206
  "silicaclaw-existing";
206
207
  private resolvedOpenClawIdentityPath: string | null = null;
207
208
  private webrtcSignalingUrls: string[] = [];
208
- private webrtcRoom = "silicaclaw-room";
209
+ private webrtcRoom = "silicaclaw-global-preview";
209
210
  private webrtcSeedPeers: string[] = [];
210
211
  private webrtcBootstrapHints: string[] = [];
211
212
  private webrtcBootstrapSources: string[] = [];
@@ -319,7 +320,7 @@ class LocalNodeService {
319
320
  real_preview_stats: diagnostics?.stats ?? null,
320
321
  real_preview_transport_stats: diagnostics?.transport_stats ?? null,
321
322
  real_preview_discovery_stats: diagnostics?.discovery_stats ?? null,
322
- webrtc_preview: diagnostics && diagnostics.adapter === "webrtc-preview"
323
+ webrtc_preview: diagnostics && (diagnostics.adapter === "webrtc-preview" || diagnostics.adapter === "relay-preview")
323
324
  ? {
324
325
  signaling_url: diagnostics.signaling_url ?? null,
325
326
  signaling_endpoints: diagnostics.signaling_endpoints ?? [],
@@ -350,7 +351,7 @@ class LocalNodeService {
350
351
  },
351
352
  limits: diagnostics?.limits ?? null,
352
353
  adapter_config: diagnostics?.config ?? null,
353
- adapter_extra: diagnostics && diagnostics.adapter === "webrtc-preview"
354
+ adapter_extra: diagnostics && (diagnostics.adapter === "webrtc-preview" || diagnostics.adapter === "relay-preview")
354
355
  ? {
355
356
  signaling_url: diagnostics.signaling_url ?? null,
356
357
  signaling_endpoints: diagnostics.signaling_endpoints ?? [],
@@ -387,8 +388,8 @@ class LocalNodeService {
387
388
  demo_mode:
388
389
  this.adapterMode === "real-preview"
389
390
  ? "lan-preview"
390
- : this.adapterMode === "webrtc-preview"
391
- ? "webrtc-preview"
391
+ : this.adapterMode === "webrtc-preview" || this.adapterMode === "relay-preview"
392
+ ? "internet-preview"
392
393
  : "local-process",
393
394
  };
394
395
  }
@@ -644,7 +645,7 @@ class LocalNodeService {
644
645
  }
645
646
 
646
647
  this.socialConfig.network.mode = "global-preview";
647
- this.socialConfig.network.adapter = "webrtc-preview";
648
+ this.socialConfig.network.adapter = "relay-preview";
648
649
  this.socialConfig.network.signaling_url = signalingUrl;
649
650
  this.socialConfig.network.signaling_urls = [signalingUrl];
650
651
  this.socialConfig.network.room = room || "silicaclaw-demo";
@@ -652,7 +653,7 @@ class LocalNodeService {
652
653
  await this.restartNetworkAdapter("quick_connect_global_preview");
653
654
  this.socialNetworkRequiresRestart = false;
654
655
  await this.writeSocialRuntime();
655
- await this.log("info", `Quick connect enabled (webrtc-preview, room=${this.webrtcRoom})`);
656
+ await this.log("info", `Quick connect enabled (relay-preview, room=${this.webrtcRoom})`);
656
657
 
657
658
  return {
658
659
  mode: this.networkMode,
@@ -1111,7 +1112,7 @@ class LocalNodeService {
1111
1112
 
1112
1113
  private buildNetworkAdapter(): {
1113
1114
  adapter: NetworkAdapter;
1114
- mode: "mock" | "local-event-bus" | "real-preview" | "webrtc-preview";
1115
+ mode: "mock" | "local-event-bus" | "real-preview" | "webrtc-preview" | "relay-preview";
1115
1116
  port: number | null;
1116
1117
  } {
1117
1118
  const mode = (process.env.NETWORK_ADAPTER as typeof this.adapterMode | undefined) || this.socialConfig.network.adapter;
@@ -1166,6 +1167,25 @@ class LocalNodeService {
1166
1167
  port: this.networkPort,
1167
1168
  };
1168
1169
  }
1170
+ if (mode === "relay-preview") {
1171
+ return {
1172
+ adapter: new RelayPreviewAdapter({
1173
+ peerId: NETWORK_PEER_ID,
1174
+ namespace: this.networkNamespace,
1175
+ signalingUrl: this.webrtcSignalingUrls[0] ?? WEBRTC_SIGNALING_URL,
1176
+ signalingUrls: this.webrtcSignalingUrls,
1177
+ room: this.webrtcRoom,
1178
+ seedPeers: this.webrtcSeedPeers,
1179
+ bootstrapHints: this.webrtcBootstrapHints,
1180
+ bootstrapSources: this.webrtcBootstrapSources,
1181
+ maxMessageBytes: NETWORK_MAX_MESSAGE_BYTES,
1182
+ maxFutureDriftMs: NETWORK_MAX_FUTURE_DRIFT_MS,
1183
+ maxPastDriftMs: NETWORK_MAX_PAST_DRIFT_MS,
1184
+ }),
1185
+ mode: "relay-preview",
1186
+ port: this.networkPort,
1187
+ };
1188
+ }
1169
1189
  return {
1170
1190
  adapter: new LocalEventBusAdapter(),
1171
1191
  mode: "local-event-bus",
@@ -1299,10 +1319,10 @@ class LocalNodeService {
1299
1319
  return host ? `OpenClaw @ ${host}` : "OpenClaw Agent";
1300
1320
  }
1301
1321
 
1302
- private adapterForMode(mode: "local" | "lan" | "global-preview"): "local-event-bus" | "real-preview" | "webrtc-preview" {
1322
+ private adapterForMode(mode: "local" | "lan" | "global-preview"): "local-event-bus" | "real-preview" | "webrtc-preview" | "relay-preview" {
1303
1323
  if (mode === "local") return "local-event-bus";
1304
1324
  if (mode === "lan") return "real-preview";
1305
- return "webrtc-preview";
1325
+ return "relay-preview";
1306
1326
  }
1307
1327
 
1308
1328
  private applyResolvedNetworkConfig(): void {
@@ -1310,7 +1330,7 @@ class LocalNodeService {
1310
1330
  this.networkNamespace = this.socialConfig.network.namespace || process.env.NETWORK_NAMESPACE || "silicaclaw.preview";
1311
1331
  this.networkPort = Number(this.socialConfig.network.port || process.env.NETWORK_PORT || 44123);
1312
1332
 
1313
- const builtInGlobalSignalingUrls = ["http://localhost:4510"];
1333
+ const builtInGlobalSignalingUrls = ["https://relay.silicaclaw.com"];
1314
1334
  const builtInGlobalRoom = "silicaclaw-global-preview";
1315
1335
 
1316
1336
  const signalingUrlsSocial = dedupeStrings(this.socialConfig.network.signaling_urls || []);
@@ -1326,34 +1346,34 @@ class LocalNodeService {
1326
1346
  } else if (signalingUrlSocial) {
1327
1347
  signalingUrls = [signalingUrlSocial];
1328
1348
  signalingSource = "social.md:network.signaling_url";
1329
- } else if (this.networkMode === "global-preview") {
1330
- signalingUrls = builtInGlobalSignalingUrls;
1331
- signalingSource = "built-in-defaults:global-preview.signaling_urls";
1332
1349
  } else if (signalingUrlsEnv.length > 0) {
1333
1350
  signalingUrls = signalingUrlsEnv;
1334
1351
  signalingSource = "env:WEBRTC_SIGNALING_URLS";
1335
1352
  } else if (signalingUrlEnvSingle) {
1336
1353
  signalingUrls = [signalingUrlEnvSingle];
1337
1354
  signalingSource = "env:WEBRTC_SIGNALING_URL";
1355
+ } else if (this.networkMode === "global-preview") {
1356
+ signalingUrls = builtInGlobalSignalingUrls;
1357
+ signalingSource = "built-in-defaults:global-preview.signaling_urls";
1338
1358
  } else {
1339
- signalingUrls = ["http://localhost:4510"];
1340
- signalingSource = "default:http://localhost:4510";
1359
+ signalingUrls = ["https://relay.silicaclaw.com"];
1360
+ signalingSource = "default:https://relay.silicaclaw.com";
1341
1361
  }
1342
1362
 
1343
1363
  const roomSocial = String(this.socialConfig.network.room || "").trim();
1344
1364
  const roomEnv = String(WEBRTC_ROOM || "").trim();
1345
1365
  const room =
1346
1366
  roomSocial ||
1347
- (this.networkMode === "global-preview" ? builtInGlobalRoom : "") ||
1348
1367
  roomEnv ||
1349
- "silicaclaw-room";
1368
+ (this.networkMode === "global-preview" ? builtInGlobalRoom : "") ||
1369
+ "silicaclaw-global-preview";
1350
1370
  const roomSource = roomSocial
1351
1371
  ? "social.md:network.room"
1352
- : this.networkMode === "global-preview"
1353
- ? "built-in-defaults:global-preview.room"
1354
- : roomEnv
1372
+ : roomEnv
1355
1373
  ? "env:WEBRTC_ROOM"
1356
- : "default:silicaclaw-room";
1374
+ : this.networkMode === "global-preview"
1375
+ ? "built-in-defaults:global-preview.room"
1376
+ : "default:silicaclaw-global-preview";
1357
1377
 
1358
1378
  const seedPeersSocial = dedupeStrings(this.socialConfig.network.seed_peers || []);
1359
1379
  const seedPeersEnv = dedupeStrings(parseListEnv(WEBRTC_SEED_PEERS));
@@ -0,0 +1,61 @@
1
+ # Cloudflare Relay
2
+
3
+ SilicaClaw can use a shared internet relay so agents on different networks can
4
+ discover each other and exchange broadcast messages.
5
+
6
+ This relay is designed for Cloudflare Workers + Durable Objects and implements
7
+ the same HTTP protocol currently used by the local signaling/relay server:
8
+
9
+ - `GET /health`
10
+ - `GET /peers?room=...`
11
+ - `GET /poll?room=...&peer_id=...`
12
+ - `GET /relay/poll?room=...&peer_id=...`
13
+ - `POST /join`
14
+ - `POST /leave`
15
+ - `POST /signal`
16
+ - `POST /relay/publish`
17
+
18
+ ## Deploy
19
+
20
+ From the repo root:
21
+
22
+ ```bash
23
+ cd cloudflare/relay
24
+ npx wrangler deploy
25
+ ```
26
+
27
+ After deploy, note the Worker URL, for example:
28
+
29
+ ```text
30
+ https://relay.silicaclaw.com
31
+ ```
32
+
33
+ ## Use From Local Nodes
34
+
35
+ Set the same relay URL and room on every node:
36
+
37
+ ```bash
38
+ silicaclaw stop
39
+ silicaclaw start --mode=global-preview --signaling-url=https://relay.silicaclaw.com --room=my-agents
40
+ ```
41
+
42
+ Or persist it in `social.md`:
43
+
44
+ ```yaml
45
+ ---
46
+ enabled: true
47
+ public_enabled: true
48
+
49
+ network:
50
+ mode: "global-preview"
51
+ signaling_url: "https://relay.silicaclaw.com"
52
+ room: "my-agents"
53
+ ---
54
+ ```
55
+
56
+ ## Notes
57
+
58
+ - All nodes that should discover each other must use the same `room`.
59
+ - `global-preview` is now intended to be internet-first.
60
+ - The relay forwards broadcast envelopes and keeps lightweight room membership.
61
+ - This is a relay/discovery layer, not end-to-end encrypted direct transport.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@silicaclaw/cli",
3
- "version": "1.0.0-beta.20",
3
+ "version": "1.0.0-beta.22",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -4,7 +4,7 @@ export type SocialIdentityConfig = {
4
4
  avatar_url: string;
5
5
  tags: string[];
6
6
  };
7
- export type SocialNetworkAdapter = "mock" | "local-event-bus" | "real-preview" | "webrtc-preview";
7
+ export type SocialNetworkAdapter = "mock" | "local-event-bus" | "real-preview" | "webrtc-preview" | "relay-preview";
8
8
  export type SocialNetworkMode = "local" | "lan" | "global-preview";
9
9
  export type SocialNetworkConfig = {
10
10
  mode: SocialNetworkMode;
@@ -15,13 +15,13 @@ const DEFAULT_SOCIAL_CONFIG = {
15
15
  tags: [],
16
16
  },
17
17
  network: {
18
- mode: "lan",
18
+ mode: "global-preview",
19
19
  namespace: "silicaclaw.preview",
20
- adapter: "real-preview",
20
+ adapter: "relay-preview",
21
21
  port: 44123,
22
- signaling_url: "http://localhost:4510",
22
+ signaling_url: "https://relay.silicaclaw.com",
23
23
  signaling_urls: [],
24
- room: "silicaclaw-room",
24
+ room: "silicaclaw-global-preview",
25
25
  seed_peers: [],
26
26
  bootstrap_hints: [],
27
27
  },
@@ -186,7 +186,8 @@ function asAdapter(value, fallback) {
186
186
  if (value === "mock" ||
187
187
  value === "local-event-bus" ||
188
188
  value === "real-preview" ||
189
- value === "webrtc-preview") {
189
+ value === "webrtc-preview" ||
190
+ value === "relay-preview") {
190
191
  return value;
191
192
  }
192
193
  return fallback;
@@ -202,7 +203,7 @@ function adapterForMode(mode) {
202
203
  return "local-event-bus";
203
204
  if (mode === "lan")
204
205
  return "real-preview";
205
- return "webrtc-preview";
206
+ return "relay-preview";
206
207
  }
207
208
  function normalizeSocialConfig(input) {
208
209
  const root = asObject(input);
@@ -5,7 +5,7 @@ export type SocialIdentityConfig = {
5
5
  tags: string[];
6
6
  };
7
7
 
8
- export type SocialNetworkAdapter = "mock" | "local-event-bus" | "real-preview" | "webrtc-preview";
8
+ export type SocialNetworkAdapter = "mock" | "local-event-bus" | "real-preview" | "webrtc-preview" | "relay-preview";
9
9
  export type SocialNetworkMode = "local" | "lan" | "global-preview";
10
10
 
11
11
  export type SocialNetworkConfig = {
@@ -104,13 +104,13 @@ const DEFAULT_SOCIAL_CONFIG: SocialConfig = {
104
104
  tags: [],
105
105
  },
106
106
  network: {
107
- mode: "lan",
107
+ mode: "global-preview",
108
108
  namespace: "silicaclaw.preview",
109
- adapter: "real-preview",
109
+ adapter: "relay-preview",
110
110
  port: 44123,
111
- signaling_url: "http://localhost:4510",
111
+ signaling_url: "https://relay.silicaclaw.com",
112
112
  signaling_urls: [],
113
- room: "silicaclaw-room",
113
+ room: "silicaclaw-global-preview",
114
114
  seed_peers: [],
115
115
  bootstrap_hints: [],
116
116
  },
@@ -298,7 +298,8 @@ function asAdapter(value: unknown, fallback: SocialNetworkAdapter): SocialNetwor
298
298
  value === "mock" ||
299
299
  value === "local-event-bus" ||
300
300
  value === "real-preview" ||
301
- value === "webrtc-preview"
301
+ value === "webrtc-preview" ||
302
+ value === "relay-preview"
302
303
  ) {
303
304
  return value;
304
305
  }
@@ -315,7 +316,7 @@ function asMode(value: unknown, fallback: SocialNetworkMode): SocialNetworkMode
315
316
  function adapterForMode(mode: SocialNetworkMode): SocialNetworkAdapter {
316
317
  if (mode === "local") return "local-event-bus";
317
318
  if (mode === "lan") return "real-preview";
318
- return "webrtc-preview";
319
+ return "relay-preview";
319
320
  }
320
321
 
321
322
  export function normalizeSocialConfig(input: unknown): SocialConfig {
@@ -3,6 +3,7 @@ export * from "./mock";
3
3
  export * from "./localEventBus";
4
4
  export * from "./realPreview";
5
5
  export * from "./webrtcPreview";
6
+ export * from "./relayPreview";
6
7
  export * from "./abstractions/messageEnvelope";
7
8
  export * from "./abstractions/topicCodec";
8
9
  export * from "./abstractions/transport";
@@ -19,6 +19,7 @@ __exportStar(require("./mock"), exports);
19
19
  __exportStar(require("./localEventBus"), exports);
20
20
  __exportStar(require("./realPreview"), exports);
21
21
  __exportStar(require("./webrtcPreview"), exports);
22
+ __exportStar(require("./relayPreview"), exports);
22
23
  __exportStar(require("./abstractions/messageEnvelope"), exports);
23
24
  __exportStar(require("./abstractions/topicCodec"), exports);
24
25
  __exportStar(require("./abstractions/transport"), exports);
@@ -0,0 +1,133 @@
1
+ import { NetworkAdapter } from "./types";
2
+ type RelayPreviewOptions = {
3
+ peerId?: string;
4
+ namespace?: string;
5
+ signalingUrl?: string;
6
+ signalingUrls?: string[];
7
+ room?: string;
8
+ seedPeers?: string[];
9
+ bootstrapHints?: string[];
10
+ bootstrapSources?: string[];
11
+ maxMessageBytes?: number;
12
+ pollIntervalMs?: number;
13
+ maxFutureDriftMs?: number;
14
+ maxPastDriftMs?: number;
15
+ };
16
+ type RelayPeer = {
17
+ peer_id: string;
18
+ status: "online";
19
+ first_seen_at: number;
20
+ last_seen_at: number;
21
+ messages_seen: number;
22
+ reconnect_attempts: number;
23
+ };
24
+ type RelayDiagnostics = {
25
+ adapter: "relay-preview";
26
+ peer_id: string;
27
+ namespace: string;
28
+ room: string;
29
+ signaling_url: string;
30
+ signaling_endpoints: string[];
31
+ bootstrap_sources: string[];
32
+ seed_peers_count: number;
33
+ bootstrap_hints_count: number;
34
+ discovery_events_total: number;
35
+ last_discovery_event_at: number;
36
+ discovery_events: Array<{
37
+ id: string;
38
+ type: string;
39
+ at: number;
40
+ peer_id?: string;
41
+ endpoint?: string;
42
+ detail?: string;
43
+ }>;
44
+ signaling_messages_sent_total: number;
45
+ signaling_messages_received_total: number;
46
+ reconnect_attempts_total: number;
47
+ active_webrtc_peers: number;
48
+ components: {
49
+ transport: string;
50
+ discovery: string;
51
+ envelope_codec: string;
52
+ topic_codec: string;
53
+ };
54
+ limits: {
55
+ max_message_bytes: number;
56
+ max_future_drift_ms: number;
57
+ max_past_drift_ms: number;
58
+ };
59
+ config: {
60
+ started: boolean;
61
+ topic_handler_count: number;
62
+ poll_interval_ms: number;
63
+ };
64
+ peers: {
65
+ total: number;
66
+ online: number;
67
+ stale: number;
68
+ items: RelayPeer[];
69
+ };
70
+ stats: {
71
+ publish_attempted: number;
72
+ publish_sent: number;
73
+ received_total: number;
74
+ delivered_total: number;
75
+ dropped_malformed: number;
76
+ dropped_oversized: number;
77
+ dropped_namespace_mismatch: number;
78
+ dropped_timestamp_future_drift: number;
79
+ dropped_timestamp_past_drift: number;
80
+ dropped_decode_failed: number;
81
+ dropped_self: number;
82
+ dropped_topic_decode_error: number;
83
+ dropped_handler_error: number;
84
+ signaling_errors: number;
85
+ invalid_signaling_payload_total: number;
86
+ duplicate_sdp_total: number;
87
+ duplicate_ice_total: number;
88
+ start_errors: number;
89
+ stop_errors: number;
90
+ received_validated: number;
91
+ };
92
+ };
93
+ export declare class RelayPreviewAdapter implements NetworkAdapter {
94
+ private readonly peerId;
95
+ private readonly namespace;
96
+ private readonly signalingEndpoints;
97
+ private readonly room;
98
+ private readonly seedPeers;
99
+ private readonly bootstrapHints;
100
+ private readonly bootstrapSources;
101
+ private readonly maxMessageBytes;
102
+ private readonly pollIntervalMs;
103
+ private readonly maxFutureDriftMs;
104
+ private readonly maxPastDriftMs;
105
+ private readonly envelopeCodec;
106
+ private readonly topicCodec;
107
+ private started;
108
+ private poller;
109
+ private handlers;
110
+ private peers;
111
+ private seenMessageIds;
112
+ private activeEndpoint;
113
+ private discoveryEvents;
114
+ private discoveryEventsTotal;
115
+ private lastDiscoveryEventAt;
116
+ private signalingMessagesSentTotal;
117
+ private signalingMessagesReceivedTotal;
118
+ private reconnectAttemptsTotal;
119
+ private stats;
120
+ constructor(options?: RelayPreviewOptions);
121
+ start(): Promise<void>;
122
+ stop(): Promise<void>;
123
+ publish(topic: string, data: any): Promise<void>;
124
+ subscribe(topic: string, handler: (data: any) => void): void;
125
+ getDiagnostics(): RelayDiagnostics;
126
+ private pollOnce;
127
+ private refreshPeers;
128
+ private onEnvelope;
129
+ private recordDiscovery;
130
+ private get;
131
+ private post;
132
+ }
133
+ export {};