@decentnetwork/lan 0.1.6 → 0.1.8

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.
Binary file
Binary file
Binary file
Binary file
@@ -108,11 +108,13 @@ export class ConfigLoader {
108
108
  enabled: false,
109
109
  userids: [],
110
110
  refreshIntervalMs: 60_000,
111
- // Default: do NOT auto-friend roster peers. Dora is a naming
112
- // / IP service, not a trust statement. Operators opt in with
113
- // `agentnet dora autofriend all` (closed labs) or
114
- // `agentnet dora autofriend allow <name|userid>` (whitelist).
115
- autoFriend: "none",
111
+ // Default: auto-friend every peer in the dora roster. Dora
112
+ // membership IS the trust statement joining a dora means
113
+ // "I want to be on this network", and a single-tenant lab is
114
+ // the common case. Operators on a multi-tenant / public
115
+ // dora opt out with `agentnet dora autofriend none` or
116
+ // whitelist via `agentnet dora autofriend allow <peer>...`.
117
+ autoFriend: "all",
116
118
  },
117
119
  };
118
120
  }
@@ -90,15 +90,21 @@ export class DaemonServer {
90
90
  // optional dora registration can decide our IP.
91
91
  const keyFile = resolve(this.config.carrier.dataDir, "keypair.json");
92
92
  this.peerManager = new PeerManager();
93
- // Daemon does NOT use express nodes. Express is the offline-message
94
- // store-and-forward relay appropriate for friend-request delivery
95
- // (peer might be offline) but not for live packet forwarding (peer
96
- // must be online; we drop packets via SessionManager.isFriendOnline).
97
- // Passing empty array prevents the SDK from falling back to express.
93
+ // Use express nodes. Previously the daemon passed an empty array
94
+ // here on the theory that "express is for offline messages, not
95
+ // live packet forwarding". But asymmetric Carrier sessions (peer
96
+ // A thinks B is online, B thinks A is offline — common across
97
+ // China-WAN paths) make dora's sendText reply fail direct and
98
+ // fall back to express; if we don't subscribe to express we
99
+ // never see the response. dora -> cn for register-ok / list-ok
100
+ // hits this exact case. The cost of enabling express here is
101
+ // that idle text messages may take an extra hop through the
102
+ // HTTPS relay — packet-router doesn't use sendText, so its
103
+ // hot path is unaffected.
98
104
  await this.peerManager.create({
99
105
  keyFile,
100
106
  bootstrapNodes: this.config.carrier.bootstrapNodes,
101
- expressNodes: [],
107
+ expressNodes: this.config.carrier.expressNodes ?? [],
102
108
  });
103
109
  await this.peerManager.start();
104
110
  this.logger.info(`Identity: ${this.peerManager.getAddress()}`);
@@ -318,14 +318,16 @@ export class DoraIntegration {
318
318
  this.friendRequested.add(entry.userid);
319
319
  return;
320
320
  }
321
- // Policy gate. Dora is a name service, not a trust statement.
322
- // Default ("none") means we DON'T auto-friend roster peers
323
- // an operator on a multi-tenant dora isn't asking to be
324
- // mutually-friended with everyone else just because they share
325
- // a name service. "all" reproduces the old behavior (closed
326
- // labs). Otherwise the policy is a whitelist of names or
327
- // userids; only matches are friended.
328
- const policy = this.opts.config.autoFriend ?? "none";
321
+ // Policy gate. The undefined default is "all" because a peer
322
+ // that just joined a dora explicitly said "I want to be on
323
+ // this network" that's the trust statement. Without "all"
324
+ // as the legacy-config default, new peers can never join an
325
+ // existing mesh: their roster fills up but everyone else's
326
+ // legacy configs (lacking autoFriend) silently refuse to
327
+ // friend them back. Operators on a public / multi-tenant dora
328
+ // can opt out with `agentnet dora autofriend none` or supply
329
+ // a whitelist via `agentnet dora autofriend allow <peer>...`.
330
+ const policy = this.opts.config.autoFriend ?? "all";
329
331
  if (!this.policyAllows(entry, policy)) {
330
332
  // Mark as "seen" so we don't re-evaluate the policy every
331
333
  // 60s for entries we deliberately skip — but DON'T mark as
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decentnetwork/lan",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Private virtual LAN for self-hosted services and AI agents, built on Elastos Carrier. NAT-traversal, name service, ACL, all over a peer-to-peer mesh — no public IP required.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",