@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 +3 -3
- package/dht/nodeUtilities.js +1 -1
- package/package.json +1 -1
- package/portals/node.js +0 -1
- package/spec/bots.js +7 -6
- package/spec/dhtInternalsSpec.js +7 -7
- package/spec/portal.js +1 -0
- package/transports/contact.js +1 -0
- package/transports/webrtc.js +1 -1
- package/#notes.txt# +0 -383
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
|
|
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');
|
package/dht/nodeUtilities.js
CHANGED
|
@@ -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
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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));
|
package/spec/dhtInternalsSpec.js
CHANGED
|
@@ -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);
|
package/transports/contact.js
CHANGED
|
@@ -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)));
|
package/transports/webrtc.js
CHANGED
|
@@ -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 ||
|
|
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
|
-
|