@yz-social/kdht 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.
package/dht/nodeProbe.js CHANGED
@@ -118,7 +118,7 @@ export class NodeProbe extends NodeMessages {
118
118
  return null;
119
119
  };
120
120
 
121
- // Handler for when a request completes. result is only expected if status='responded'.
121
+ // Handler for when a request completes. a non-null result is only expected if status='responded'.
122
122
  const handleCompletion = (helper, status, result) => {
123
123
  if (iterationFinished) return; // too late
124
124
 
@@ -166,7 +166,7 @@ export class NodeProbe extends NodeMessages {
166
166
 
167
167
  // Result is array of Helpers (may be empty if node had no new contacts)
168
168
  // Merge new helpers into allNodesSeen and track progress
169
- if (result?.length > 0) {
169
+ if (result.length > 0) {
170
170
  allNodesSeen.push(...result);
171
171
  allNodesSeen.sort(Helper.compare); // Keep sorted by distance (best-first).
172
172
  responsesWithoutNewNodes = 0; // reset counter
@@ -226,7 +226,7 @@ export class NodeProbe extends NodeMessages {
226
226
  }
227
227
 
228
228
  this.step(targetKey, finder, helper, keysSeen, trace)
229
- .then(result => handleCompletion(helper, 'responded', result))
229
+ .then(result => handleCompletion(helper, result ? 'responded' : 'disconnected', result))
230
230
  .catch(err => {
231
231
  // Handle errors - treat as disconnected
232
232
  handleCompletion(helper, 'disconnected');
@@ -72,7 +72,7 @@ export class NodeUtilities {
72
72
  for (let index = 0; index < this.constructor.keySize; index++) {
73
73
  const bucket = this.routingTable.get(index);
74
74
  if (!bucket) continue;
75
- report += `\n ${index}: ` + (contactsString(bucket.contacts) || '-');
75
+ report += `\n ${index} (${bucket.contacts.length}): ` + (contactsString(bucket.contacts) || '-');
76
76
  }
77
77
  return logger ? logger(report) : report;
78
78
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yz-social/kdht",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "Pure Kademlia base, for testing variations.",
5
5
  "exports": {
6
6
  ".": "./index.js",
package/portals/node.js CHANGED
@@ -28,7 +28,6 @@ export async function setup({baseURL, externalBaseURL = '', verbose, fixedSpacin
28
28
  const bootstrap = joinURL && await contact.ensureRemoteContact(bootstrapName, joinURL);
29
29
  process.send(contact.sname); // Report in to server as available for others to bootstrap through.
30
30
  if (bootstrap) await contact.join(bootstrap);
31
- contact.host.xlog('joined');
32
31
  process.on('SIGINT', async () => {
33
32
  console.log(process.title, 'Shutdown for Ctrl+C');
34
33
  await contact.disconnect();
package/spec/bots.js CHANGED
@@ -45,8 +45,10 @@ const argv = yargs(hideBin(process.argv))
45
45
  .parse();
46
46
 
47
47
  const host = uuidv4();
48
+ process.title = 'kdht-bot-' + host;
48
49
 
49
50
  if (cluster.isPrimary) {
51
+ console.log(`${cpus()[0].model}, ${logicalCores} logical cores. Starting ${argv.nBots} over ${Node.refreshTimeIntervalMS/1000} seconds.`);
50
52
  for (let i = 1; i < argv.nBots; i++) { // The cluster primary becomes bot 0.
51
53
  cluster.fork();
52
54
  }
@@ -56,7 +58,6 @@ if (cluster.isPrimary) {
56
58
  launchWriteRead(argv.nWrites, argv.baseURL, Node.refreshTimeIntervalMS, argv.verbose);
57
59
  }
58
60
  }
59
- process.title = 'kdht-bot-' + host;
60
61
 
61
62
  await Node.delay(Node.randomInteger(Node.refreshTimeIntervalMS));
62
63
  console.log(cluster.worker?.id || 0, host);
@@ -65,11 +66,11 @@ let bootstrapName = await contact.fetchBootstrap(argv.baseURL);
65
66
  let bootstrapContact = await contact.ensureRemoteContact(bootstrapName, argv.baseURL);
66
67
  await contact.join(bootstrapContact);
67
68
 
68
- // process.on('SIGINT', async () => {
69
- // console.log(process.title, 'Shutdown for Ctrl+C');
70
- // await contact.disconnect();
71
- // process.exit(0);
72
- // });
69
+ process.on('SIGINT', async () => {
70
+ console.log(process.title, 'Shutdown for Ctrl+C');
71
+ await contact.disconnect();
72
+ process.exit(0);
73
+ });
73
74
 
74
75
  while (argv.thrash) {
75
76
  await Node.delay(contact.host.fuzzyInterval(Node.refreshTimeIntervalMS));
@@ -52,7 +52,7 @@ describe("DHT internals", function () {
52
52
  let report = example.report(string => string); // No op for what to do with the report. Just return it.
53
53
  expect(report).toBe(`Node: 0, 0 transports
54
54
  storing 2: 58686998438798322974467776505749455156n: 17, 336119020696479164089214630533760195420n: "baz"
55
- 90: 1n, 2n`);
55
+ 90 (2): 1n, 2n`);
56
56
  });
57
57
  });
58
58
 
@@ -169,10 +169,10 @@ describe("DHT internals", function () {
169
169
  it("reports name and bucket contents.", function () {
170
170
  let report = node.report(string => string);
171
171
  let expected = `Node: ${node.name}, 0 transports
172
- 0: ${node.routingTable.get(0).contacts.map(c => c.key.toString() + 'n').join(', ')}
173
- 10: ${node.routingTable.get(10).contacts.map(c => c.key.toString() + 'n').join(', ')}
174
- 60: ${node.routingTable.get(60).contacts.map(c => c.key.toString() + 'n').join(', ')}
175
- 90: ${node.routingTable.get(90).contacts.map(c => c.key.toString() + 'n').join(', ')}`;
172
+ 0 (1): ${node.routingTable.get(0).contacts.map(c => c.key.toString() + 'n').join(', ')}
173
+ 10 (1): ${node.routingTable.get(10).contacts.map(c => c.key.toString() + 'n').join(', ')}
174
+ 60 (1): ${node.routingTable.get(60).contacts.map(c => c.key.toString() + 'n').join(', ')}
175
+ 90 (1): ${node.routingTable.get(90).contacts.map(c => c.key.toString() + 'n').join(', ')}`;
176
176
  expect(report).toBe(expected);
177
177
  });
178
178
  });
@@ -264,7 +264,7 @@ describe("DHT internals", function () {
264
264
  // Create a small network
265
265
  network = [];
266
266
  for (let i = 0; i < nNodes; i++) {
267
- const contact = await SimulatedContact.create(i);
267
+ const contact = await SimulatedContact.create({name: i, info: false});
268
268
  network.push(contact);
269
269
  }
270
270
 
@@ -410,7 +410,7 @@ describe("DHT internals", function () {
410
410
  async function createRandomNetwork(nNodes, connectivityFactor = 0.5) {
411
411
  const network = [];
412
412
  for (let i = 0; i < nNodes; i++) {
413
- const contact = await SimulatedContact.create(i);
413
+ const contact = await SimulatedContact.create({name: i, info: false});
414
414
  network.push(contact);
415
415
  }
416
416
 
package/spec/portal.js CHANGED
@@ -79,6 +79,7 @@ const argv = yargs(hideBin(process.argv))
79
79
  if (cluster.isPrimary) { // Parent process with portal webserver through which clienta can bootstrap
80
80
  // Our job is to launch some kdht nodes to which clients can connect by signaling through
81
81
  // a little web server operated here.
82
+ console.log(`${cpus()[0].model}, ${logicalCores} logical cores.`);
82
83
  process.title = 'kdht-portal-server';
83
84
  const __filename = fileURLToPath(import.meta.url);
84
85
  const __dirname = path.dirname(__filename);
@@ -61,6 +61,7 @@ export class Contact {
61
61
  }
62
62
  async disconnect() { // Simulate a disconnection of node, marking as such and rejecting any RPCs in flight.
63
63
  Node.assert(this.host === this.node, "Disconnect", this.name, "not invoked on home contact", this.host.name);
64
+ this.host.ilog('disconnecting from network');
64
65
  // Attempt to ensure that there are other copies.
65
66
  if (!this.host.isStopped()) {
66
67
  await Promise.all(this.host.storage.entries().map(([key, value]) => this.storeValue(key, value)));
@@ -76,7 +76,7 @@ export class WebContact extends Contact { // Our wrapper for the means of contac
76
76
  return `@${this.host.contact.sname} ==> ${this.sname}`;
77
77
  }
78
78
 
79
- ensureWebRTC(initiate = false, timeoutMS = this.host.timeoutMS || 10e3) { // Ensure we are connected, if possible.
79
+ ensureWebRTC(initiate = false, timeoutMS = this.host.timeoutMS || 30e3) { // Ensure we are connected, if possible.
80
80
  // If not already configured, sets up contact to have properties:
81
81
  // - connection - a promise for an open webrtc data channel:
82
82
  // this.send(string) puts data on the channel
package/#notes.txt# DELETED
@@ -1,383 +0,0 @@
1
- defined focus
2
-
3
- internal template defines position in market
4
- 1. market in a unique way: can own it. (Play Bigger, Blue Ocean, etc.)
5
- 2. beachead segment of that market
6
- 3. comparisons: triangulated between market leader and a referenceable innovation
7
- positioning claim is specific to product marketing
8
- note elevator pitch - internal doc
9
- not advertising copy.
10
- not a business plan, revenue, etc.
11
-
12
- template defines the story of how we are better than the market leader, and how we will cold-start
13
-
14
- e.g., Signal is very relevant in functionality and technology
15
- but: not the market
16
- maybe a second referenceable innovation - i.e., functionally, we're a cross between signal and web3 ==> but in user terms, so is WeChat!
17
- i.e., use the decentralization ideas of web3 (but those guys fail to package it conveniently)
18
- signal doesn't tell that story because signal is just as centralized as wechat
19
-
20
-
21
- - sendRPC timeout?
22
- - iterate => probe
23
- - instead of awaiting all queries on each iteration of probe, operate on each result as it comes in
24
- (remove any sendRPC timeout here, but do test that a dead node eventually resolves null)
25
-
26
- test({setupTimeMS: 30e3, notes: "Bigger network overflowing bucket and transport limits."});
27
-
28
- connected (showing type)
29
- make sure Unable to connect drops the contact
30
- joined
31
- closed
32
- refresh
33
-
34
-
35
-
36
- change sname and bootstrap
37
- xlog => flog
38
- dht => node
39
- transports => contact
40
- dhtWriteReadSpec => dhtWebRTCSpec
41
- iterate => probe
42
- README: explain mixin and directory statgegy
43
- README: cite heer and r5n
44
- README: current explain forwarding stategy
45
- README: explain bye and disconnect optimizations
46
-
47
- sticky pubsub
48
- immediate need and path:
49
- => deploy in alert, illustrating key claims:
50
- dht pubsub works
51
- fast enough (slow realtime)
52
- lots of activity, tiny/distant server(s)
53
- multiple mirrors, one network
54
- => set up for next steps: concordance engine relays; persistent store (keystore, below)
55
- most important: globally correct
56
- => eventually consistent; B.A.S.E not A.C.I.D
57
- => self-contained, rather than in context
58
- => slow, heavy. If an app needs fast in context, Concordance Engine is the right tool.
59
- solve the specific problem or make tooling?
60
- => Do not rely on other nodes being current!
61
- => Some recursive-design depends on field findings (churn, latency, geographic keys)
62
- => Iterative for now. Later replace with recursive when we update DHT design for geographic-recursion.
63
- => Keep it simple, DRY, independent of choices => less code is less code to change
64
- now: correct but not secure
65
- => store a json with a timestamp and payload
66
- later: store JWS, using https://github.com/kilroy-code/distributed-security
67
- base64 of JSON containing payload, claims, and signature(payload, claims)
68
- our claims have iat, act, iss, cty (and alg). Our act, iss are the serialized pubkeys needed for verification.
69
- (cty can specify that payload is a JWE)
70
- deep verify by storer and client app
71
- iat < now and > existing
72
- iss same as existing
73
- ron:
74
- https://github.com/YZ-social/yz.p2pnetwork/tree/main/.kiro/specs/sticky-pubsub
75
- https://github.com/YZ-social/yz.network/blob/main/docs/proposals/sticky-pubsub-proposal.md
76
- https://github.com/YZ-social/yz.network/blob/main/docs/proposals/sticky-pubsub-literature-review.md
77
- H's simple server:
78
- server: https://github.com/YZ-social/Yz.social/blob/main/routes/index.js
79
- client: https://github.com/YZ-social/Yz.social/blob/main/public/javascripts/pubSub.js
80
-
81
- async signals(key, signals, forwardingExclusions = false) {
82
- //this.xlog(this.key, 'handling signals request', key, signals);
83
- //await this.constructor.delay(100); // fixme remove
84
- if (!this.isRunning) return null;
85
- if (this.key === key) {
86
- //this.xlog('we are signals target, with', forwardingExclusions?.length, 'exclusions');
87
- return await this.contact.signals(...signals);
88
- } // Yay, us!
89
-
90
- let contact = this.findContactByKey(key); // If we have the target as a contact, use it directly.
91
- if (!contact && !forwardingExclusions) return null;
92
- if (contact) return await contact.sendRPC('signals', key, signals, forwardingExclusions);
93
- // Forward recursively.
94
- const contacts = this.findClosestHelpers(key).map(helper => helper.contact);
95
- forwardingExclusions.push(this.name);
96
- this.xlog('forwarding signals', key, forwardingExclusions.length, 'exclusions,', contacts.length, 'contacts.');
97
- for (const contact of contacts) {
98
- if (!contact.isRunning) continue;
99
- if (!contact.connection) continue;
100
- if (forwardingExclusions.includes(contact.name)) continue;
101
- const response = await contact.sendRPC('signals', key, signals, forwardingExclusions);
102
- if (response) return response;
103
- }
104
- this.xlog('Unable to deliver signals', key);
105
- return null;
106
- }
107
- async signals(key, signals, forwardingExlusions = false) {
108
- //this.xlog(this.key, 'handling signals request', key, signals);
109
- await this.constructor.delay(100); // fixme remove
110
- if (!this.isRunning) return null;
111
- if (this.key === key) return await this.contact.signals(...signals);
112
- let contact = this.findContactByKey(key);
113
- if (!contact && forwardingExlusions) {
114
-
115
- }
116
- if (!contact) return null;
117
- return await contact.sendRPC('signals', key, signals, forwardingExlusions);
118
- }
119
-
120
-
121
- -----------------
122
- Started
123
-
124
- Smoke: Server setup 10 / 1.568 = 6 nodes/second.
125
- Smoke: Server setup 10 / 1.513 = 7 nodes/second.
126
- * Smoke: Server setup 10 / 1.571 = 6 nodes/second.
127
- Runs : Server setup 10 / 0.033 = 303 nodes/second.
128
- Runs : Server setup 10 / 0.029 = 345 nodes/second.
129
- * Runs : Server setup 10 / 0.033 = 303 nodes/second.
130
- Probe: Server setup 10 / 0.054 = 185 nodes/second.
131
- Probe: Server setup 10 / 0.047 = 213 nodes/second.
132
- * Probe: Server setup 10 / 0.053 = 189 nodes/second.
133
- Small: Server setup 10 / 0.052 = 192 nodes/second.
134
- Small: Server setup 10 / 0.047 = 213 nodes/second.
135
- * Small: Server setup 10 / 0.051 = 196 nodes/second.
136
- Norml: Server setup 10 / 1.55 = 6 nodes/second.
137
- Norml: Server setup 10 / 1.552 = 6 nodes/second.
138
- * Norml: Server setup 10 / 1.51 = 7 nodes/second.
139
-
140
- Smoke: Created 10 / 3.359 = 0.336 client nodes/second.
141
- Smoke: Created 10 / 3.354 = 0.335 client nodes/second.
142
- * Smoke: Created 10 / 4.881 = 0.488 client nodes/second.
143
- Runs : Created 13 / 2.18 = 0.168 client nodes/second.
144
- Runs : Created 13 / 2.172 = 0.167 client nodes/second.
145
- * Runs : Created 13 / 2.181 = 0.168 client nodes/second.
146
- Probe: Created 8 / 1.178 = 0.147 client nodes/second.
147
- Probe: Created 8 / 1.166 = 0.146 client nodes/second.
148
- * Probe: Created 5 / 1.252 = 0.250 client nodes/second.
149
- Small: Created 19 / 5.289 = 0.278 client nodes/second.
150
- Small: Created 20 / 5.419 = 0.271 client nodes/second.
151
- * Small: Created 13 / 5.535 = 0.426 client nodes/second.
152
- Normal: Created 61 / 60.394 = 0.990 client nodes/second.
153
- Norml: Created 63 / 62.024 = 0.985 client nodes/second.
154
- * Norml: Created 52 / 62.239 = 1.197 client nodes/second.
155
-
156
- Smoke: Wrote 20 / 0.864 = 23 nodes/second.
157
- Smoke: Wrote 20 / 0.854 = 23 nodes/second.
158
- * Smoke: Wrote 20 / 1.84 = 11 nodes/second.
159
- Runs : Wrote 23 / 0.14 = 164 nodes/second.
160
- Runs : Wrote 23 / 0.135 = 170 nodes/second.
161
- * Runs : Wrote 23 / 2.036 = 11 nodes/second.
162
- Probe: Wrote 18 / 0.029 = 621 nodes/second.
163
- Probe: Wrote 18 / 0.025 = 720 nodes/second.
164
- * Probe: Wrote 15 / 0.722 = 21 nodes/second.
165
- Small: Wrote 29 / 0.139 = 209 nodes/second.
166
- Small: Wrote 30 / 0.479 = 63 nodes/second.
167
- * Small: Wrote 23 / 2.547 = 9 nodes/second.
168
- Norml: Wrote 73 / 3.102 = 24 nodes/second.
169
- Normal: Wrote 71 / 3.382 = 21 nodes/second.
170
- * Norml: Wrote 62 / 10.276 = 6 nodes/second.
171
-
172
- Smoke: Read 20 / 0.002 = 10000 values/second.
173
- Smoke: Read 20 / 0.001 = 20000 values/second.
174
- * Smoke: Read 20 / 0.286 = 70 values/second.\
175
- Runs : Read 23 / 0.003 = 7667 values/second.
176
- Runs : Read 23 / 0.001 = 23000 values/second.
177
- * Runs : Read 23 / 0.102 = 225 values/second.
178
- Probe: Read 18 / 0.001 = 18000 values/second.
179
- Probe: Read 18 / 0 = Infinity values/second.
180
- * Probe: Read 15 / 0.001 = 15000 values/second.
181
- Small: Read 29 / 0.001 = 29000 values/second.
182
- Small: Read 30 / 0.003 = 10000 values/second.
183
- * Small: Read 23 / 0.103 = 223 values/second.
184
- Norml: Read 73 / 0.341 = 214 values/second.
185
- Normal: Read 71 / 0.524 = 135 values/second.
186
- * Norml: Read 62 / 3.163 = 20 values/second.
187
-
188
- 4b3f103c40b899f8eb9a4ba66b88fb973c5569b8
189
- ---------
190
- 6 minutes for 15 nodes
191
- 23 minutes for 18 nodes
192
- 23? minutes for 20 nodes
193
- 52 minutes for 22 nodes
194
- 43 mintues for 30 nodes
195
-
196
- 100 => 63
197
- 200 => 82 19
198
- 300 => 91 9
199
- 400 => 101 8
200
- 500 => 106 5
201
- 1000 => 123
202
- 3000 => 150
203
-
204
- items marked as asynchronous should use queueWork(thunk).
205
- Can addToRoutingTable use this instead of it's own? Or not use any?
206
- Should iterate?
207
-
208
- are there getBucketIndex calls that can be DRY'd.
209
- clean up sendRPC and remove sendCatchingRPC
210
- clean up Contact#storeValue?
211
-
212
- removeKey from both sides on disconnect: issue is that a home conctact doesn't know about its clones.
213
- limit transports =>
214
- generic acceptance tests
215
- - when forwarding and we get a disconnect in a non-terminal/intermediate node, remove... which node???... and try again
216
-
217
- --------
218
- A (impolite) setup: data -1 connecting negotiated: false nameExists: false
219
- A (impolite) setting onmessage on data -1
220
- B (polite) setup: data -1 connecting negotiated: false nameExists: false
221
- B (polite) setting onmessage on data -1
222
-
223
- A (impolite) creating offer in state: stable
224
- A (impolite) setting local offer in state: stable
225
- B (polite) got offer stable making: false collision: false ignore: false settingRemote: undefined
226
- B (polite) creating offer in state: have-remote-offer
227
- A (impolite) got answer have-local-offer making: false collision: false ignore: false settingRemote: undefined
228
-
229
- A (impolite) channel onopen: data 1 open negotiated: false nameExists: false
230
- A (impolite) NOT setting onmessage on data 1
231
- A (impolite) sending on data 1 Hello from A (impolite)
232
-
233
- B (polite) channel onopen: data 0 open negotiated: false nameExists: false
234
- B (polite) NOT setting onmessage on data 0
235
- B (polite) sending on data 0 Hello from B (polite)
236
-
237
- A (impolite) ondatachannel: data 0 open false
238
- A (impolite) setup: data 0 open negotiated: false nameExists: true
239
- A (impolite) setting onmessage on data 0
240
-
241
- B (polite) ondatachannel: data 1 open false
242
- B (polite) setup: data 1 open negotiated: false nameExists: true
243
- B (polite) setting onmessage on data 1
244
-
245
- A (impolite) channel onopen: data 0 open negotiated: false nameExists: true
246
- A (impolite) onmessage: data 0 Hello from B (polite)
247
-
248
- B (polite) channel onopen: data 1 open negotiated: false nameExists: true
249
- B (polite) onmessage: data 1 Hello from A (impolite)
250
- ......
251
-
252
- A (impolite) setup: data -1 connecting negotiated: false nameExists: false
253
- A (impolite) NOT setting onmessage on data -1
254
- B (polite) setup: data -1 connecting negotiated: false nameExists: false
255
- B (polite) NOT setting onmessage on data -1
256
- A (impolite) creating offer in state: stable
257
- A (impolite) setting local offer in state: stable
258
- B (polite) got offer stable making: false collision: false ignore: false settingRemote: undefined
259
- B (polite) creating offer in state: have-remote-offer
260
- A (impolite) got answer have-local-offer making: false collision: false ignore: false settingRemote: undefined
261
- A (impolite) channel onopen: data 1 open negotiated: false nameExists: false
262
- A (impolite) setting onmessage on data 1
263
- A (impolite) sending on data 1 Hello from A (impolite)
264
- B (polite) channel onopen: data 0 open negotiated: false nameExists: false
265
- B (polite) setting onmessage on data 0
266
- B (polite) sending on data 0 Hello from B (polite)
267
- A (impolite) ondatachannel: data 0 open false
268
- A (impolite) setup: data 0 open negotiated: false nameExists: true
269
- A (impolite) NOT setting onmessage on data 0
270
- B (polite) ondatachannel: data 1 open false
271
- B (polite) setup: data 1 open negotiated: false nameExists: true
272
- B (polite) NOT setting onmessage on data 1
273
- A (impolite) channel onopen: data 0 open negotiated: false nameExists: true
274
- B (polite) channel onopen: data 1 open negotiated: false nameExists: true
275
-
276
- --------------
277
-
278
- https://www.ccijustice.org/ a network of rapid response networks in CA. A phone number for one of them ‭(408) 290-1144‬.
279
-
280
- making free software that might help the project
281
- i'd like to find out what I need to do to make it actually useful
282
-
283
- people anonymously report ice on a map, in realtime
284
- see activity across the bay, and zoom in
285
- on web -- no app stores to be blocked from
286
-
287
- 650-817-5956
288
-
289
- -------------
290
-
291
-
292
-
293
- 2025-12-31T21:41:17.322Z @S06fca527-cfa7-41b2-a5ac-eb680adf6549 ==> S649d1abc-c3bd-4460-aaeb-ca4559917b83 onSignal offer stable making: false collision: false ignore: false settingRemote: undefined
294
-
295
- 2025-12-31T21:41:17.324Z 200 POST /kdht/join/S649d1abc-c3bd-4460-aaeb-ca4559917b83/S06fca527-cfa7-41b2-a5ac-eb680adf6549 535 - 5.675 ms
296
-
297
- 2025-12-31T21:41:17.516Z @S649d1abc-c3bd-4460-aaeb-ca4559917b83 ==> S06fca527-cfa7-41b2-a5ac-eb680adf6549 onSignal answer have-local-offer making: false collision: false ignore: false settingRemote: undefined
298
-
299
- 2025-12-31T21:41:17.977Z 200 POST /kdht/join/S649d1abc-c3bd-4460-aaeb-ca4559917b83/S06fca527-cfa7-41b2-a5ac-eb680adf6549 808 - 40.544 ms
300
-
301
-
302
- 2025-12-31T21:41:22.323Z S06fca527-cfa7-41b2-a5ac-eb680adf6549 **** connection timeout S649d1abc-c3bd-4460-aaeb-ca4559917b83 5002 status: connecting signaling: stable last signal: NaN last send: NaN last response: NaN ****
303
-
304
-
305
- S649d1abc-c3bd-4460-aaeb-ca4559917b83 **** connection timeout S06fca527-cfa7-41b2-a5ac-eb680adf6549
306
-
307
-
308
- --------
309
- S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0/Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763
310
-
311
-
312
- 2025-12-31T22:05:09.434Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal offer waiting: false has transfer: true on pending: 0
313
- 2025-12-31T22:05:09.435Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 0
314
- 2025-12-31T22:05:09.436Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 1
315
- 2025-12-31T22:05:09.437Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 2
316
- 2025-12-31T22:05:09.437Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 3
317
- 2025-12-31T22:05:09.437Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 4
318
- 2025-12-31T22:05:09.437Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 5
319
- 2025-12-31T22:05:09.437Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 6
320
- 2025-12-31T22:05:09.437Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 7
321
- 2025-12-31T22:05:09.478Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 8
322
- 2025-12-31T22:05:09.479Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 9
323
- 2025-12-31T22:05:09.479Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 10
324
- 2025-12-31T22:05:09.479Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 11
325
- 2025-12-31T22:05:09.479Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 12
326
- 2025-12-31T22:05:09.480Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 13
327
- 2025-12-31T22:05:09.480Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 14
328
- 2025-12-31T22:05:09.480Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 15
329
- 2025-12-31T22:05:09.480Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 16
330
- 2025-12-31T22:05:09.480Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 17
331
- 2025-12-31T22:05:09.480Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 18
332
- 2025-12-31T22:05:09.481Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 19
333
- 2025-12-31T22:05:09.490Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 20
334
- 2025-12-31T22:05:09.500Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 21
335
- 2025-12-31T22:05:09.500Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 22
336
- 2025-12-31T22:05:09.501Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 23
337
- 2025-12-31T22:05:09.501Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 24
338
- 2025-12-31T22:05:09.511Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 25
339
- 2025-12-31T22:05:09.511Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 26
340
- 2025-12-31T22:05:09.511Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 27
341
- 2025-12-31T22:05:09.511Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 signal icecandidate waiting: false has transfer: true on pending: 28
342
-
343
- 2025-12-31T22:05:09.813Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 onSignal offer stable making: false collision: false ignore: false settingRemote: undefined
344
- 2025-12-31T22:05:09.816Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal answer waiting: false has transfer: false on pending: 0
345
-
346
- 2025-12-31T22:05:09.817Z 200 POST /kdht/join/S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0/Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 535 - 7.032 ms
347
-
348
- 2025-12-31T22:05:09.820Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 0
349
- 2025-12-31T22:05:09.820Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 1
350
- 2025-12-31T22:05:09.820Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 2
351
- 2025-12-31T22:05:09.821Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 3
352
- 2025-12-31T22:05:09.920Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 4
353
- 2025-12-31T22:05:09.921Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 5
354
- 2025-12-31T22:05:09.921Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 6
355
- 2025-12-31T22:05:09.921Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 7
356
- 2025-12-31T22:05:09.944Z @Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 ==> S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 signal icecandidate waiting: false has transfer: false on pending: 8
357
-
358
- 2025-12-31T22:05:09.934Z @S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 ==> Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 onSignal answer have-local-offer making: false collision: false ignore: false settingRemote: undefined
359
-
360
- 2025-12-31T22:05:10.113Z 200 POST /kdht/join/S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0/Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 1917 - 12.579 ms
361
-
362
- 2025-12-31T22:05:14.133Z S2fac52bd-cf98-4dd7-aff0-90e5dcc2bdd0 **** connection timeout Sedbb7c85-bd99-40d2-a26a-2ba73bf4d763 5001 status: connecting signaling: stable last signal: 4621 last send: 4197 last response: 3821 ****
363
- ---------
364
-
365
- S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 ==> S91e1075d-da32-4d7d-bd46-3ab315162322
366
-
367
- 2025-12-31T23:40:18.586Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 sending 1 signals
368
- 2025-12-31T23:40:18.652Z 200 POST /kdht/join/S91e1075d-da32-4d7d-bd46-3ab315162322/S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 535 - 7.533 ms
369
- 2025-12-31T23:40:18.701Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 sending 9 signals
370
- 2025-12-31T23:40:18.752Z 200 POST /kdht/join/S91e1075d-da32-4d7d-bd46-3ab315162322/S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 808 - 5.214 ms
371
- 2025-12-31T23:40:19.690Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 sending 1 signals
372
- 2025-12-31T23:40:19.714Z 200 POST /kdht/join/S91e1075d-da32-4d7d-bd46-3ab315162322/S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 535 - 3.288 ms
373
- 2025-12-31T23:40:19.734Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 sending 5 signals
374
- 2025-12-31T23:40:19.759Z 200 POST /kdht/join/S91e1075d-da32-4d7d-bd46-3ab315162322/S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 1046 - 3.122 ms
375
- 2025-12-31T23:40:19.785Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 sending 1 signals
376
- 025-12-31T23:40:19.809Z 200 POST /kdht/join/S91e1075d-da32-4d7d-bd46-3ab315162322/S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 2 - 1.212 ms
377
- 2025-12-31T23:40:19.826Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 sending 11 signals
378
- 2025-12-31T23:40:19.862Z 200 POST /kdht/join/S91e1075d-da32-4d7d-bd46-3ab315162322/S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 2 - 4.434 ms
379
- 2025-12-31T23:40:20.395Z @S91e1075d-da32-4d7d-bd46-3ab315162322 ==> S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 ************** nothing new to send connecting ************************
380
-
381
-
382
- 2025-12-31T23:40:24.675Z S91e1075d-da32-4d7d-bd46-3ab315162322 **** connection timeout S19ca175f-150c-4c28-9e9d-f8ccf951c5c5 5003 status: connecting signaling: stable last signal: 4865 last send: 4849 last response: 4781 ****
383
-