Skip to content

Commit f8e4d8a

Browse files
committed
inverse correlation latency/size
1 parent fafff3d commit f8e4d8a

File tree

1 file changed

+80
-54
lines changed

1 file changed

+80
-54
lines changed

src/App.svelte

+80-54
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,56 @@
5757
});
5858
}
5959
60+
function parse30066(event) {
61+
const parsedTags = {};
62+
const url = event.tags.filter( tag => tag[0] == 'd')?.[0]?.[1]
63+
if(!url) return { error: "no d tag?" }
64+
const tags = event.tags.filter( tag => tag.length >= 3)
65+
tags.forEach(tag => {
66+
const [key, subkey, ...values] = tag;
67+
if (!parsedTags[key]) {
68+
parsedTags[key] = {};
69+
}
70+
if (!parsedTags[key][subkey]) {
71+
parsedTags[key][subkey] = values.length > 1 ? values.map(v => castValue(v)) : castValue(values[0]);
72+
}
73+
else {
74+
if (Array.isArray(parsedTags[key][subkey])) {
75+
parsedTags[key][subkey] = [...parsedTags[key][subkey], ...values.map(v => castValue(v))];
76+
}
77+
else {
78+
parsedTags[key][subkey] = [parsedTags[key][subkey], ...values.map(v => castValue(v))];
79+
}
80+
}
81+
});
82+
if(!parsedTags?.rtt?.open) return { error: "no rtt connect tag?", tags: tags }
83+
return { url, ...parsedTags};
84+
}
85+
86+
function castValue(value) {
87+
// Check for boolean strings
88+
if (value.toLowerCase() === 'true') return true;
89+
if (value.toLowerCase() === 'false') return false;
90+
91+
// Check for IPv4 addresses or similar patterns that should not be converted
92+
const ipv4Regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
93+
if (ipv4Regex.test(value)) return value;
94+
95+
// Additional check for geohash-like patterns (alphanumeric strings)
96+
// This regex matches strings that contain both letters and numbers, indicative of a geohash
97+
const geohashRegex = /^[0-9a-zA-Z]+$/;
98+
if (geohashRegex.test(value) && /[a-zA-Z]/.test(value) && /[0-9]/.test(value)) return value;
99+
100+
// Attempt to parse as a float
101+
const asFloat = parseFloat(value);
102+
if (!isNaN(asFloat) && isFinite(asFloat) && String(asFloat) === value) {
103+
return asFloat;
104+
}
105+
106+
// Return the original value if none of the above conditions are met
107+
return value;
108+
}
109+
60110
const connect = async () => {
61111
const relay = await Relay.connect('wss://history.nostr.watch').catch(connect);
62112
relay.subscribe(
@@ -111,18 +161,42 @@
111161
112162
function calculateDimensions(event) {
113163
// Default dimension and RTT scaling factor
114-
const defaultDimension = 50; // Base size of the block
164+
const defaultDimension = 150; // Base size of the block
115165
const rttScalingFactor = 0.05; // Determines how much RTT affects the size
116166
167+
// Max RTT value for scaling
168+
const maxRTT = 10000; // Example max value, adjust based on expected RTT range
169+
117170
// Check if the event has RTT data
118171
if (event.tags && Array.isArray(event.tags)) {
119-
const rttValues = event.tags.filter(tag => tag[0] === 'rtt').map(tag => parseInt(tag[2], 10));
120-
const totalRTT = rttValues.reduce((acc, rtt) => acc + rtt, 0);
121-
return defaultDimension + (totalRTT * rttScalingFactor);
172+
const rttValues = event.tags.filter(tag => tag[0] === 'rtt').map(tag => parseInt(tag[2], 10));
173+
const totalRTT = rttValues.reduce((acc, rtt) => acc + rtt, 0);
174+
175+
// Calculate the scaled dimension inversely related to RTT
176+
// Ensure that the totalRTT does not exceed maxRTT for calculation purposes
177+
const effectiveRTT = Math.min(totalRTT, maxRTT);
178+
179+
// Adjust the dimension based on RTT, making higher RTT result in smaller dimensions
180+
return defaultDimension - Math.min(effectiveRTT * rttScalingFactor, defaultDimension - 1);
122181
} else {
123-
return defaultDimension;
182+
return defaultDimension;
124183
}
125-
}
184+
}
185+
186+
// function calculateDimensions(event) {
187+
// // Default dimension and RTT scaling factor
188+
// const defaultDimension = 50; // Base size of the block
189+
// const rttScalingFactor = 0.05; // Determines how much RTT affects the size
190+
191+
// // Check if the event has RTT data
192+
// if (event.tags && Array.isArray(event.tags)) {
193+
// const rttValues = event.tags.filter(tag => tag[0] === 'rtt').map(tag => parseInt(tag[2], 10));
194+
// const totalRTT = rttValues.reduce((acc, rtt) => acc + rtt, 0);
195+
// return defaultDimension + (totalRTT * rttScalingFactor);
196+
// } else {
197+
// return defaultDimension;
198+
// }
199+
// }
126200
127201
function generateSaturatedColorFromTag(str) {
128202
let hash = 0;
@@ -170,55 +244,7 @@
170244
return color;
171245
}
172246
173-
function parse30066(event) {
174-
const parsedTags = {};
175-
const url = event.tags.filter( tag => tag[0] == 'd')?.[0]?.[1]
176-
if(!url) return { error: "no d tag?" }
177-
const tags = event.tags.filter( tag => tag.length >= 3)
178-
tags.forEach(tag => {
179-
const [key, subkey, ...values] = tag;
180-
if (!parsedTags[key]) {
181-
parsedTags[key] = {};
182-
}
183-
if (!parsedTags[key][subkey]) {
184-
parsedTags[key][subkey] = values.length > 1 ? values.map(v => castValue(v)) : castValue(values[0]);
185-
}
186-
else {
187-
if (Array.isArray(parsedTags[key][subkey])) {
188-
parsedTags[key][subkey] = [...parsedTags[key][subkey], ...values.map(v => castValue(v))];
189-
}
190-
else {
191-
parsedTags[key][subkey] = [parsedTags[key][subkey], ...values.map(v => castValue(v))];
192-
}
193-
}
194-
});
195-
if(!parsedTags?.rtt?.open) return { error: "no rtt connect tag?", tags: tags }
196-
return { url, ...parsedTags};
197-
}
198-
199-
function castValue(value) {
200-
// Check for boolean strings
201-
if (value.toLowerCase() === 'true') return true;
202-
if (value.toLowerCase() === 'false') return false;
203-
204-
// Check for IPv4 addresses or similar patterns that should not be converted
205-
const ipv4Regex = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
206-
if (ipv4Regex.test(value)) return value;
207-
208-
// Additional check for geohash-like patterns (alphanumeric strings)
209-
// This regex matches strings that contain both letters and numbers, indicative of a geohash
210-
const geohashRegex = /^[0-9a-zA-Z]+$/;
211-
if (geohashRegex.test(value) && /[a-zA-Z]/.test(value) && /[0-9]/.test(value)) return value;
212-
213-
// Attempt to parse as a float
214-
const asFloat = parseFloat(value);
215-
if (!isNaN(asFloat) && isFinite(asFloat) && String(asFloat) === value) {
216-
return asFloat;
217-
}
218247
219-
// Return the original value if none of the above conditions are met
220-
return value;
221-
}
222248
223249
224250

0 commit comments

Comments
 (0)