mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-06-26 06:04:29 -07:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 339c00d815 | |||
| ea6b4dcde2 | |||
| 2b84623d1e | |||
| c8b3afa56b | |||
| 1348f3c24c | |||
| 62208ce3e1 |
Generated
+14
-14
@@ -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
@@ -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"
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
|
||||
@@ -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: network‐first 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;
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user