bitview: reorg part 5

This commit is contained in:
nym21
2025-09-26 00:04:14 +02:00
parent 0d5b792c57
commit dfe5148f17
21 changed files with 769 additions and 810 deletions

69
Cargo.lock generated
View File

@@ -182,9 +182,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]] [[package]]
name = "async-compression" name = "async-compression"
version = "0.4.30" version = "0.4.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" checksum = "9611ec0b6acea03372540509035db2f7f1e9f04da5d27728436fa994033c00a0"
dependencies = [ dependencies = [
"compression-codecs", "compression-codecs",
"compression-core", "compression-core",
@@ -656,6 +656,7 @@ dependencies = [
"brk_interface", "brk_interface",
"brk_rmcp", "brk_rmcp",
"log", "log",
"serde_json",
] ]
[[package]] [[package]]
@@ -674,9 +675,9 @@ dependencies = [
[[package]] [[package]]
name = "brk_rmcp" name = "brk_rmcp"
version = "0.6.0" version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5788307976c7fbc3b549b56c70fd6b1893d609e08e82d470d6938b748742cf54" checksum = "ac54fb0335b049bce158a31900681dd6b328d5cd3640e76c478c1067eb50fc79"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"brk_rmcp-macros", "brk_rmcp-macros",
@@ -704,9 +705,9 @@ dependencies = [
[[package]] [[package]]
name = "brk_rmcp-macros" name = "brk_rmcp-macros"
version = "0.6.0" version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b49ac541e14b18e43696144176faeabc547ce198cb10d575c13fcc6245d337c" checksum = "241b6c6ee464ae951e152122567e4fd5e4443ee1ed484bd575530de3afb72f99"
dependencies = [ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
@@ -1560,12 +1561,12 @@ dependencies = [
[[package]] [[package]]
name = "deranged" name = "deranged"
version = "0.5.3" version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071"
dependencies = [ dependencies = [
"powerfmt", "powerfmt",
"serde", "serde_core",
] ]
[[package]] [[package]]
@@ -2475,14 +2476,23 @@ dependencies = [
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.80" version = "0.3.81"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305"
dependencies = [ dependencies = [
"once_cell", "once_cell",
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "json-escape-simd"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a1f7d5786a4cb0f4e0f862b562a0e085b5bfa23a4f0dc05e7b823ed4e4d791f"
dependencies = [
"anyhow",
]
[[package]] [[package]]
name = "json-strip-comments" name = "json-strip-comments"
version = "3.0.1" version = "3.0.1"
@@ -2532,9 +2542,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.175" version = "0.2.176"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174"
[[package]] [[package]]
name = "libredox" name = "libredox"
@@ -3193,9 +3203,9 @@ dependencies = [
[[package]] [[package]]
name = "oxc_resolver" name = "oxc_resolver"
version = "11.8.2" version = "11.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49c4a4d746f42bac28538163952aa66da2f0ea781a0708772d8ad3f6fc066963" checksum = "c553f3d6a88eb57513b4bb6b8387ab71c7701721ecd242b673ffeb3dc99cfd08"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"indexmap 2.11.4", "indexmap 2.11.4",
@@ -3238,11 +3248,12 @@ dependencies = [
[[package]] [[package]]
name = "oxc_sourcemap" name = "oxc_sourcemap"
version = "4.1.2" version = "4.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87a91923e9269b32c91cd956596f9c3bd24b60a89df5c815abb2812a0ffa8b7b" checksum = "f6194c58467a15d9dcb5cb852fcad312af57fd46fabd419fae87fcf801f83702"
dependencies = [ dependencies = [
"base64-simd", "base64-simd",
"json-escape-simd",
"rustc-hash", "rustc-hash",
"serde", "serde",
"serde_json", "serde_json",
@@ -4502,9 +4513,9 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.22.0" version = "3.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
dependencies = [ dependencies = [
"fastrand", "fastrand",
"getrandom 0.3.3", "getrandom 0.3.3",
@@ -5131,9 +5142,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.103" version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell", "once_cell",
@@ -5144,9 +5155,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.103" version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"log", "log",
@@ -5158,9 +5169,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.103" version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119"
dependencies = [ dependencies = [
"quote", "quote",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@@ -5168,9 +5179,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.103" version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -5181,9 +5192,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.103" version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]

View File

@@ -29,7 +29,7 @@ impl Bridge for Interface<'static> {
fs::create_dir_all(&path)?; fs::create_dir_all(&path)?;
generate_vecs_file(self, &path)?; generate_metrics_file(self, &path)?;
generate_pools_file(&path) generate_pools_file(&path)
} }
} }
@@ -70,8 +70,8 @@ return /** @type {const} */ ({
fs::write(path, contents) fs::write(path, contents)
} }
fn generate_vecs_file(interface: &Interface<'static>, parent: &Path) -> io::Result<()> { fn generate_metrics_file(interface: &Interface<'static>, parent: &Path) -> io::Result<()> {
let path = parent.join(Path::new("vecs.js")); let path = parent.join(Path::new("metrics.js"));
let indexes = Index::all(); let indexes = Index::all();

View File

@@ -12,8 +12,9 @@ build = "build.rs"
[dependencies] [dependencies]
axum = { workspace = true } axum = { workspace = true }
brk_interface = { workspace = true } brk_interface = { workspace = true }
log = { workspace = true } brk_rmcp = { version = "0.7.1", features = [
brk_rmcp = { version = "0.6.0", features = [
"transport-worker", "transport-worker",
"transport-streamable-http-server", "transport-streamable-http-server",
] } ] }
log = { workspace = true }
serde_json = { workspace = true }

View File

@@ -3,7 +3,7 @@
use brk_interface::{IdParam, Interface, PaginatedIndexParam, PaginationParam, Params}; use brk_interface::{IdParam, Interface, PaginatedIndexParam, PaginationParam, Params};
use brk_rmcp::{ use brk_rmcp::{
ErrorData as McpError, RoleServer, ServerHandler, ErrorData as McpError, RoleServer, ServerHandler,
handler::server::{router::tool::ToolRouter, tool::Parameters}, handler::server::{router::tool::ToolRouter, wrapper::Parameters},
model::*, model::*,
service::RequestContext, service::RequestContext,
tool, tool_handler, tool_router, tool, tool_handler, tool_router,

View File

@@ -1,4 +1,4 @@
/** @import { IChartApi, ISeriesApi as _ISeriesApi, SeriesDefinition, SingleValueData as _SingleValueData, CandlestickData as _CandlestickData, BaselineData as _BaselineData, HistogramData as _HistogramData, SeriesType, IPaneApi, LineSeriesPartialOptions as _LineSeriesPartialOptions, HistogramSeriesPartialOptions as _HistogramSeriesPartialOptions, BaselineSeriesPartialOptions as _BaselineSeriesPartialOptions, CandlestickSeriesPartialOptions as _CandlestickSeriesPartialOptions, WhitespaceData, DeepPartial, ChartOptions, Time, LineData as _LineData } from '../packages/lightweight-charts/5.0.8/dist/typings' */ /** @import { IChartApi, ISeriesApi as _ISeriesApi, SeriesDefinition, SingleValueData as _SingleValueData, CandlestickData as _CandlestickData, BaselineData as _BaselineData, HistogramData as _HistogramData, SeriesType, IPaneApi, LineSeriesPartialOptions as _LineSeriesPartialOptions, HistogramSeriesPartialOptions as _HistogramSeriesPartialOptions, BaselineSeriesPartialOptions as _BaselineSeriesPartialOptions, CandlestickSeriesPartialOptions as _CandlestickSeriesPartialOptions, WhitespaceData, DeepPartial, ChartOptions, Time, LineData as _LineData } from '../../packages/lightweight-charts/5.0.8/dist/typings' */
import { import {
createChart, createChart,
@@ -7,20 +7,18 @@ import {
LineSeries, LineSeries,
BaselineSeries, BaselineSeries,
// } from "../packages/lightweight-charts/5.0.8/dist/lightweight-charts.standalone.development.mjs"; // } from "../packages/lightweight-charts/5.0.8/dist/lightweight-charts.standalone.development.mjs";
} from "../packages/lightweight-charts/5.0.8/dist/lightweight-charts.standalone.production.mjs"; } from "../../packages/lightweight-charts/5.0.8/dist/lightweight-charts.standalone.production.mjs";
import { import {
createHorizontalChoiceField, createHorizontalChoiceField,
createLabeledInput, createLabeledInput,
createSpanName, createSpanName,
} from "./dom"; } from "../dom";
import { createOklchToRGBA } from "./colors"; import { createOklchToRGBA } from "./oklch";
import { throttle } from "./timing"; import { throttle } from "../timing";
import { serdeBool } from "./serde"; import { serdeBool } from "../serde";
/** /**
* @typedef {[number, number, number, number]} OHLCTuple
*
* @typedef {Object} Valued * @typedef {Object} Valued
* @property {number} value * @property {number} value
* *
@@ -1003,7 +1001,7 @@ function numberToShortUSFormat(value, digits) {
return numberToUSFormat(value, Math.min(1, digits || 10)); return numberToUSFormat(value, Math.min(1, digits || 10));
} else if (absoluteValue < 1_000_000) { } else if (absoluteValue < 1_000_000) {
return numberToUSFormat(value, 0); return numberToUSFormat(value, 0);
} else if (absoluteValue >= 900_000_000_000_000_000_000_000) { } else if (absoluteValue >= 1_000_000_000_000_000_000_000) {
return "Inf."; return "Inf.";
} }
@@ -1015,11 +1013,6 @@ function numberToShortUSFormat(value, digits) {
const modulused = log % 3; const modulused = log % 3;
// return `${numberToUSFormat(
// value / (1_000_000 * 1_000 ** letterIndex),
// 3,
// )}${letter}`;
if (modulused === 0) { if (modulused === 0) {
return `${numberToUSFormat( return `${numberToUSFormat(
value / (1_000_000 * 1_000 ** letterIndex), value / (1_000_000 * 1_000 ** letterIndex),

View File

@@ -0,0 +1,100 @@
export function createOklchToRGBA() {
{
/**
*
* @param {readonly [number, number, number, number, number, number, number, number, number]} A
* @param {readonly [number, number, number]} B
* @returns
*/
function multiplyMatrices(A, B) {
return /** @type {const} */ ([
A[0] * B[0] + A[1] * B[1] + A[2] * B[2],
A[3] * B[0] + A[4] * B[1] + A[5] * B[2],
A[6] * B[0] + A[7] * B[1] + A[8] * B[2],
]);
}
/**
* @param {readonly [number, number, number]} param0
*/
function oklch2oklab([l, c, h]) {
return /** @type {const} */ ([
l,
isNaN(h) ? 0 : c * Math.cos((h * Math.PI) / 180),
isNaN(h) ? 0 : c * Math.sin((h * Math.PI) / 180),
]);
}
/**
* @param {readonly [number, number, number]} rgb
*/
function srgbLinear2rgb(rgb) {
return rgb.map((c) =>
Math.abs(c) > 0.0031308
? (c < 0 ? -1 : 1) * (1.055 * Math.abs(c) ** (1 / 2.4) - 0.055)
: 12.92 * c,
);
}
/**
* @param {readonly [number, number, number]} lab
*/
function oklab2xyz(lab) {
const LMSg = multiplyMatrices(
/** @type {const} */ ([
1, 0.3963377773761749, 0.2158037573099136, 1, -0.1055613458156586,
-0.0638541728258133, 1, -0.0894841775298119, -1.2914855480194092,
]),
lab,
);
const LMS = /** @type {[number, number, number]} */ (
LMSg.map((val) => val ** 3)
);
return multiplyMatrices(
/** @type {const} */ ([
1.2268798758459243, -0.5578149944602171, 0.2813910456659647,
-0.0405757452148008, 1.112286803280317, -0.0717110580655164,
-0.0763729366746601, -0.4214933324022432, 1.5869240198367816,
]),
LMS,
);
}
/**
* @param {readonly [number, number, number]} xyz
*/
function xyz2rgbLinear(xyz) {
return multiplyMatrices(
[
3.2409699419045226, -1.537383177570094, -0.4986107602930034,
-0.9692436362808796, 1.8759675015077202, 0.04155505740717559,
0.05563007969699366, -0.20397695888897652, 1.0569715142428786,
],
xyz,
);
}
/** @param {string} oklch */
return function (oklch) {
oklch = oklch.replace("oklch(", "");
oklch = oklch.replace(")", "");
let splitOklch = oklch.split(" / ");
let alpha = 1;
if (splitOklch.length === 2) {
alpha = Number(splitOklch.pop()?.replace("%", "")) / 100;
}
splitOklch = oklch.split(" ");
const lch = splitOklch.map((v, i) => {
if (!i && v.includes("%")) {
return Number(v.replace("%", "")) / 100;
} else {
return Number(v);
}
});
const rgb = srgbLinear2rgb(
xyz2rgbLinear(
oklab2xyz(oklch2oklab(/** @type {[number, number, number]} */ (lch))),
),
).map((v) => {
return Math.max(Math.min(Math.round(v * 255), 255), 0);
});
return [...rgb, alpha];
};
}
}

View File

@@ -114,104 +114,3 @@ export function createColors(dark) {
* @typedef {Colors["orange"]} Color * @typedef {Colors["orange"]} Color
* @typedef {keyof Colors} ColorName * @typedef {keyof Colors} ColorName
*/ */
export function createOklchToRGBA() {
{
/**
*
* @param {readonly [number, number, number, number, number, number, number, number, number]} A
* @param {readonly [number, number, number]} B
* @returns
*/
function multiplyMatrices(A, B) {
return /** @type {const} */ ([
A[0] * B[0] + A[1] * B[1] + A[2] * B[2],
A[3] * B[0] + A[4] * B[1] + A[5] * B[2],
A[6] * B[0] + A[7] * B[1] + A[8] * B[2],
]);
}
/**
* @param {readonly [number, number, number]} param0
*/
function oklch2oklab([l, c, h]) {
return /** @type {const} */ ([
l,
isNaN(h) ? 0 : c * Math.cos((h * Math.PI) / 180),
isNaN(h) ? 0 : c * Math.sin((h * Math.PI) / 180),
]);
}
/**
* @param {readonly [number, number, number]} rgb
*/
function srgbLinear2rgb(rgb) {
return rgb.map((c) =>
Math.abs(c) > 0.0031308
? (c < 0 ? -1 : 1) * (1.055 * Math.abs(c) ** (1 / 2.4) - 0.055)
: 12.92 * c,
);
}
/**
* @param {readonly [number, number, number]} lab
*/
function oklab2xyz(lab) {
const LMSg = multiplyMatrices(
/** @type {const} */ ([
1, 0.3963377773761749, 0.2158037573099136, 1, -0.1055613458156586,
-0.0638541728258133, 1, -0.0894841775298119, -1.2914855480194092,
]),
lab,
);
const LMS = /** @type {[number, number, number]} */ (
LMSg.map((val) => val ** 3)
);
return multiplyMatrices(
/** @type {const} */ ([
1.2268798758459243, -0.5578149944602171, 0.2813910456659647,
-0.0405757452148008, 1.112286803280317, -0.0717110580655164,
-0.0763729366746601, -0.4214933324022432, 1.5869240198367816,
]),
LMS,
);
}
/**
* @param {readonly [number, number, number]} xyz
*/
function xyz2rgbLinear(xyz) {
return multiplyMatrices(
[
3.2409699419045226, -1.537383177570094, -0.4986107602930034,
-0.9692436362808796, 1.8759675015077202, 0.04155505740717559,
0.05563007969699366, -0.20397695888897652, 1.0569715142428786,
],
xyz,
);
}
/** @param {string} oklch */
return function (oklch) {
oklch = oklch.replace("oklch(", "");
oklch = oklch.replace(")", "");
let splitOklch = oklch.split(" / ");
let alpha = 1;
if (splitOklch.length === 2) {
alpha = Number(splitOklch.pop()?.replace("%", "")) / 100;
}
splitOklch = oklch.split(" ");
const lch = splitOklch.map((v, i) => {
if (!i && v.includes("%")) {
return Number(v.replace("%", "")) / 100;
} else {
return Number(v);
}
});
const rgb = srgbLinear2rgb(
xyz2rgbLinear(
oklab2xyz(oklch2oklab(/** @type {[number, number, number]} */ (lch))),
),
).map((v) => {
return Math.max(Math.min(Math.round(v * 255), 255), 0);
});
return [...rgb, alpha];
};
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -101,9 +101,9 @@ export const serdeBool = {
* @param {string} v * @param {string} v
*/ */
deserialize(v) { deserialize(v) {
if (v === "true") { if (v === "true" || v === "1") {
return true; return true;
} else if (v === "false") { } else if (v === "false" || v === "0") {
return false; return false;
} else { } else {
throw "deser bool err"; throw "deser bool err";
@@ -111,70 +111,6 @@ export const serdeBool = {
}, },
}; };
export const serdeIndex = {
/**
* @param {Index} v
*/
serialize(v) {
switch (v) {
case /** @satisfies {DateIndex} */ (0):
return "dateindex";
case /** @satisfies {DecadeIndex} */ (1):
return "decadeindex";
case /** @satisfies {DifficultyEpoch} */ (2):
return "difficultyepoch";
case /** @satisfies {EmptyOutputIndex} */ (3):
return "emptyoutputindex";
case /** @satisfies {HalvingEpoch} */ (4):
return "halvingepoch";
case /** @satisfies {Height} */ (5):
return "height";
case /** @satisfies {InputIndex} */ (6):
return "inputindex";
case /** @satisfies {MonthIndex} */ (7):
return "monthindex";
case /** @satisfies {OpReturnIndex} */ (8):
return "opreturnindex";
case /** @satisfies {OutputIndex} */ (9):
return "outputindex";
case /** @satisfies {P2AAddressIndex} */ (10):
return "p2aaddressindex";
case /** @satisfies {P2MSOutputIndex} */ (11):
return "p2msoutputindex";
case /** @satisfies {P2PK33AddressIndex} */ (12):
return "p2pk33addressindex";
case /** @satisfies {P2PK65AddressIndex} */ (13):
return "p2pk65addressindex";
case /** @satisfies {P2PKHAddressIndex} */ (14):
return "p2pkhaddressindex";
case /** @satisfies {P2SHAddressIndex} */ (15):
return "p2shaddressindex";
case /** @satisfies {P2TRAddressIndex} */ (16):
return "p2traddressindex";
case /** @satisfies {P2WPKHAddressIndex} */ (17):
return "p2wpkhaddressindex";
case /** @satisfies {P2WSHAddressIndex} */ (18):
return "p2wshaddressindex";
case /** @satisfies {QuarterIndex} */ (19):
return "quarterindex";
case /** @satisfies {SemesterIndex} */ (20):
return "semesterindex";
case /** @satisfies {TxIndex} */ (21):
return "txindex";
case /** @satisfies {UnknownOutputIndex} */ (22):
return "unknownoutputindex";
case /** @satisfies {WeekIndex} */ (23):
return "weekindex";
case /** @satisfies {YearIndex} */ (24):
return "yearindex";
case /** @satisfies {LoadedAddressIndex} */ (25):
return "loadedaddressindex";
case /** @satisfies {EmptyAddressIndex} */ (26):
return "emptyaddressindex";
}
},
};
export const serdeChartableIndex = { export const serdeChartableIndex = {
/** /**
* @param {number} v * @param {number} v

View File

@@ -36,15 +36,3 @@ export function throttle(callback, wait = 1000) {
} }
}; };
} }
/**
* @param {VoidFunction} callback
* @param {number} [timeout = 1]
*/
export function runWhenIdle(callback, timeout = 1) {
if ("requestIdleCallback" in window) {
requestIdleCallback(callback);
} else {
setTimeout(callback, timeout);
}
}

View File

@@ -1,6 +1,6 @@
/** /**
* *
* @import { Valued, SingleValueData, CandlestickData, OHLCTuple, Series, ISeries, HistogramData, LineData, BaselineData, LineSeriesPartialOptions, BaselineSeriesPartialOptions, HistogramSeriesPartialOptions, CandlestickSeriesPartialOptions, CreateChartElement, Chart } from "./core/chart" * @import { Valued, SingleValueData, CandlestickData, Series, ISeries, HistogramData, LineData, BaselineData, LineSeriesPartialOptions, BaselineSeriesPartialOptions, HistogramSeriesPartialOptions, CandlestickSeriesPartialOptions, CreateChartElement, Chart } from "./core/chart/index"
* *
* @import * as _ from "./packages/leeoniya-ufuzzy/1.0.19/dist/uFuzzy.d.ts" * @import * as _ from "./packages/leeoniya-ufuzzy/1.0.19/dist/uFuzzy.d.ts"
* *
@@ -26,7 +26,6 @@
* @typedef {typeof import("./core/utils")} Utilities * @typedef {typeof import("./core/utils")} Utilities
* @typedef {typeof import("./core/env")["default"]} Env * @typedef {typeof import("./core/env")["default"]} Env
* @typedef {typeof import("./core/elements")["default"]} Elements * @typedef {typeof import("./core/elements")["default"]} Elements
* @typedef {string} Metric
*/ */
// DO NOT CHANGE, Exact format is expected in `brk_bundler` // DO NOT CHANGE, Exact format is expected in `brk_bundler`

View File

@@ -1,12 +1,10 @@
const imports = { const imports = {
async signals() { async signals() {
return import("./packages/solidjs-signals/wrapper.js").then( return import("./packages/solidjs-signals/index.js").then((d) => d.default);
(d) => d.default,
);
}, },
async chart() { async chart() {
return window.document.fonts.ready.then(() => return window.document.fonts.ready.then(() =>
import("./core/chart.js").then((d) => d.default), import("./core/chart/index.js").then((d) => d.default),
); );
}, },
async leanQr() { async leanQr() {
@@ -18,18 +16,15 @@ const imports = {
); );
}, },
async modernScreenshot() { async modernScreenshot() {
return import("./packages/modern-screenshot/wrapper.js").then((d) => d); return import("./packages/modern-screenshot/index.js").then((d) => d);
},
async brk() {
return import("./packages/brk/index.js").then((d) => d);
}, },
async options() { async options() {
return import("./core/options/full.js").then((d) => d); return import("./core/options/full.js").then((d) => d);
}, },
async vecs() {
return import("./bridge/vecs.js").then((d) => d);
},
async pools() {
return import("./bridge/pools.js").then((d) => d);
},
}; };
/** /**

View File

@@ -91,25 +91,13 @@ function initFrameSelectors() {
} }
initFrameSelectors(); initFrameSelectors();
Promise.all([ Promise.all([packages.signals(), packages.brk(), packages.options()]).then(
packages.signals(), ([signals, { initOptions }]) =>
packages.vecs(),
packages.pools(),
packages.options(),
]).then(
([
signals,
{ createMetricToIndexes, VERSION },
{ createPools },
{ initOptions },
]) =>
signals.createRoot(() => { signals.createRoot(() => {
const owner = signals.getOwner(); const owner = signals.getOwner();
console.log(`VERSION = ${VERSION}`); console.log(`VERSION = ${VERSION}`);
const metricToIndexes = createMetricToIndexes();
if (env.localhost) { if (env.localhost) {
Object.keys(metricToIndexes).forEach((metric) => { Object.keys(metricToIndexes).forEach((metric) => {
serdeUnit.deserialize(metric); serdeUnit.deserialize(metric);
@@ -135,22 +123,22 @@ Promise.all([
const qrcode = signals.createSignal(/** @type {string | null} */ (null)); const qrcode = signals.createSignal(/** @type {string | null} */ (null));
function createLastHeightResource() { // function createLastHeightResource() {
const lastHeight = signals.createSignal(0); // const lastHeight = signals.createSignal(0);
function fetchLastHeight() { // function fetchLastHeight() {
utils.api.fetchLast( // utils.api.fetchLast(
(h) => { // (h) => {
lastHeight.set(h); // lastHeight.set(h);
}, // },
/** @satisfies {Height} */ (5), // /** @satisfies {Height} */ (5),
"height", // "height",
); // );
} // }
fetchLastHeight(); // fetchLastHeight();
setInterval(fetchLastHeight, 10_000); // setInterval(fetchLastHeight, 10_000);
return lastHeight; // return lastHeight;
} // }
const lastHeight = createLastHeightResource(); // const lastHeight = createLastHeightResource();
const webSockets = createWebSockets(signals); const webSockets = createWebSockets(signals);

2
websites/packages/brk/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
pools.js
metrics.js

View File

@@ -0,0 +1,11 @@
/**
* @param {VoidFunction} callback
* @param {number} [timeout = 1]
*/
export function runWhenIdle(callback, timeout = 1) {
if ("requestIdleCallback" in window) {
requestIdleCallback(callback);
} else {
setTimeout(callback, timeout);
}
}

View File

@@ -1,15 +1,19 @@
import { serdeIndex } from "./serde"; import { serdeIndex } from "./serde";
import { runWhenIdle } from "./timing"; import { runWhenIdle } from "./idle";
import { createPools } from "./pools";
import { createMetricToIndexes } from "./metrics";
const localhost = window.location.hostname === "localhost";
/** /**
* @param {Signals} signals * @param {Signals} signals
* @param {Utilities} utils
* @param {Env} env
* @param {MetricToIndexes} metricToIndexes
*/ */
export function createVecsResources(signals, utils, env, metricToIndexes) { export default function (signals) {
const owner = signals.getOwner(); const owner = signals.getOwner();
const pools = createPools();
const metricToIndexes = createMetricToIndexes();
const defaultFrom = -10_000; const defaultFrom = -10_000;
const defaultTo = undefined; const defaultTo = undefined;
@@ -30,17 +34,15 @@ export function createVecsResources(signals, utils, env, metricToIndexes) {
/** /**
* @template {number | OHLCTuple} [T=number] * @template {number | OHLCTuple} [T=number]
* @param {Index} index
* @param {Metric} metric * @param {Metric} metric
* @param {Index} index
*/ */
function createVecResource(index, metric) { function createMetricResource(metric, index) {
if (env.localhost && !(metric in metricToIndexes)) { if (localhost && !(metric in metricToIndexes)) {
throw Error(`${metric} not recognized`); throw Error(`${metric} not recognized`);
} }
return signals.runWithOwner(owner, () => { return signals.runWithOwner(owner, () => {
/** @typedef {T extends number ? SingleValueData : CandlestickData} Value */
const fetchedRecord = signals.createSignal( const fetchedRecord = signals.createSignal(
/** @type {Map<string, {loading: boolean, at: Date | null, vec: Signal<T[] | null>}>} */ ( /** @type {Map<string, {loading: boolean, at: Date | null, vec: Signal<T[] | null>}>} */ (
new Map() new Map()
@@ -85,7 +87,7 @@ export function createVecsResources(signals, utils, env, metricToIndexes) {
} }
fetched.loading = true; fetched.loading = true;
const res = /** @type {T[] | null} */ ( const res = /** @type {T[] | null} */ (
await api.fetchVec( await fetchVec(
(values) => { (values) => {
if (values.length || !fetched.vec()) { if (values.length || !fetched.vec()) {
fetched.vec.set(values); fetched.vec.set(values);
@@ -105,23 +107,23 @@ export function createVecsResources(signals, utils, env, metricToIndexes) {
}); });
} }
/** @type {Map<string, NonNullable<ReturnType<typeof createVecResource>>>} */ /** @type {Map<string, NonNullable<ReturnType<typeof createMetricResource>>>} */
const map = new Map(); const map = new Map();
const vecs = { const metrics = {
/** /**
* @template {number | OHLCTuple} [T=number] * @template {number | OHLCTuple} [T=number]
* @param {Index} index
* @param {Metric} metric * @param {Metric} metric
* @param {Index} index
*/ */
getOrCreate(index, metric) { getOrCreate(metric, index) {
const key = `${index},${metric}`; const key = `${metric}/${index}`;
const found = map.get(key); const found = map.get(key);
if (found) { if (found) {
return found; return found;
} }
const vec = createVecResource(index, metric); const vec = createMetricResource(index, metric);
if (!vec) throw Error("vec is undefined"); if (!vec) throw Error("vec is undefined");
map.set(key, /** @type {any} */ (vec)); map.set(key, /** @type {any} */ (vec));
return vec; return vec;
@@ -130,10 +132,10 @@ export function createVecsResources(signals, utils, env, metricToIndexes) {
defaultFetchedKey, defaultFetchedKey,
}; };
return vecs; return { metrics, pools };
} }
/** @typedef {ReturnType<typeof createVecsResources>} VecsResources */ // /** @typedef {ReturnType<typeof createVecsResources>} VecsResources */
/** @typedef {ReturnType<VecsResources["getOrCreate"]>} VecResource */ // /** @typedef {ReturnType<VecsResources["getOrCreate"]>} VecResource */
const CACHE_NAME = "api"; const CACHE_NAME = "api";
const API_VECS_PREFIX = "/api/vecs"; const API_VECS_PREFIX = "/api/vecs";
@@ -142,9 +144,8 @@ const API_VECS_PREFIX = "/api/vecs";
* @template T * @template T
* @param {(value: T) => void} callback * @param {(value: T) => void} callback
* @param {string} path * @param {string} path
* @param {boolean} [mustBeArray]
*/ */
async function fetchApi(callback, path, mustBeArray) { async function fetchApi(callback, path) {
const url = `${API_VECS_PREFIX}${path}`; const url = `${API_VECS_PREFIX}${path}`;
/** @type {T | null} */ /** @type {T | null} */
@@ -184,9 +185,7 @@ async function fetchApi(callback, path, mustBeArray) {
let fetchedJson = /** @type {T | null} */ (null); let fetchedJson = /** @type {T | null} */ (null);
try { try {
const f = await fetchedResponse.json(); const f = await fetchedResponse.json();
fetchedJson = /** @type {T} */ ( fetchedJson = /** @type {T} */ (f);
mustBeArray && !Array.isArray(f) ? [f] : f
);
} catch (_) { } catch (_) {
return cachedJson; return cachedJson;
} }
@@ -249,33 +248,23 @@ function genPath(index, metric, from, to) {
return path; return path;
} }
export const api = { // /**
/** // * @template {number | OHLCTuple} [T=number]
* @param {Index} index // * @param {(v: T[]) => void} callback
* @param {Metric} metric // * @param {Index} index
* @param {number} from // * @param {Metric} metric
*/ // * @param {number} [from]
genUrl(index, metric, from) { // * @param {number} [to]
return `${API_VECS_PREFIX}${genPath(index, metric, from)}`; // */
}, // function fetchMetric(callback, index, metric, from, to) {
/** // return fetchApi(callback, genPath(index, metric, from, to));
* @template {number | OHLCTuple} [T=number] // }
* @param {(v: T[]) => void} callback
* @param {Index} index // /**
* @param {Metric} metric // * @param {Index} index
* @param {number} [from] // * @param {Metric} metric
* @param {number} [to] // * @param {number} from
*/ // */
fetchVec(callback, index, metric, from, to) { // function genUrl(index, metric, from) {
return fetchApi(callback, genPath(index, metric, from, to), true); // return `${API_VECS_PREFIX}${genPath(index, metric, from)}`;
}, // }
/**
* @template {number | OHLCTuple} [T=number]
* @param {(v: T) => void} callback
* @param {Index} index
* @param {Metric} metric
*/
fetchLast(callback, index, metric) {
return fetchApi(callback, genPath(index, metric, -1));
},
};

View File

@@ -0,0 +1,64 @@
// Should be generated by server
export const serdeIndex = {
/**
* @param {Index} v
*/
serialize(v) {
switch (v) {
case /** @satisfies {DateIndex} */ (0):
return "dateindex";
case /** @satisfies {DecadeIndex} */ (1):
return "decadeindex";
case /** @satisfies {DifficultyEpoch} */ (2):
return "difficultyepoch";
case /** @satisfies {EmptyOutputIndex} */ (3):
return "emptyoutputindex";
case /** @satisfies {HalvingEpoch} */ (4):
return "halvingepoch";
case /** @satisfies {Height} */ (5):
return "height";
case /** @satisfies {InputIndex} */ (6):
return "inputindex";
case /** @satisfies {MonthIndex} */ (7):
return "monthindex";
case /** @satisfies {OpReturnIndex} */ (8):
return "opreturnindex";
case /** @satisfies {OutputIndex} */ (9):
return "outputindex";
case /** @satisfies {P2AAddressIndex} */ (10):
return "p2aaddressindex";
case /** @satisfies {P2MSOutputIndex} */ (11):
return "p2msoutputindex";
case /** @satisfies {P2PK33AddressIndex} */ (12):
return "p2pk33addressindex";
case /** @satisfies {P2PK65AddressIndex} */ (13):
return "p2pk65addressindex";
case /** @satisfies {P2PKHAddressIndex} */ (14):
return "p2pkhaddressindex";
case /** @satisfies {P2SHAddressIndex} */ (15):
return "p2shaddressindex";
case /** @satisfies {P2TRAddressIndex} */ (16):
return "p2traddressindex";
case /** @satisfies {P2WPKHAddressIndex} */ (17):
return "p2wpkhaddressindex";
case /** @satisfies {P2WSHAddressIndex} */ (18):
return "p2wshaddressindex";
case /** @satisfies {QuarterIndex} */ (19):
return "quarterindex";
case /** @satisfies {SemesterIndex} */ (20):
return "semesterindex";
case /** @satisfies {TxIndex} */ (21):
return "txindex";
case /** @satisfies {UnknownOutputIndex} */ (22):
return "unknownoutputindex";
case /** @satisfies {WeekIndex} */ (23):
return "weekindex";
case /** @satisfies {YearIndex} */ (24):
return "yearindex";
case /** @satisfies {LoadedAddressIndex} */ (25):
return "loadedaddressindex";
case /** @satisfies {EmptyAddressIndex} */ (26):
return "emptyaddressindex";
}
},
};

View File

@@ -0,0 +1,4 @@
import signals from "../solidjs-signals/index";
import brk from "./index";
export default () => brk(signals);

View File

@@ -0,0 +1,9 @@
/**
* @import { Signal, Signals, Accessor } from "../solidjs-signals/index";
*
* @import { DateIndex, DecadeIndex, DifficultyEpoch, Index, HalvingEpoch, Height, MonthIndex, P2PK33AddressIndex, P2PK65AddressIndex, P2PKHAddressIndex, P2SHAddressIndex, P2MSOutputIndex, P2AAddressIndex, P2TRAddressIndex, P2WPKHAddressIndex, P2WSHAddressIndex, TxIndex, InputIndex, OutputIndex, WeekIndex, SemesterIndex, YearIndex, MetricToIndexes, QuarterIndex, EmptyOutputIndex, OpReturnIndex, UnknownOutputIndex, EmptyAddressIndex, LoadedAddressIndex } from "./metrics"
*
* @typedef {[number, number, number, number]} OHLCTuple
*
* @typedef {any} Metric
*/

View File

@@ -5,8 +5,6 @@ const iphone = userAgent.includes("iphone");
const ipad = userAgent.includes("ipad"); const ipad = userAgent.includes("ipad");
const ios = iphone || ipad; const ios = iphone || ipad;
console.log({ ios });
/** /**
* @param {Object} args * @param {Object} args
* @param {Element} args.element * @param {Element} args.element

View File

@@ -1,4 +1,3 @@
/** /**
* @import { SignalOptions } from "./0.4.11/dist/types/core/core" * @import { SignalOptions } from "./0.4.11/dist/types/core/core"
* @import { getOwner as GetOwner, onCleanup as OnCleanup } from "./0.4.11/dist/types/core/owner" * @import { getOwner as GetOwner, onCleanup as OnCleanup } from "./0.4.11/dist/types/core/owner"