global: snapshot

This commit is contained in:
nym21
2025-05-28 16:53:18 +02:00
parent 9bbf3a027f
commit 99818924ee
32 changed files with 171 additions and 129 deletions

15
Cargo.lock generated
View File

@@ -393,6 +393,7 @@ dependencies = [
"brk_parser",
"brk_query",
"brk_server",
"brk_state",
"brk_store",
"brk_vec",
]
@@ -434,6 +435,7 @@ dependencies = [
"brk_indexer",
"brk_logger",
"brk_parser",
"brk_state",
"brk_vec",
"clap",
"clap_derive",
@@ -583,6 +585,19 @@ dependencies = [
"zip",
]
[[package]]
name = "brk_state"
version = "0.0.40"
dependencies = [
"brk_core",
"brk_store",
"brk_vec",
"rayon",
"serde",
"zerocopy",
"zerocopy-derive",
]
[[package]]
name = "brk_store"
version = "0.0.40"

View File

@@ -29,6 +29,7 @@ brk_logger = { version = "0", path = "crates/brk_logger" }
brk_parser = { version = "0", path = "crates/brk_parser" }
brk_query = { version = "0", path = "crates/brk_query" }
brk_server = { version = "0", path = "crates/brk_server" }
brk_state = { version = "0", path = "crates/brk_state" }
brk_store = { version = "0", path = "crates/brk_store" }
brk_vec = { version = "0", path = "crates/brk_vec" }
byteview = "0.7.0"

View File

@@ -18,6 +18,7 @@ full = [
"parser",
"query",
"server",
"state",
"store",
"vec",
]
@@ -30,6 +31,7 @@ logger = ["brk_logger"]
parser = ["brk_parser"]
query = ["brk_query"]
server = ["brk_server"]
state = ["brk_state"]
store = ["brk_store"]
vec = ["brk_vec"]
@@ -44,6 +46,7 @@ brk_logger = { workspace = true, optional = true }
brk_parser = { workspace = true, optional = true }
brk_query = { workspace = true, optional = true }
brk_server = { workspace = true, optional = true }
brk_state = { workspace = true, optional = true }
brk_store = { workspace = true, optional = true }
brk_vec = { workspace = true, optional = true }

View File

@@ -36,6 +36,10 @@ pub use brk_query as query;
#[doc(inline)]
pub use brk_server as server;
#[cfg(feature = "state")]
#[doc(inline)]
pub use brk_state as state;
#[cfg(feature = "store")]
#[doc(inline)]
pub use brk_store as store;

View File

@@ -15,6 +15,7 @@ brk_fetcher = { workspace = true }
brk_indexer = { workspace = true }
brk_logger = { workspace = true }
brk_parser = { workspace = true }
brk_state = { workspace = true }
brk_vec = { workspace = true }
clap = { workspace = true }
clap_derive = { workspace = true }

View File

@@ -11,7 +11,6 @@ use brk_fetcher::Fetcher;
use brk_indexer::Indexer;
use brk_vec::{AnyCollectableVec, Compressed, Computation};
mod states;
mod stores;
mod utils;
mod vecs;

View File

@@ -5,18 +5,16 @@ use brk_core::{
};
use brk_exit::Exit;
use brk_indexer::Indexer;
use brk_state::{CohortState, RealizedState};
use brk_vec::{AnyCollectableVec, AnyVec, Compressed, Computation, EagerVec, VecIterator};
use crate::{
states::{CohortState, RealizedState},
vecs::{
Indexes, fetched,
grouped::{
ComputedRatioVecsFromDateIndex, ComputedValueVecsFromHeight, ComputedVecsFromHeight,
StorableVecGeneatorOptions,
},
indexes,
use crate::vecs::{
Indexes, fetched,
grouped::{
ComputedRatioVecsFromDateIndex, ComputedValueVecsFromHeight, ComputedVecsFromHeight,
StorableVecGeneatorOptions,
},
indexes,
};
const VERSION: Version = Version::ZERO;

View File

@@ -8,9 +8,10 @@ use brk_vec::{
GenericStoredVec, StoredIndex, StoredVec, UnsafeSlice, VecIterator,
};
use log::info;
use outputs::OutputCohorts;
use rayon::prelude::*;
use crate::states::{
use brk_state::{
BlockState, OutputFilter, Outputs, OutputsByEpoch, OutputsByFrom, OutputsByRange,
OutputsBySize, OutputsBySpendableType, OutputsByTerm, OutputsByUpTo, SupplyState, Transacted,
};
@@ -22,6 +23,7 @@ use super::{
};
pub mod cohort;
mod outputs;
const VERSION: Version = Version::ZERO;
const BYSIZE_VERSION: Version = Version::ONE;

View File

@@ -1,69 +1,20 @@
use brk_vec::StoredIndex;
use rayon::prelude::*;
use std::{collections::BTreeMap, ops::ControlFlow};
use brk_core::{CheckedSub, Dollars, HalvingEpoch, Height, Timestamp};
use brk_state::{BlockState, OutputFilter, Outputs, Transacted};
use brk_vec::StoredIndex;
use rayon::prelude::*;
mod by_epoch;
mod by_from;
mod by_range;
mod by_size;
mod by_spendable_type;
mod by_term;
mod by_type;
mod by_unspendable_type;
mod by_up_to;
// mod by_value;
mod filter;
use super::cohort;
pub use by_epoch::*;
pub use by_from::*;
pub use by_range::*;
pub use by_size::*;
pub use by_spendable_type::*;
pub use by_term::*;
pub use by_type::*;
pub use by_unspendable_type::*;
pub use by_up_to::*;
// pub use by_value::*;
pub use filter::*;
use crate::vecs;
use super::{BlockState, Transacted};
#[derive(Default, Clone)]
pub struct Outputs<T> {
pub all: T,
pub by_term: OutputsByTerm<T>,
pub by_up_to: OutputsByUpTo<T>,
pub by_from: OutputsByFrom<T>,
pub by_range: OutputsByRange<T>,
pub by_epoch: OutputsByEpoch<T>,
pub by_type: OutputsBySpendableType<T>,
pub by_size: OutputsBySize<T>,
// // Needs whole UTXO set, TODO later
// // pub by_value: OutputsByValue<T>,
pub trait OutputCohorts {
fn tick_tock_next_block(&mut self, chain_state: &[BlockState], timestamp: Timestamp);
fn send(&mut self, height_to_sent: BTreeMap<Height, Transacted>, chain_state: &[BlockState]);
fn receive(&mut self, received: Transacted, height: Height, price: Option<Dollars>);
}
impl<T> Outputs<T> {
pub fn as_mut_vec(&mut self) -> Vec<&mut T> {
[&mut self.all]
.into_iter()
.chain(self.by_term.as_mut_vec())
.chain(self.by_up_to.as_mut_vec())
.chain(self.by_from.as_mut_vec())
.chain(self.by_range.as_mut_vec())
.chain(self.by_epoch.as_mut_vec())
.chain(self.by_size.as_mut_vec())
.chain(self.by_type.as_mut_vec())
// // .chain(self.by_value.as_mut_vec())
.collect::<Vec<_>>()
}
}
impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> {
pub fn tick_tock_next_block(&mut self, chain_state: &[BlockState], timestamp: Timestamp) {
impl OutputCohorts for Outputs<(OutputFilter, cohort::Vecs)> {
fn tick_tock_next_block(&mut self, chain_state: &[BlockState], timestamp: Timestamp) {
if chain_state.is_empty() {
return;
}
@@ -117,11 +68,7 @@ impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> {
});
}
pub fn send(
&mut self,
height_to_sent: BTreeMap<Height, Transacted>,
chain_state: &[BlockState],
) {
fn send(&mut self, height_to_sent: BTreeMap<Height, Transacted>, chain_state: &[BlockState]) {
let mut time_based_vecs = self
.by_term
.as_mut_vec()
@@ -195,7 +142,7 @@ impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> {
});
}
pub fn receive(&mut self, received: Transacted, height: Height, price: Option<Dollars>) {
fn receive(&mut self, received: Transacted, height: Height, price: Option<Dollars>) {
let supply_state = received.spendable_supply;
[
@@ -233,36 +180,3 @@ impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> {
});
}
}
impl<T> Outputs<(OutputFilter, T)> {
pub fn vecs(&self) -> Vec<&T> {
[&self.all.1]
.into_iter()
.chain(self.by_term.vecs())
.chain(self.by_up_to.vecs())
.chain(self.by_from.vecs())
.chain(self.by_range.vecs())
.chain(self.by_epoch.vecs())
.chain(self.by_size.vecs())
// // .chain(self.by_value.vecs())
.chain(self.by_type.vecs())
.collect::<Vec<_>>()
}
}
impl<T> From<Outputs<T>> for Outputs<(OutputFilter, T)> {
fn from(value: Outputs<T>) -> Self {
Self {
all: (OutputFilter::All, value.all),
by_term: OutputsByTerm::from(value.by_term),
by_up_to: OutputsByUpTo::from(value.by_up_to),
by_from: OutputsByFrom::from(value.by_from),
by_range: OutputsByRange::from(value.by_range),
by_epoch: OutputsByEpoch::from(value.by_epoch),
by_size: OutputsBySize::from(value.by_size),
// // Needs whole UTXO set, TODO later
// // by_value: OutputsByValue<T>,
by_type: OutputsBySpendableType::from(value.by_type),
}
}
}

View File

@@ -0,0 +1,16 @@
[package]
name = "brk_state"
description = "States used primarily by the computer"
version.workspace = true
edition.workspace = true
license.workspace = true
repository.workspace = true
[dependencies]
brk_core = { workspace = true }
brk_vec = { workspace = true }
brk_store = { workspace = true }
rayon = { workspace = true }
serde = { workspace = true }
zerocopy = { workspace = true }
zerocopy-derive = { workspace = true }

View File

@@ -0,0 +1,86 @@
mod by_epoch;
mod by_from;
mod by_range;
mod by_size;
mod by_spendable_type;
mod by_term;
mod by_type;
mod by_unspendable_type;
mod by_up_to;
// mod by_value;
mod filter;
pub use by_epoch::*;
pub use by_from::*;
pub use by_range::*;
pub use by_size::*;
pub use by_spendable_type::*;
pub use by_term::*;
pub use by_type::*;
pub use by_unspendable_type::*;
pub use by_up_to::*;
// pub use by_value::*;
pub use filter::*;
#[derive(Default, Clone)]
pub struct Outputs<T> {
pub all: T,
pub by_term: OutputsByTerm<T>,
pub by_up_to: OutputsByUpTo<T>,
pub by_from: OutputsByFrom<T>,
pub by_range: OutputsByRange<T>,
pub by_epoch: OutputsByEpoch<T>,
pub by_type: OutputsBySpendableType<T>,
pub by_size: OutputsBySize<T>,
// // Needs whole UTXO set, TODO later
// // pub by_value: OutputsByValue<T>,
}
impl<T> Outputs<T> {
pub fn as_mut_vec(&mut self) -> Vec<&mut T> {
[&mut self.all]
.into_iter()
.chain(self.by_term.as_mut_vec())
.chain(self.by_up_to.as_mut_vec())
.chain(self.by_from.as_mut_vec())
.chain(self.by_range.as_mut_vec())
.chain(self.by_epoch.as_mut_vec())
.chain(self.by_size.as_mut_vec())
.chain(self.by_type.as_mut_vec())
// // .chain(self.by_value.as_mut_vec())
.collect::<Vec<_>>()
}
}
impl<T> Outputs<(OutputFilter, T)> {
pub fn vecs(&self) -> Vec<&T> {
[&self.all.1]
.into_iter()
.chain(self.by_term.vecs())
.chain(self.by_up_to.vecs())
.chain(self.by_from.vecs())
.chain(self.by_range.vecs())
.chain(self.by_epoch.vecs())
.chain(self.by_size.vecs())
// // .chain(self.by_value.vecs())
.chain(self.by_type.vecs())
.collect::<Vec<_>>()
}
}
impl<T> From<Outputs<T>> for Outputs<(OutputFilter, T)> {
fn from(value: Outputs<T>) -> Self {
Self {
all: (OutputFilter::All, value.all),
by_term: OutputsByTerm::from(value.by_term),
by_up_to: OutputsByUpTo::from(value.by_up_to),
by_from: OutputsByFrom::from(value.by_from),
by_range: OutputsByRange::from(value.by_range),
by_epoch: OutputsByEpoch::from(value.by_epoch),
by_size: OutputsBySize::from(value.by_size),
// // Needs whole UTXO set, TODO later
// // by_value: OutputsByValue<T>,
by_type: OutputsBySpendableType::from(value.by_type),
}
}
}

View File

@@ -875,9 +875,9 @@ function createPartialOptions(colors) {
}
/**
* @typedef {"-ratio"} RatioCapSuffix
* @typedef {EndsWith<RatioCapSuffix>} VecIdRatioCap
* @typedef {WithoutSuffix<VecIdRatioCap, RatioCapSuffix>} VecIdRatioCapBase
* @typedef {"-ratio-zscore"} RatioZScoreCapSuffix
* @typedef {EndsWith<RatioZScoreCapSuffix>} VecIdRatioZScoreCap
* @typedef {WithoutSuffix<VecIdRatioZScoreCap, RatioZScoreCapSuffix>} VecIdRatioZScoreCapBase
*/
/**
@@ -886,7 +886,7 @@ function createPartialOptions(colors) {
* @param {string} args.name
* @param {string} args.legend
* @param {string} args.title
* @param {VecIdRatioCapBase} args.key
* @param {VecIdRatioZScoreCapBase} args.key
* @param {Color} [args.color]
*/
function createPriceWithRatio({ name, title, legend, key, color }) {
@@ -1230,7 +1230,7 @@ function createPartialOptions(colors) {
color: useGroupName ? color : colors.green,
}),
createBaseSeries({
key: `${key}realized-profit-sum`,
key: `${key}realized-profit`,
name: useGroupName ? name : "Profit",
color: useGroupName ? color : colors.green,
}),
@@ -1249,7 +1249,7 @@ function createPartialOptions(colors) {
color: useGroupName ? color : colors.red,
}),
createBaseSeries({
key: `${key}realized-loss-sum`,
key: `${key}realized-loss`,
name: useGroupName ? name : "Loss",
color: useGroupName ? color : colors.red,
}),

View File

@@ -1,23 +1,19 @@
const version = "v1";
self.addEventListener("install", (_event) => {
/** @type {ServiceWorkerGlobalScope} */
const sw = /** @type {any} */ (self);
sw.addEventListener("install", (_event) => {
console.log("sw: install");
// The worker skips waiting and becomes active immediately
self.skipWaiting();
sw.skipWaiting();
});
self.addEventListener("activate", (event) => {
sw.addEventListener("activate", (event) => {
console.log("sw: active");
event.waitUntil(
// Claim clients, so the SW starts controlling pages immediately
self.clients.claim(),
);
event.waitUntil(sw.clients.claim());
});
self.addEventListener("fetch", (_event) => {
const event = /** @type {any} */ (_event);
/** @type {Request} */
sw.addEventListener("fetch", (event) => {
let request = event.request;
const method = request.method;
let url = request.url;
@@ -67,7 +63,13 @@ self.addEventListener("fetch", (_event) => {
.catch(() => {
console.log("service-worker: offline");
return cachedResponse;
return (
cachedResponse ||
new Response("Offline", {
status: 503,
statusText: "Service Unavailable",
})
);
});
}),
);

View File

@@ -4,7 +4,8 @@
"strict": true,
"target": "ESNext",
"module": "ESNext",
"outDir": "/tmp/kibo"
"outDir": "/tmp/kibo",
"lib": ["DOM", "DOM.Iterable", "ESNext", "WebWorker"]
},
"exclude": ["assets", "packages", "ignore"]
}