From 6e7a28a42b01a83091a1cf0450c2ce0bf418df99 Mon Sep 17 00:00:00 2001 From: Kieran Date: Sun, 24 Sep 2023 21:28:39 +0100 Subject: [PATCH] WASM: PoW --- packages/app/src/Element/NoteCreator.tsx | 6 +- packages/app/src/Element/PinPrompt.tsx | 11 +- packages/app/src/Hooks/useEventPublisher.tsx | 5 - packages/app/src/benchmarks.ts | 36 +- packages/app/src/chat/nip24.ts | 6 +- packages/app/src/index.tsx | 24 +- packages/system-wasm/Cargo.lock | 155 +++++ packages/system-wasm/Cargo.toml | 15 +- packages/system-wasm/benches/basic.rs | 19 +- packages/system-wasm/package.json | 2 +- packages/system-wasm/pkg/system_wasm.d.ts | 15 + packages/system-wasm/pkg/system_wasm.js | 110 +++- packages/system-wasm/pkg/system_wasm_bg.js | 622 ++++++++++++++++++ packages/system-wasm/pkg/system_wasm_bg.wasm | Bin 124629 -> 176472 bytes .../system-wasm/pkg/system_wasm_bg.wasm.d.ts | 3 + packages/system-wasm/src/lib.rs | 42 ++ packages/system-wasm/src/pow.rs | 111 ++++ packages/system/src/event-publisher.ts | 8 +- packages/system/src/pow-util.ts | 8 - 19 files changed, 1146 insertions(+), 52 deletions(-) create mode 100644 packages/system-wasm/pkg/system_wasm_bg.js create mode 100644 packages/system-wasm/src/pow.rs diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index 139b61ae..03029ae0 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -21,7 +21,7 @@ import Note from "Element/Note"; import { ClipboardEventHandler } from "react"; import useLogin from "Hooks/useLogin"; -import { System } from "index"; +import { System, WasmPowWorker } from "index"; import AsyncButton from "Element/AsyncButton"; import { AsyncIcon } from "Element/AsyncIcon"; import { fetchNip05Pubkey } from "@snort/shared"; @@ -30,9 +30,9 @@ import { useNoteCreator } from "State/NoteCreator"; export function NoteCreator() { const { formatMessage } = useIntl(); - const publisher = useEventPublisher(); const uploader = useFileUpload(); - const login = useLogin(s => ({ relays: s.relays, publicKey: s.publicKey })); + const login = useLogin(s => ({ relays: s.relays, publicKey: s.publicKey, pow: s.preferences.pow })); + const publisher = login.pow ? useEventPublisher()?.pow(login.pow, new WasmPowWorker()) : useEventPublisher(); const note = useNoteCreator(); const relays = login.relays; diff --git a/packages/app/src/Element/PinPrompt.tsx b/packages/app/src/Element/PinPrompt.tsx index 7c995622..87b1f372 100644 --- a/packages/app/src/Element/PinPrompt.tsx +++ b/packages/app/src/Element/PinPrompt.tsx @@ -2,13 +2,14 @@ import useLogin from "Hooks/useLogin"; import "./PinPrompt.css"; import { ReactNode, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; -import useEventPublisher from "Hooks/useEventPublisher"; -import { LoginStore, createPublisher, sessionNeedsPin } from "Login"; import { unwrap } from "@snort/shared"; import { EventPublisher, InvalidPinError, PinEncrypted, PinEncryptedPayload } from "@snort/system"; -import { DefaultPowWorker } from "index"; + +import useEventPublisher from "Hooks/useEventPublisher"; +import { LoginStore, createPublisher, sessionNeedsPin } from "Login"; import Modal from "./Modal"; import AsyncButton from "./AsyncButton"; +import { WasmPowWorker } from "index"; export function PinPrompt({ onResult, @@ -91,7 +92,7 @@ export function LoginUnlock() { const pub = EventPublisher.privateKey(k); if (login.preferences.pow) { - pub.pow(login.preferences.pow, DefaultPowWorker); + pub.pow(login.preferences.pow, new WasmPowWorker()); } LoginStore.setPublisher(login.id, pub); LoginStore.updateSession({ @@ -108,7 +109,7 @@ export function LoginUnlock() { const pub = createPublisher(login, key); if (pub) { if (login.preferences.pow) { - pub.pow(login.preferences.pow, DefaultPowWorker); + pub.pow(login.preferences.pow, new WasmPowWorker()); } LoginStore.setPublisher(login.id, pub); LoginStore.updateSession({ diff --git a/packages/app/src/Hooks/useEventPublisher.tsx b/packages/app/src/Hooks/useEventPublisher.tsx index 84bf8fd1..b686b0c8 100644 --- a/packages/app/src/Hooks/useEventPublisher.tsx +++ b/packages/app/src/Hooks/useEventPublisher.tsx @@ -1,6 +1,5 @@ import useLogin from "Hooks/useLogin"; import { LoginStore, createPublisher, sessionNeedsPin } from "Login"; -import { DefaultPowWorker } from "index"; export default function useEventPublisher() { const login = useLogin(); @@ -10,12 +9,8 @@ export default function useEventPublisher() { if (login.publicKey && !existing && !sessionNeedsPin(login)) { existing = createPublisher(login); if (existing) { - if (login.preferences.pow) { - existing.pow(login.preferences.pow, DefaultPowWorker); - } LoginStore.setPublisher(login.id, existing); } } - return existing; } diff --git a/packages/app/src/benchmarks.ts b/packages/app/src/benchmarks.ts index 7754d8a8..735863a1 100644 --- a/packages/app/src/benchmarks.ts +++ b/packages/app/src/benchmarks.ts @@ -1,6 +1,6 @@ import { bytesToHex } from "@noble/hashes/utils"; -import { DefaultQueryOptimizer, FlatReqFilter, QueryOptimizer, ReqFilter } from "@snort/system"; -import { compress, expand_filter, flat_merge, get_diff, default as wasmInit } from "@snort/system-wasm"; +import { DefaultQueryOptimizer, EventExt, FlatReqFilter, PowMiner, QueryOptimizer, ReqFilter } from "@snort/system"; +import { compress, expand_filter, flat_merge, get_diff, pow, default as wasmInit } from "@snort/system-wasm"; import WasmPath from "@snort/system-wasm/pkg/system_wasm_bg.wasm"; import { Bench } from "tinybench"; @@ -90,15 +90,35 @@ const testCompress = (q: QueryOptimizer) => { const wasmSuite = new Bench({ time: 1_000 }); const suite = new Bench({ time: 1_000 }); -const addTests = (s: Bench, q: QueryOptimizer) => { +const addTests = (s: Bench, q: QueryOptimizer, p: PowMiner) => { s.add("expand", () => testExpand(q)); s.add("get_diff", () => testGetDiff(q)); s.add("flat_merge", () => testFlatMerge(q)); s.add("compress", () => testCompress(q)); + s.add("pow", () => { + const ev = { + id: "", + kind: 1, + created_at: 1234567, + pubkey: "63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed", + content: "test", + sig: "", + tags: [], + }; + p.minePow(ev, 12); + }); }; -addTests(suite, DefaultQueryOptimizer); -addTests(wasmSuite, WasmQueryOptimizer); +addTests(suite, DefaultQueryOptimizer, { + minePow(ev, target) { + return Promise.resolve(EventExt.minePow(ev, target)); + }, +}); +addTests(wasmSuite, WasmQueryOptimizer, { + minePow(ev, target) { + return Promise.resolve(pow(ev, target)); + }, +}); const runAll = async () => { await wasmInit(WasmPath); @@ -106,9 +126,15 @@ const runAll = async () => { console.log("DefaultQueryOptimizer"); await suite.run(); console.table(suite.table()); + const p0 = document.createElement("pre"); + p0.innerText = JSON.stringify(suite.table(), undefined, " "); + document.body.appendChild(p0); console.log("WasmQueryOptimizer"); await wasmSuite.run(); console.table(wasmSuite.table()); + const p1 = document.createElement("pre"); + p1.innerText = JSON.stringify(wasmSuite.table(), undefined, " "); + document.body.appendChild(p1); }; runAll().catch(console.error); diff --git a/packages/app/src/chat/nip24.ts b/packages/app/src/chat/nip24.ts index 6281a6b7..9f32adf4 100644 --- a/packages/app/src/chat/nip24.ts +++ b/packages/app/src/chat/nip24.ts @@ -3,7 +3,7 @@ import { EventKind, NostrPrefix, encodeTLVEntries, TLVEntryType, TLVEntry, decod import { GiftWrapCache } from "Cache/GiftWrapCache"; import { UnwrappedGift } from "Db"; import { Chat, ChatSystem, ChatType, lastReadInChat } from "chat"; -import { DefaultPowWorker } from "index"; +import { WasmPowWorker } from "index"; export class Nip24ChatSystem extends ExternalStore> implements ChatSystem { #cache: GiftWrapCache; @@ -105,7 +105,9 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS const recvSealedN = pub.giftWrap(await pub.sealRumor(gossip, pt.id), pt.id, powTarget); messages.push(recvSealedN); } - messages.push(pub.giftWrap(await pub.sealRumor(gossip, pub.pubKey), pub.pubKey, powTarget, DefaultPowWorker)); + messages.push( + pub.giftWrap(await pub.sealRumor(gossip, pub.pubKey), pub.pubKey, powTarget, new WasmPowWorker()), + ); return await Promise.all(messages); }, sendMessage: (ev, system) => { diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index c47ca3a7..76f88d5c 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -2,13 +2,21 @@ import "./index.css"; import "@szhsin/react-menu/dist/index.css"; import "./fonts/inter.css"; -import { compress, expand_filter, flat_merge, get_diff, default as wasmInit } from "@snort/system-wasm"; +import { compress, expand_filter, flat_merge, get_diff, pow, default as wasmInit } from "@snort/system-wasm"; import WasmPath from "@snort/system-wasm/pkg/system_wasm_bg.wasm"; import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; -import { NostrSystem, ProfileLoaderService, PowWorker, QueryOptimizer, FlatReqFilter, ReqFilter } from "@snort/system"; +import { + NostrSystem, + ProfileLoaderService, + QueryOptimizer, + FlatReqFilter, + ReqFilter, + PowMiner, + NostrEvent, +} from "@snort/system"; import { SnortContext } from "@snort/system-react"; import * as serviceWorkerRegistration from "serviceWorkerRegistration"; @@ -53,6 +61,13 @@ const WasmQueryOptimizer = { }, } as QueryOptimizer; +export class WasmPowWorker implements PowMiner { + minePow(ev: NostrEvent, target: number): Promise { + const res = pow(ev, target); + return Promise.resolve(res); + } +} + /** * Singleton nostr system */ @@ -75,11 +90,6 @@ export const System = new NostrSystem({ */ export const ProfileLoader = new ProfileLoaderService(System, UserCache); -/** - * Singleton POW worker - */ -export const DefaultPowWorker = new PowWorker("/pow.js"); - serviceWorkerRegistration.register(); async function initSite() { diff --git a/packages/system-wasm/Cargo.lock b/packages/system-wasm/Cargo.lock index ce049505..cc9ae096 100644 --- a/packages/system-wasm/Cargo.lock +++ b/packages/system-wasm/Cargo.lock @@ -23,24 +23,77 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" +[[package]] +name = "argon2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ba4cac0a46bc1d2912652a751c47f2a9f3a7fe89bcae2275d418f5270402f9" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures", + "password-hash", +] + +[[package]] +name = "async-trait" +version = "0.1.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + [[package]] name = "cast" version = "0.3.0" @@ -124,6 +177,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + [[package]] name = "criterion" version = "0.5.1" @@ -203,6 +265,27 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + [[package]] name = "either" version = "1.9.0" @@ -230,6 +313,16 @@ dependencies = [ "libc", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.10" @@ -253,6 +346,12 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "is-terminal" version = "0.4.9" @@ -361,6 +460,17 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + [[package]] name = "plotters" version = "0.3.5" @@ -576,6 +686,35 @@ dependencies = [ "serde", ] +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7895c8ae88588ccead14ff438b939b0c569cd619116f14b4d13fdff7b8333386" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "2.0.31" @@ -591,12 +730,16 @@ dependencies = [ name = "system-wasm" version = "0.1.0" dependencies = [ + "argon2", + "console_error_panic_hook", "criterion", + "hex", "itertools 0.11.0", "rand", "serde", "serde-wasm-bindgen", "serde_json", + "sha256", "wasm-bindgen", "wasm-bindgen-test", ] @@ -611,12 +754,24 @@ dependencies = [ "serde_json", ] +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "walkdir" version = "2.4.0" diff --git a/packages/system-wasm/Cargo.toml b/packages/system-wasm/Cargo.toml index 81a968a6..14e657d1 100644 --- a/packages/system-wasm/Cargo.toml +++ b/packages/system-wasm/Cargo.toml @@ -8,9 +8,13 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] +argon2 = "0.5.2" +console_error_panic_hook = "0.1.7" +hex = { version = "0.4.3", features = [], default-features = false } itertools = "0.11.0" -serde = { version = "1.0.188", features = ["derive"] } +serde = { version = "1.0.188", features = ["derive"], default-features = false } serde-wasm-bindgen = "0.5.0" +sha256 = { version = "1.4.0", features = [], default-features = false } wasm-bindgen = "0.2.87" [dev-dependencies] @@ -21,4 +25,11 @@ criterion = { version = "0.5" } [[bench]] name = "basic" -harness = false \ No newline at end of file +harness = false + +[profile.release] +opt-level = 3 +lto = true + +[package.metadata.wasm-pack.profile.release] +wasm-opt = ["-O3"] diff --git a/packages/system-wasm/benches/basic.rs b/packages/system-wasm/benches/basic.rs index 5bdef41a..bdefcbf8 100644 --- a/packages/system-wasm/benches/basic.rs +++ b/packages/system-wasm/benches/basic.rs @@ -1,8 +1,9 @@ use criterion::{criterion_group, criterion_main, Criterion}; use rand::prelude::*; use std::collections::HashSet; -use system_query::diff::diff_filter; -use system_query::filter::{FlatReqFilter, ReqFilter}; +use system_wasm::diff::diff_filter; +use system_wasm::filter::{FlatReqFilter, ReqFilter}; +use system_wasm::{Event, pow}; fn random_pubkey(rng: &mut ThreadRng) -> String { let mut bytes = [0u8; 32]; @@ -63,6 +64,20 @@ fn criterion_benchmark(c: &mut Criterion) { let _ = diff_filter(&prev, &next); }) }); + c.bench_function("pow", |b| { + b.iter(|| { + let mut ev = Event { + id: None, + kind: 1, + created_at: 1234567, + pubkey: "63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed".to_string(), + content: "test".to_owned(), + sig: None, + tags: vec![], + }; + pow::pow(&mut ev, 12); + }) + }); } criterion_group!(benches, criterion_benchmark); diff --git a/packages/system-wasm/package.json b/packages/system-wasm/package.json index 8b9009d7..2d268998 100644 --- a/packages/system-wasm/package.json +++ b/packages/system-wasm/package.json @@ -5,7 +5,7 @@ "author": "Kieran", "license": "MIT", "scripts": { - "build": "wasm-pack build -t web -s snort && rm -f pkg/.gitignore" + "build": "wasm-pack build --release -t web -s snort && rm -f pkg/.gitignore" }, "files": [ "pkg/system_wasm_bg.wasm", diff --git a/packages/system-wasm/pkg/system_wasm.d.ts b/packages/system-wasm/pkg/system_wasm.d.ts index b1781e0d..1ebca4b4 100644 --- a/packages/system-wasm/pkg/system_wasm.d.ts +++ b/packages/system-wasm/pkg/system_wasm.d.ts @@ -27,6 +27,18 @@ export function flat_merge(val: any): any; * @returns {any} */ export function compress(val: any): any; +/** + * @param {any} val + * @param {any} target + * @returns {any} + */ +export function pow(val: any, target: any): any; +/** + * @param {any} password + * @param {any} salt + * @returns {any} + */ +export function argon2(password: any, salt: any): any; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; @@ -37,10 +49,13 @@ export interface InitOutput { readonly get_diff: (a: number, b: number, c: number) => void; readonly flat_merge: (a: number, b: number) => void; readonly compress: (a: number, b: number) => void; + readonly pow: (a: number, b: number, c: number) => void; + readonly argon2: (a: number, b: number, c: number) => void; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __wbindgen_add_to_stack_pointer: (a: number) => number; readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; } export type SyncInitInput = BufferSource | WebAssembly.Module; diff --git a/packages/system-wasm/pkg/system_wasm.js b/packages/system-wasm/pkg/system_wasm.js index 7b930b35..7f7ae5af 100644 --- a/packages/system-wasm/pkg/system_wasm.js +++ b/packages/system-wasm/pkg/system_wasm.js @@ -108,6 +108,15 @@ function getInt32Memory0() { return cachedInt32Memory0; } +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + const cachedTextDecoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-8", { ignoreBOM: true, fatal: true }) @@ -126,15 +135,6 @@ function getStringFromWasm0(ptr, len) { return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); } -function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; - - heap[idx] = obj; - return idx; -} - let cachedFloat64Memory0 = null; function getFloat64Memory0() { @@ -144,6 +144,15 @@ function getFloat64Memory0() { return cachedFloat64Memory0; } +let cachedBigInt64Memory0 = null; + +function getBigInt64Memory0() { + if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { + cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); + } + return cachedBigInt64Memory0; +} + function debugString(val) { // primitive types const type = typeof val; @@ -310,6 +319,48 @@ export function compress(val) { } } +/** + * @param {any} val + * @param {any} target + * @returns {any} + */ +export function pow(val, target) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.pow(retptr, addHeapObject(val), addHeapObject(target)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} password + * @param {any} salt + * @returns {any} + */ +export function argon2(password, salt) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.argon2(retptr, addHeapObject(password), addHeapObject(salt)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + function handleError(f, args) { try { return f.apply(this, args); @@ -375,6 +426,18 @@ function __wbg_get_imports() { const ret = getObject(arg0) in getObject(arg1); return ret; }; + imports.wbg.__wbindgen_is_bigint = function (arg0) { + const ret = typeof getObject(arg0) === "bigint"; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function (arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_eq = function (arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; + }; imports.wbg.__wbindgen_error_new = function (arg0, arg1) { const ret = new Error(getStringFromWasm0(arg0, arg1)); return addHeapObject(ret); @@ -513,6 +576,34 @@ function __wbg_get_imports() { const ret = result; return ret; }; + imports.wbg.__wbg_new_abda76e883ba8a5f = function () { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function (arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function (arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbindgen_bigint_get_as_i64 = function (arg0, arg1) { + const v = getObject(arg1); + const ret = typeof v === "bigint" ? v : undefined; + getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; + getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); + }; imports.wbg.__wbindgen_debug_string = function (arg0, arg1) { const ret = debugString(getObject(arg1)); const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); @@ -536,6 +627,7 @@ function __wbg_init_memory(imports, maybe_memory) {} function __wbg_finalize_init(instance, module) { wasm = instance.exports; __wbg_init.__wbindgen_wasm_module = module; + cachedBigInt64Memory0 = null; cachedFloat64Memory0 = null; cachedInt32Memory0 = null; cachedUint8Memory0 = null; diff --git a/packages/system-wasm/pkg/system_wasm_bg.js b/packages/system-wasm/pkg/system_wasm_bg.js new file mode 100644 index 00000000..876c8507 --- /dev/null +++ b/packages/system-wasm/pkg/system_wasm_bg.js @@ -0,0 +1,622 @@ +let wasm; +export function __wbg_set_wasm(val) { + wasm = val; +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { + return heap[idx]; +} + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +const lTextEncoder = typeof TextEncoder === "undefined" ? (0, module.require)("util").TextEncoder : TextEncoder; + +let cachedTextEncoder = new lTextEncoder("utf-8"); + +const encodeString = + typeof cachedTextEncoder.encodeInto === "function" + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); + } + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length, + }; + }; + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0() + .subarray(ptr, ptr + buf.length) + .set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7f) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +const lTextDecoder = typeof TextDecoder === "undefined" ? (0, module.require)("util").TextDecoder : TextDecoder; + +let cachedTextDecoder = new lTextDecoder("utf-8", { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +let cachedFloat64Memory0 = null; + +function getFloat64Memory0() { + if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { + cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); + } + return cachedFloat64Memory0; +} + +let cachedBigInt64Memory0 = null; + +function getBigInt64Memory0() { + if (cachedBigInt64Memory0 === null || cachedBigInt64Memory0.byteLength === 0) { + cachedBigInt64Memory0 = new BigInt64Array(wasm.memory.buffer); + } + return cachedBigInt64Memory0; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == "number" || type == "boolean" || val == null) { + return `${val}`; + } + if (type == "string") { + return `"${val}"`; + } + if (type == "symbol") { + const description = val.description; + if (description == null) { + return "Symbol"; + } else { + return `Symbol(${description})`; + } + } + if (type == "function") { + const name = val.name; + if (typeof name == "string" && name.length > 0) { + return `Function(${name})`; + } else { + return "Function"; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = "["; + if (length > 0) { + debug += debugString(val[0]); + } + for (let i = 1; i < length; i++) { + debug += ", " + debugString(val[i]); + } + debug += "]"; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == "Object") { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return "Object(" + JSON.stringify(val) + ")"; + } catch (_) { + return "Object"; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} +/** + * @param {any} prev + * @param {any} next + * @returns {any} + */ +export function diff_filters(prev, next) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.diff_filters(retptr, addHeapObject(prev), addHeapObject(next)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} val + * @returns {any} + */ +export function expand_filter(val) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.expand_filter(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} prev + * @param {any} next + * @returns {any} + */ +export function get_diff(prev, next) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.get_diff(retptr, addHeapObject(prev), addHeapObject(next)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} val + * @returns {any} + */ +export function flat_merge(val) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.flat_merge(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} val + * @returns {any} + */ +export function compress(val) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.compress(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} val + * @param {any} target + * @returns {any} + */ +export function pow(val, target) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.pow(retptr, addHeapObject(val), addHeapObject(target)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** + * @param {any} password + * @param {any} salt + * @returns {any} + */ +export function argon2(password, salt) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.argon2(retptr, addHeapObject(password), addHeapObject(salt)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +export function __wbindgen_object_drop_ref(arg0) { + takeObject(arg0); +} + +export function __wbindgen_string_get(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "string" ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +} + +export function __wbindgen_is_object(arg0) { + const val = getObject(arg0); + const ret = typeof val === "object" && val !== null; + return ret; +} + +export function __wbindgen_is_undefined(arg0) { + const ret = getObject(arg0) === undefined; + return ret; +} + +export function __wbindgen_in(arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; +} + +export function __wbindgen_is_bigint(arg0) { + const ret = typeof getObject(arg0) === "bigint"; + return ret; +} + +export function __wbindgen_bigint_from_u64(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); +} + +export function __wbindgen_jsval_eq(arg0, arg1) { + const ret = getObject(arg0) === getObject(arg1); + return ret; +} + +export function __wbindgen_error_new(arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); +} + +export function __wbindgen_object_clone_ref(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); +} + +export function __wbindgen_jsval_loose_eq(arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; +} + +export function __wbindgen_boolean_get(arg0) { + const v = getObject(arg0); + const ret = typeof v === "boolean" ? (v ? 1 : 0) : 2; + return ret; +} + +export function __wbindgen_number_get(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "number" ? obj : undefined; + getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; + getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); +} + +export function __wbindgen_number_new(arg0) { + const ret = arg0; + return addHeapObject(ret); +} + +export function __wbindgen_string_new(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); +} + +export function __wbg_getwithrefkey_5e6d9547403deab8(arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); +} + +export function __wbg_set_841ac57cff3d672b(arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); +} + +export function __wbg_get_44be0491f933a435(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); +} + +export function __wbg_length_fff51ee6522a1a18(arg0) { + const ret = getObject(arg0).length; + return ret; +} + +export function __wbg_new_898a68150f225f2e() { + const ret = new Array(); + return addHeapObject(ret); +} + +export function __wbindgen_is_function(arg0) { + const ret = typeof getObject(arg0) === "function"; + return ret; +} + +export function __wbg_next_526fc47e980da008(arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); +} + +export function __wbg_next_ddb3312ca1c4e32a() { + return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments); +} + +export function __wbg_done_5c1f01fb660d73b5(arg0) { + const ret = getObject(arg0).done; + return ret; +} + +export function __wbg_value_1695675138684bd5(arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); +} + +export function __wbg_iterator_97f0c81209c6c35a() { + const ret = Symbol.iterator; + return addHeapObject(ret); +} + +export function __wbg_get_97b561fb56f034b5() { + return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments); +} + +export function __wbg_call_cb65541d95d71282() { + return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments); +} + +export function __wbg_new_b51585de1b234aff() { + const ret = new Object(); + return addHeapObject(ret); +} + +export function __wbg_set_502d29070ea18557(arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); +} + +export function __wbg_isArray_4c24b343cb13cfb1(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; +} + +export function __wbg_instanceof_ArrayBuffer_39ac22089b74fddb(arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch { + result = false; + } + const ret = result; + return ret; +} + +export function __wbg_isSafeInteger_bb8e18dd21c97288(arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; +} + +export function __wbg_buffer_085ec1f694018c4f(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); +} + +export function __wbg_new_8125e318e6245eed(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); +} + +export function __wbg_set_5cf90238115182c3(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); +} + +export function __wbg_length_72e2208bbc0efc61(arg0) { + const ret = getObject(arg0).length; + return ret; +} + +export function __wbg_instanceof_Uint8Array_d8d9cb2b8e8ac1d4(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch { + result = false; + } + const ret = result; + return ret; +} + +export function __wbg_new_abda76e883ba8a5f() { + const ret = new Error(); + return addHeapObject(ret); +} + +export function __wbg_stack_658279fe44541cf6(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +} + +export function __wbg_error_f851667af71bcfc6(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } +} + +export function __wbindgen_bigint_get_as_i64(arg0, arg1) { + const v = getObject(arg1); + const ret = typeof v === "bigint" ? v : undefined; + getBigInt64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? BigInt(0) : ret; + getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); +} + +export function __wbindgen_debug_string(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; +} + +export function __wbindgen_throw(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +} + +export function __wbindgen_memory() { + const ret = wasm.memory; + return addHeapObject(ret); +} diff --git a/packages/system-wasm/pkg/system_wasm_bg.wasm b/packages/system-wasm/pkg/system_wasm_bg.wasm index a5b7b22810444b442af8fd0d1915936fbbfd6f76..ce33b1200ae6d695f0e511603a59bc9f354a822a 100644 GIT binary patch literal 176472 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�!Ywbo1M#Cn-HAqN|Wj#b4Jgn!!cC_*y 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 delta 40872 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 diff --git a/packages/system-wasm/pkg/system_wasm_bg.wasm.d.ts b/packages/system-wasm/pkg/system_wasm_bg.wasm.d.ts index 3071e5fd..b83a0ee8 100644 --- a/packages/system-wasm/pkg/system_wasm_bg.wasm.d.ts +++ b/packages/system-wasm/pkg/system_wasm_bg.wasm.d.ts @@ -6,7 +6,10 @@ export function expand_filter(a: number, b: number): void; export function get_diff(a: number, b: number, c: number): void; export function flat_merge(a: number, b: number): void; export function compress(a: number, b: number): void; +export function pow(a: number, b: number, c: number): void; +export function argon2(a: number, b: number, c: number): void; export function __wbindgen_malloc(a: number, b: number): number; export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; export function __wbindgen_add_to_stack_pointer(a: number): number; export function __wbindgen_exn_store(a: number): void; +export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/packages/system-wasm/src/lib.rs b/packages/system-wasm/src/lib.rs index ad46a46a..1343ddbb 100644 --- a/packages/system-wasm/src/lib.rs +++ b/packages/system-wasm/src/lib.rs @@ -1,12 +1,31 @@ +extern crate console_error_panic_hook; + +use argon2::{Argon2}; +use serde::{Deserialize, Serialize}; use crate::filter::{FlatReqFilter, ReqFilter}; use wasm_bindgen::prelude::*; pub mod diff; pub mod filter; pub mod merge; +pub mod pow; + +#[derive(PartialEq, Clone, Serialize, Deserialize)] +pub struct Event { + #[serde(rename = "id", skip_serializing_if = "Option::is_none")] + pub id: Option, + pub kind: i32, + pub created_at: u64, + pub pubkey: String, + pub content: String, + #[serde(rename = "sig", skip_serializing_if = "Option::is_none")] + pub sig: Option, + pub tags: Vec>, +} #[wasm_bindgen] pub fn diff_filters(prev: JsValue, next: JsValue) -> Result { + console_error_panic_hook::set_once(); let prev_parsed: Vec = serde_wasm_bindgen::from_value(prev)?; let next_parsed: Vec = serde_wasm_bindgen::from_value(next)?; let result = diff::diff_filter(&prev_parsed, &next_parsed); @@ -15,6 +34,7 @@ pub fn diff_filters(prev: JsValue, next: JsValue) -> Result { #[wasm_bindgen] pub fn expand_filter(val: JsValue) -> Result { + console_error_panic_hook::set_once(); let parsed: ReqFilter = serde_wasm_bindgen::from_value(val)?; let result: Vec = (&parsed).into(); Ok(serde_wasm_bindgen::to_value(&result)?) @@ -22,6 +42,7 @@ pub fn expand_filter(val: JsValue) -> Result { #[wasm_bindgen] pub fn get_diff(prev: JsValue, next: JsValue) -> Result { + console_error_panic_hook::set_once(); let prev_parsed: Vec = serde_wasm_bindgen::from_value(prev)?; let next_parsed: Vec = serde_wasm_bindgen::from_value(next)?; let expanded_prev: Vec = prev_parsed @@ -44,6 +65,7 @@ pub fn get_diff(prev: JsValue, next: JsValue) -> Result { #[wasm_bindgen] pub fn flat_merge(val: JsValue) -> Result { + console_error_panic_hook::set_once(); let val_parsed: Vec = serde_wasm_bindgen::from_value(val)?; let result = merge::merge::(val_parsed.iter().collect()); Ok(serde_wasm_bindgen::to_value(&result)?) @@ -51,11 +73,31 @@ pub fn flat_merge(val: JsValue) -> Result { #[wasm_bindgen] pub fn compress(val: JsValue) -> Result { + console_error_panic_hook::set_once(); let val_parsed: Vec = serde_wasm_bindgen::from_value(val)?; let result = merge::merge::(val_parsed.iter().collect()); Ok(serde_wasm_bindgen::to_value(&result)?) } +#[wasm_bindgen] +pub fn pow(val: JsValue, target: JsValue) -> Result { + console_error_panic_hook::set_once(); + let mut val_parsed: Event = serde_wasm_bindgen::from_value(val)?; + let target_parsed: u8 = serde_wasm_bindgen::from_value(target)?; + pow::pow(&mut val_parsed, target_parsed); + Ok(serde_wasm_bindgen::to_value(&val_parsed)?) +} + +#[wasm_bindgen] +pub fn argon2(password: JsValue, salt: JsValue) -> Result { + console_error_panic_hook::set_once(); + let password_parsed: String = serde_wasm_bindgen::from_value(password)?; + let salt_parsed: String = serde_wasm_bindgen::from_value(salt)?; + let mut key = [0u8; 32]; + Argon2::default().hash_password_into(password_parsed.as_bytes(), salt_parsed.as_bytes(), &mut key).expect("Failed to generate key"); + Ok(serde_wasm_bindgen::to_value(&hex::encode(key))?) +} + #[cfg(test)] mod tests { use super::*; diff --git a/packages/system-wasm/src/pow.rs b/packages/system-wasm/src/pow.rs new file mode 100644 index 00000000..73b70743 --- /dev/null +++ b/packages/system-wasm/src/pow.rs @@ -0,0 +1,111 @@ +use crate::Event; + +pub fn pow(ev: &mut Event, target: u8) { + let mut ctr = 0u32; + let mut nonce_tag_idx = ev.tags.iter().position(|x| x[0] == "nonce"); + if nonce_tag_idx.is_none() { + nonce_tag_idx = Some(ev.tags.len()); + ev.tags.push(vec!["nonce".to_owned(), ctr.to_string(), target.to_string()]); + } + loop { + ev.tags[nonce_tag_idx.unwrap()][1] = ctr.to_string(); + + let new_id = make_id(ev); + if count_leading_zeros(&new_id) >= target { + ev.id = Some(new_id); + break; + } + + ctr += 1; + } +} + +fn count_leading_zeros(str: &String) -> u8 { + let mut count = 0; + + for x in hex::decode(str).unwrap() { + if x == 0u8 { + count += 8; + } else { + count += x.leading_zeros(); + break; + } + } + + count as u8 +} + +fn make_id(ev: &Event) -> String { + let mut v = "[0,\"".to_owned(); + v.push_str(&ev.pubkey); + v.push_str("\","); + v.push_str(&ev.created_at.to_string()); + v.push(','); + v.push_str(&ev.kind.to_string()); + v.push_str(",["); + v.push_str(ev.tags.iter().map(|x| { + let mut y = "[".to_owned(); + y.push_str(x.iter().map(|z| ["\"", z, "\""].join("")).collect::>().join(",").as_str()); + y.push(']'); + y + }).collect::>().join(",").as_str()); + v.push_str("],\""); + v.push_str(&ev.content); + v.push_str("\"]"); + sha256::digest(v) +} + +#[cfg(test)] +mod tests { + use serde::Deserialize; + use serde_json::json; + use crate::Event; + + #[test] + fn make_id() { + let ev = Event::deserialize(json!({ + "content": "Oh i think it doesnt work until you reload", + "created_at": 1695568849, + "id": "0000051bca8ee62220b34827358dca69284734a2e7420f3c4b814901a531c767", + "kind": 1, + "pubkey": "63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed", + "sig": "0c18bfcde49fd42c7faf93b3ecd7caf10f0414c9ee3234fca96ea0bbb1a805cb2767fc067dc1a743420c499b34c232e19b73beb2f1fe47c18a2856c67bdef983", + "tags": [ + [ + "e", + "ad17146f086345a12583b537daabdf49ccc5cd09e2c0b4816c835f397b693e6b", + "wss://nos.lol/", + "root" + ], + [ + "e", + "72759bf1f525e9715f4e6d22381f53dc4d2ab47d7aaac11340e7fced13e10b11", + "wss://nos.lol/", + "reply" + ], + [ + "p", + "63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed" + ], + [ + "p", + "1bc70a0148b3f316da33fe3c89f23e3e71ac4ff998027ec712b905cd24f6a411" + ], + [ + "nonce", + "7403", + "18" + ] + ] + })).ok().unwrap(); + + assert_eq!(super::make_id(&ev), ev.id.unwrap()) + } + + #[test] + fn count_zeros() { + assert_eq!(10u8.leading_zeros(), 4); + assert_eq!(super::count_leading_zeros(&"00".to_owned()), 8); + assert_eq!(super::count_leading_zeros(&"0000051bca8ee62220b34827358dca69284734a2e7420f3c4b814901a531c767".to_owned()), 21) + } +} \ No newline at end of file diff --git a/packages/system/src/event-publisher.ts b/packages/system/src/event-publisher.ts index d4bbb1fa..b2bd0ad4 100644 --- a/packages/system/src/event-publisher.ts +++ b/packages/system/src/event-publisher.ts @@ -71,11 +71,13 @@ export class EventPublisher { } /** - * Apply POW to every event + * Create a copy of this publisher with PoW */ pow(target: number, miner?: PowMiner) { - this.#pow = target; - this.#miner = miner; + const ret = new EventPublisher(this.#signer, this.#pubKey); + ret.#pow = target; + ret.#miner = miner; + return ret; } #eb(k: EventKind) { diff --git a/packages/system/src/pow-util.ts b/packages/system/src/pow-util.ts index aab35f5d..52536e67 100644 --- a/packages/system/src/pow-util.ts +++ b/packages/system/src/pow-util.ts @@ -20,15 +20,7 @@ export function minePow(e: NostrPowEvent, target: number) { e.tags.push(["nonce", ctr.toString(), target.toString()]); } do { - //roll ctr and compute id - const now = Math.floor(new Date().getTime() / 1000); - // reset ctr if timestamp changed, this is not really needed but makes the ctr value smaller - if (now !== e.created_at) { - ctr = 0; - e.created_at = now; - } e.tags[nonceTagIdx][1] = (++ctr).toString(); - e.id = createId(e); } while (countLeadingZeros(e.id) < target);