Compare commits

...

6 Commits

Author SHA1 Message Date
nym21 339c00d815 release: v0.0.52 2025-06-11 21:19:41 +02:00
nym21 ea6b4dcde2 websites: default: remove scrollToSelected 2025-06-11 21:19:22 +02:00
nym21 2b84623d1e release: v0.0.51 2025-06-11 21:09:07 +02:00
nym21 c8b3afa56b websites: default: fix sw adn co 2025-06-11 21:08:42 +02:00
nym21 1348f3c24c release: v0.0.50 2025-06-11 18:11:22 +02:00
nym21 62208ce3e1 websites: default: fix minBarSpacing 2025-06-11 18:11:11 +02:00
10 changed files with 144 additions and 120 deletions
Generated
+14 -14
View File
@@ -388,7 +388,7 @@ dependencies = [
[[package]]
name = "brk"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"brk_cli",
"brk_computer",
@@ -407,7 +407,7 @@ dependencies = [
[[package]]
name = "brk_cli"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"bitcoincore-rpc",
"brk_computer",
@@ -432,7 +432,7 @@ dependencies = [
[[package]]
name = "brk_computer"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"bitcoin",
"bitcoincore-rpc",
@@ -453,7 +453,7 @@ dependencies = [
[[package]]
name = "brk_core"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"bincode",
"bitcoin",
@@ -474,7 +474,7 @@ dependencies = [
[[package]]
name = "brk_exit"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"brk_logger",
"ctrlc",
@@ -483,7 +483,7 @@ dependencies = [
[[package]]
name = "brk_fetcher"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"brk_core",
"brk_logger",
@@ -496,7 +496,7 @@ dependencies = [
[[package]]
name = "brk_indexer"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"bitcoin",
"bitcoincore-rpc",
@@ -514,7 +514,7 @@ dependencies = [
[[package]]
name = "brk_logger"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"color-eyre",
"env_logger",
@@ -524,7 +524,7 @@ dependencies = [
[[package]]
name = "brk_parser"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"bitcoin",
"bitcoincore-rpc",
@@ -539,7 +539,7 @@ dependencies = [
[[package]]
name = "brk_query"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"brk_computer",
"brk_core",
@@ -557,7 +557,7 @@ dependencies = [
[[package]]
name = "brk_server"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"axum",
"bitcoincore-rpc",
@@ -586,7 +586,7 @@ dependencies = [
[[package]]
name = "brk_state"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"bincode",
"brk_core",
@@ -600,7 +600,7 @@ dependencies = [
[[package]]
name = "brk_store"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"arc-swap",
"brk_core",
@@ -610,7 +610,7 @@ dependencies = [
[[package]]
name = "brk_vec"
version = "0.0.49"
version = "0.0.52"
dependencies = [
"arc-swap",
"brk_core",
+14 -14
View File
@@ -4,7 +4,7 @@ members = ["crates/*"]
package.description = "The Bitcoin Research Kit is a suite of tools designed to extract, compute and display data stored on a Bitcoin Core node"
package.license = "MIT"
package.edition = "2024"
package.version = "0.0.49"
package.version = "0.0.52"
package.homepage = "https://bitcoinresearchkit.org"
package.repository = "https://github.com/bitcoinresearchkit/brk"
@@ -22,19 +22,19 @@ axum = "0.8.4"
bincode = { version = "2.0.1", features = ["serde"] }
bitcoin = { version = "0.32.6", features = ["serde"] }
bitcoincore-rpc = "0.19.0"
brk_cli = { version = "0.0.49", path = "crates/brk_cli" }
brk_computer = { version = "0.0.49", path = "crates/brk_computer" }
brk_core = { version = "0.0.49", path = "crates/brk_core" }
brk_exit = { version = "0.0.49", path = "crates/brk_exit" }
brk_fetcher = { version = "0.0.49", path = "crates/brk_fetcher" }
brk_indexer = { version = "0.0.49", path = "crates/brk_indexer" }
brk_logger = { version = "0.0.49", path = "crates/brk_logger" }
brk_parser = { version = "0.0.49", path = "crates/brk_parser" }
brk_query = { version = "0.0.49", path = "crates/brk_query" }
brk_server = { version = "0.0.49", path = "crates/brk_server" }
brk_state = { version = "0.0.49", path = "crates/brk_state" }
brk_store = { version = "0.0.49", path = "crates/brk_store" }
brk_vec = { version = "0.0.49", path = "crates/brk_vec" }
brk_cli = { version = "0.0.52", path = "crates/brk_cli" }
brk_computer = { version = "0.0.52", path = "crates/brk_computer" }
brk_core = { version = "0.0.52", path = "crates/brk_core" }
brk_exit = { version = "0.0.52", path = "crates/brk_exit" }
brk_fetcher = { version = "0.0.52", path = "crates/brk_fetcher" }
brk_indexer = { version = "0.0.52", path = "crates/brk_indexer" }
brk_logger = { version = "0.0.52", path = "crates/brk_logger" }
brk_parser = { version = "0.0.52", path = "crates/brk_parser" }
brk_query = { version = "0.0.52", path = "crates/brk_query" }
brk_server = { version = "0.0.52", path = "crates/brk_server" }
brk_state = { version = "0.0.52", path = "crates/brk_state" }
brk_store = { version = "0.0.52", path = "crates/brk_store" }
brk_vec = { version = "0.0.52", path = "crates/brk_vec" }
byteview = "=0.6.1"
clap = { version = "4.5.40", features = ["string"] }
clap_derive = "4.5.40"
+2 -2
View File
@@ -20,9 +20,9 @@ struct Cli {
#[derive(Subcommand, Debug)]
enum Commands {
/// Run the indexer, computer and server
/// Run the indexer, computer and server, use `run -h` for more information
Run(RunConfig),
/// Query generated datasets via the `run` command in a similar fashion as the server's API
/// Query generated datasets via the `run` command in a similar fashion as the server's API, use `query -h` for more information
Query(QueryArgs),
}
+16 -3
View File
@@ -1140,9 +1140,22 @@
window.document.documentElement.dataset.display = "standalone";
}
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/service-worker.js");
}
window.addEventListener("load", () => {
navigator.serviceWorker
.register("/service-worker.js")
.then((registration) => {
console.log(
"Service Worker registered with scope:",
registration.scope,
);
})
.catch((error) => {
console.error("Service Worker registration failed:", error);
});
});
// if ("serviceWorker" in navigator) {
// navigator.serviceWorker.register("/service-worker.js");
// }
</script>
<!-- --- -->
@@ -163,30 +163,30 @@ export default import("./v5.0.7-treeshaked/script.js").then((lc) => {
signals.createEffect(index, (index) => {
timeScaleSet = false;
const minBarSpacing =
index === /** @satisfies {MonthIndex} */ (7)
? 1
: index === /** @satisfies {QuarterIndex} */ (19)
? 3
: index === /** @satisfies {YearIndex} */ (23)
? 12
: index === /** @satisfies {DecadeIndex} */ (1)
? 120
: 0.5;
ichart.applyOptions({
timeScale: {
timeVisible:
index === /** @satisfies {Height} */ (5) ||
index === /** @satisfies {DifficultyEpoch} */ (2) ||
index === /** @satisfies {HalvingEpoch} */ (4),
...(!fitContent
? {
minBarSpacing,
}
: {}),
},
});
if (!fitContent) {
ichart.applyOptions({
timeScale: {
minBarSpacing:
index === /** @satisfies {MonthIndex} */ (7)
? 1
: index === /** @satisfies {QuarterIndex} */ (19)
? 3
: index === /** @satisfies {YearIndex} */ (23)
? 12
: index === /** @satisfies {DecadeIndex} */ (1)
? 120
: undefined,
},
});
}
});
const activeResources = /** @type {Set<VecResource>} */ (new Set());
@@ -377,13 +377,13 @@ export default import("./v5.0.7-treeshaked/script.js").then((lc) => {
const fetchedKey = vecsResources.defaultFetchedKey;
signals.createEffect(
() => [
timeResource.fetched[fetchedKey].vec(),
valuesResource.fetched[fetchedKey].vec(),
timeResource.fetched().get(fetchedKey)?.vec(),
valuesResource.fetched().get(fetchedKey)?.vec(),
],
([indexes, _ohlcs]) => {
if (!indexes || !_ohlcs) return;
if (!indexes?.length || !_ohlcs?.length) return;
const seriesData = series.inner.data();
// const seriesData = series.inner.data();
// const set = seriesData.length === 0;
const ohlcs = /** @type {OHLCTuple[]} */ (_ohlcs);
@@ -31,13 +31,13 @@ const importSignals = import("./v0.3.2-treeshaked/script.js").then(
if (dispose) {
dispose();
dispose = null;
console.debug("effectCount = ", --effectCount);
// console.log("effectCount = ", --effectCount);
}
}
// @ts-ignore
_signals.createEffect(compute, (v, oldV) => {
console.debug("effectCount = ", ++effectCount);
// console.log("effectCount = ", ++effectCount);
cleanup();
signals.createRoot((_dispose) => {
dispose = _dispose;
+53 -45
View File
@@ -1494,8 +1494,11 @@ function createVecsResources(signals, utils) {
return signals.runWithOwner(owner, () => {
/** @typedef {T extends number ? SingleValueData : CandlestickData} Value */
const fetchedRecord =
/** @type {Record<string, {loading: boolean, at: Date | null, vec: Signal<T[] | null>}>} */ ({});
const fetchedRecord = signals.createSignal(
/** @type {Map<string, {loading: boolean, at: Date | null, vec: Signal<T[] | null>}>} */ (
new Map()
),
);
return {
url: utils.api.genUrl(index, id, defaultFrom),
@@ -1513,12 +1516,18 @@ function createVecsResources(signals, utils) {
const from = args?.from ?? defaultFrom;
const to = args?.to ?? defaultTo;
const fetchedKey = genFetchedKey({ from, to });
fetchedRecord[fetchedKey] ??= {
loading: false,
at: null,
vec: signals.createSignal(/** @type {T[] | null} */ (null)),
};
const fetched = fetchedRecord[fetchedKey];
if (!fetchedRecord().has(fetchedKey)) {
fetchedRecord.set((map) => {
map.set(fetchedKey, {
loading: false,
at: null,
vec: signals.createSignal(/** @type {T[] | null} */ (null)),
});
return map;
});
}
const fetched = fetchedRecord().get(fetchedKey);
if (!fetched) throw Error("Unreachable");
if (fetched.loading) return fetched.vec();
if (fetched.at) {
const diff = new Date().getTime() - fetched.at.getTime();
@@ -1529,7 +1538,9 @@ function createVecsResources(signals, utils) {
const res = /** @type {T[] | null} */ (
await utils.api.fetchVec(
(values) => {
fetched.vec.set(/** @type {T[]} */ (values));
if (values.length || !fetched.vec()) {
fetched.vec.set(values);
}
},
index,
id,
@@ -2239,49 +2250,46 @@ function main() {
initSelected();
function initFolders() {
function initTreeElement() {
// async function scrollToSelected() {
// if (!options.selected()) throw "Selected should be set by now";
// const selectedId = options.selected().id;
// const path = options.selected().path;
// let i = 0;
// while (i !== path.length) {
// try {
// const id = path[i];
// const details = /** @type {HTMLDetailsElement} */ (
// utils.dom.getElementById(id)
// );
// details.open = true;
// i++;
// } catch {
// await utils.next();
// }
// }
// await utils.next();
// await utils.next();
// utils.dom
// .getElementById(`${selectedId}-nav-selector`)
// .scrollIntoView({
// behavior: "instant",
// block: "center",
// });
// }
utils.dom.onFirstIntersection(elements.nav, () => {
options.treeElement.set(() => {
const treeElement = window.document.createElement("div");
treeElement.classList.add("tree");
elements.nav.append(treeElement);
return treeElement;
});
}
async function scrollToSelected() {
if (!options.selected()) throw "Selected should be set by now";
const selectedId = options.selected().id;
const path = options.selected().path;
let i = 0;
while (i !== path.length) {
try {
const id = path[i];
const details = /** @type {HTMLDetailsElement} */ (
utils.dom.getElementById(id)
);
details.open = true;
i++;
} catch {
await utils.next();
}
}
await utils.next();
utils.dom
.getElementById(`${selectedId}-nav-selector`)
.scrollIntoView({
behavior: "instant",
block: "center",
});
}
utils.dom.onFirstIntersection(elements.nav, () => {
console.log("nav: init");
initTreeElement();
scrollToSelected();
// setTimeout(scrollToSelected, 10);
});
}
initFolders();
+1 -1
View File
@@ -3106,7 +3106,7 @@ export function initOptions({
summary.append(supCount);
signals.createEffect(childOptionsCount, (childOptionsCount) => {
supCount.innerHTML = childOptionsCount.toLocaleString();
supCount.innerHTML = childOptionsCount.toLocaleString("en-us");
});
details.addEventListener("toggle", () => {
+17 -14
View File
@@ -305,22 +305,25 @@ function createTable({
return l;
});
signals.createEffect(vec.fetched[fetchedKey].vec, (vec) => {
if (!vec) return;
signals.createEffect(
() => vec.fetched().get(fetchedKey)?.vec(),
(vec) => {
if (!vec?.length) return;
const thIndex = colIndex() + 1;
const thIndex = colIndex() + 1;
for (let i = 0; i < rowElements.length; i++) {
const iRev = vec.length - 1 - i;
const value = vec[iRev];
// @ts-ignore
rowElements[i].childNodes[thIndex].innerHTML =
serializeValue({
value,
unit,
});
}
});
for (let i = 0; i < rowElements.length; i++) {
const iRev = vec.length - 1 - i;
const value = vec[iRev];
// @ts-ignore
rowElements[i].childNodes[thIndex].innerHTML =
serializeValue({
value,
unit,
});
}
},
);
return () => vecId;
},
+5 -5
View File
@@ -10,7 +10,7 @@ sw.addEventListener("install", (event) => {
sw.addEventListener("activate", (event) => {
console.log("sw: active");
event.waitUntil(sw.clients.claim());
sw.clients.claim();
event.waitUntil(
caches
.keys()
@@ -42,6 +42,8 @@ sw.addEventListener("fetch", (event) => {
return; // let the browser handle it
}
const cache = caches.open(CACHE_NAME);
// 2) NAVIGATION: networkfirst on your shell
if (req.mode === "navigate") {
event.respondWith(
@@ -52,9 +54,7 @@ sw.addEventListener("fetch", (event) => {
if (response.ok || response.status === 304) {
if (response.ok) {
const clone = response.clone();
caches
.open(CACHE_NAME)
.then((cache) => cache.put("/index.html", clone));
cache.then((cache) => cache.put("/index.html", clone));
}
return response;
}
@@ -72,7 +72,7 @@ sw.addEventListener("fetch", (event) => {
.then((response) => {
if (response.ok) {
const clone = response.clone();
caches.open(CACHE_NAME).then((cache) => cache.put(req, clone));
cache.then((cache) => cache.put(req, clone));
}
return response;
})