move wasm and system out of index.tsx
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
e08da34aa8
commit
5ea2eb711f
@ -15,7 +15,6 @@ import Note from "@/Element/Event/Note";
|
|||||||
|
|
||||||
import { ClipboardEventHandler, DragEvent, useEffect } from "react";
|
import { ClipboardEventHandler, DragEvent, useEffect } from "react";
|
||||||
import useLogin from "@/Hooks/useLogin";
|
import useLogin from "@/Hooks/useLogin";
|
||||||
import { GetPowWorker } from "@/index";
|
|
||||||
import AsyncButton from "@/Element/Button/AsyncButton";
|
import AsyncButton from "@/Element/Button/AsyncButton";
|
||||||
import { AsyncIcon } from "@/Element/Button/AsyncIcon";
|
import { AsyncIcon } from "@/Element/Button/AsyncIcon";
|
||||||
import { fetchNip05Pubkey, unixNow } from "@snort/shared";
|
import { fetchNip05Pubkey, unixNow } from "@snort/shared";
|
||||||
@ -28,6 +27,7 @@ import { TrendingHashTagsLine } from "@/Element/Event/Create/TrendingHashTagsLin
|
|||||||
import { Toastore } from "@/Toaster";
|
import { Toastore } from "@/Toaster";
|
||||||
import { OkResponseRow } from "./OkResponseRow";
|
import { OkResponseRow } from "./OkResponseRow";
|
||||||
import CloseButton from "@/Element/Button/CloseButton";
|
import CloseButton from "@/Element/Button/CloseButton";
|
||||||
|
import { GetPowWorker } from "@/wasm";
|
||||||
|
|
||||||
export function NoteCreator() {
|
export function NoteCreator() {
|
||||||
const { formatMessage } = useIntl();
|
const { formatMessage } = useIntl();
|
||||||
|
@ -5,10 +5,10 @@ import { LoginStore } from "@/Login";
|
|||||||
import AccountName from "./AccountName";
|
import AccountName from "./AccountName";
|
||||||
import ActiveAccount from "./ActiveAccount";
|
import ActiveAccount from "./ActiveAccount";
|
||||||
import ReservedAccount from "./ReservedAccount";
|
import ReservedAccount from "./ReservedAccount";
|
||||||
import { ProfileLoader } from "@/index";
|
|
||||||
import { FormattedMessage } from "react-intl";
|
import { FormattedMessage } from "react-intl";
|
||||||
import { injectIntl } from "react-intl";
|
import { injectIntl } from "react-intl";
|
||||||
import messages from "@/Element/messages";
|
import messages from "@/Element/messages";
|
||||||
|
import { ProfileLoader } from "@/system";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
|
@ -9,7 +9,8 @@ import useEventPublisher from "@/Hooks/useEventPublisher";
|
|||||||
import { LoginStore, createPublisher, sessionNeedsPin } from "@/Login";
|
import { LoginStore, createPublisher, sessionNeedsPin } from "@/Login";
|
||||||
import Modal from "./Modal";
|
import Modal from "./Modal";
|
||||||
import AsyncButton from "./Button/AsyncButton";
|
import AsyncButton from "./Button/AsyncButton";
|
||||||
import { GetPowWorker } from "@/index";
|
|
||||||
|
import { GetPowWorker } from "@/wasm";
|
||||||
|
|
||||||
export function PinPrompt({
|
export function PinPrompt({
|
||||||
onResult,
|
onResult,
|
||||||
|
@ -15,8 +15,8 @@ import ImageGridItem from "@/Element/Feed/ImageGridItem";
|
|||||||
import { SpotlightThreadModal } from "@/Element/Spotlight/SpotlightThreadModal";
|
import { SpotlightThreadModal } from "@/Element/Spotlight/SpotlightThreadModal";
|
||||||
import useLogin from "@/Hooks/useLogin";
|
import useLogin from "@/Hooks/useLogin";
|
||||||
import useCachedFetch from "@/Hooks/useCachedFetch";
|
import useCachedFetch from "@/Hooks/useCachedFetch";
|
||||||
import { System } from "@/index";
|
|
||||||
import { removeUndefined } from "@snort/shared";
|
import { removeUndefined } from "@snort/shared";
|
||||||
|
import { System } from "@/system";
|
||||||
|
|
||||||
export default function TrendingNotes({ count = Infinity, small = false }: { count: number; small: boolean }) {
|
export default function TrendingNotes({ count = Infinity, small = false }: { count: number; small: boolean }) {
|
||||||
const api = new NostrBandApi();
|
const api = new NostrBandApi();
|
||||||
|
@ -237,4 +237,4 @@ export default function ZapPoolPage() {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return <ZapPoolPageInner />;
|
return <ZapPoolPageInner />;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,8 @@ import { EventKind, NostrPrefix, encodeTLVEntries, TLVEntryType, TLVEntry, decod
|
|||||||
import { GiftWrapCache } from "@/Cache/GiftWrapCache";
|
import { GiftWrapCache } from "@/Cache/GiftWrapCache";
|
||||||
import { UnwrappedGift } from "@/Db";
|
import { UnwrappedGift } from "@/Db";
|
||||||
import { Chat, ChatSystem, ChatType, lastReadInChat } from "@/chat";
|
import { Chat, ChatSystem, ChatType, lastReadInChat } from "@/chat";
|
||||||
import { GetPowWorker } from "@/index";
|
|
||||||
|
import { GetPowWorker } from "@/wasm";
|
||||||
|
|
||||||
export class Nip24ChatSystem extends ExternalStore<Array<Chat>> implements ChatSystem {
|
export class Nip24ChatSystem extends ExternalStore<Array<Chat>> implements ChatSystem {
|
||||||
#cache: GiftWrapCache;
|
#cache: GiftWrapCache;
|
||||||
|
@ -2,37 +2,11 @@ import "./index.css";
|
|||||||
import "@szhsin/react-menu/dist/index.css";
|
import "@szhsin/react-menu/dist/index.css";
|
||||||
import "./fonts/inter.css";
|
import "./fonts/inter.css";
|
||||||
|
|
||||||
import {
|
|
||||||
compress,
|
|
||||||
expand_filter,
|
|
||||||
flat_merge,
|
|
||||||
get_diff,
|
|
||||||
pow,
|
|
||||||
schnorr_verify_event,
|
|
||||||
default as wasmInit,
|
|
||||||
} from "@snort/system-wasm";
|
|
||||||
import WasmPath from "@snort/system-wasm/pkg/system_wasm_bg.wasm";
|
|
||||||
|
|
||||||
import { StrictMode } from "react";
|
import { StrictMode } from "react";
|
||||||
import * as ReactDOM from "react-dom/client";
|
import * as ReactDOM from "react-dom/client";
|
||||||
import { createBrowserRouter, RouteObject, RouterProvider } from "react-router-dom";
|
import { createBrowserRouter, RouteObject, RouterProvider } from "react-router-dom";
|
||||||
import {
|
import { encodeTLVEntries } from "@snort/system";
|
||||||
NostrSystem,
|
|
||||||
ProfileLoaderService,
|
|
||||||
Optimizer,
|
|
||||||
FlatReqFilter,
|
|
||||||
ReqFilter,
|
|
||||||
PowMiner,
|
|
||||||
NostrEvent,
|
|
||||||
mapEventToProfile,
|
|
||||||
PowWorker,
|
|
||||||
encodeTLVEntries,
|
|
||||||
socialGraphInstance,
|
|
||||||
TaggedNostrEvent,
|
|
||||||
} from "@snort/system";
|
|
||||||
import PowWorkerURL from "@snort/system/src/pow-worker.ts?worker&url";
|
|
||||||
import { SnortContext } from "@snort/system-react";
|
import { SnortContext } from "@snort/system-react";
|
||||||
import { removeUndefined, throwIfOffline } from "@snort/shared";
|
|
||||||
|
|
||||||
import * as serviceWorkerRegistration from "@/serviceWorkerRegistration";
|
import * as serviceWorkerRegistration from "@/serviceWorkerRegistration";
|
||||||
import { IntlProvider } from "@/IntlProvider";
|
import { IntlProvider } from "@/IntlProvider";
|
||||||
@ -53,7 +27,7 @@ import { ThreadRoute } from "@/Element/Event/Thread";
|
|||||||
import { SubscribeRoutes } from "@/Pages/subscribe";
|
import { SubscribeRoutes } from "@/Pages/subscribe";
|
||||||
import ZapPoolPage from "@/Pages/ZapPool";
|
import ZapPoolPage from "@/Pages/ZapPool";
|
||||||
import { db } from "@/Db";
|
import { db } from "@/Db";
|
||||||
import { preload, RelayMetrics, SystemDb, UserCache, UserRelays } from "@/Cache";
|
import { preload } from "@/Cache";
|
||||||
import { LoginStore } from "@/Login";
|
import { LoginStore } from "@/Login";
|
||||||
import { SnortDeckLayout } from "@/Pages/DeckLayout";
|
import { SnortDeckLayout } from "@/Pages/DeckLayout";
|
||||||
import FreeNostrAddressPage from "@/Pages/FreeNostrAddressPage";
|
import FreeNostrAddressPage from "@/Pages/FreeNostrAddressPage";
|
||||||
@ -65,10 +39,8 @@ import { setupWebLNWalletConfig } from "@/Wallet/WebLN";
|
|||||||
import { Wallets } from "@/Wallet";
|
import { Wallets } from "@/Wallet";
|
||||||
import NetworkGraph from "@/Pages/NetworkGraph";
|
import NetworkGraph from "@/Pages/NetworkGraph";
|
||||||
import WalletPage from "./Pages/WalletPage";
|
import WalletPage from "./Pages/WalletPage";
|
||||||
|
import { hasWasm, wasmInit, WasmPath } from "@/wasm";
|
||||||
import IndexedDBWorker from "./Cache/IndexedDB?worker";
|
import { System } from "@/system";
|
||||||
import * as Comlink from "comlink";
|
|
||||||
import { addEventToFuzzySearch } from "@/FuzzySearch";
|
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
@ -76,110 +48,6 @@ declare global {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const WasmOptimizer = {
|
|
||||||
expandFilter: (f: ReqFilter) => {
|
|
||||||
return expand_filter(f) as Array<FlatReqFilter>;
|
|
||||||
},
|
|
||||||
getDiff: (prev: Array<ReqFilter>, next: Array<ReqFilter>) => {
|
|
||||||
return get_diff(prev, next) as Array<FlatReqFilter>;
|
|
||||||
},
|
|
||||||
flatMerge: (all: Array<FlatReqFilter>) => {
|
|
||||||
return flat_merge(all) as Array<ReqFilter>;
|
|
||||||
},
|
|
||||||
compress: (all: Array<ReqFilter>) => {
|
|
||||||
return compress(all) as Array<ReqFilter>;
|
|
||||||
},
|
|
||||||
schnorrVerify: ev => {
|
|
||||||
return schnorr_verify_event(ev);
|
|
||||||
},
|
|
||||||
} as Optimizer;
|
|
||||||
|
|
||||||
export class WasmPowWorker implements PowMiner {
|
|
||||||
minePow(ev: NostrEvent, target: number): Promise<NostrEvent> {
|
|
||||||
const res = pow(ev, target);
|
|
||||||
return Promise.resolve(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const hasWasm = "WebAssembly" in globalThis;
|
|
||||||
const DefaultPowWorker = hasWasm ? undefined : new PowWorker(PowWorkerURL);
|
|
||||||
export const GetPowWorker = () => (hasWasm ? new WasmPowWorker() : unwrap(DefaultPowWorker));
|
|
||||||
|
|
||||||
const indexedDB = Comlink.wrap(new IndexedDBWorker());
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Singleton nostr system
|
|
||||||
*/
|
|
||||||
export const System = new NostrSystem({
|
|
||||||
relayCache: UserRelays,
|
|
||||||
profileCache: UserCache,
|
|
||||||
relayMetrics: RelayMetrics,
|
|
||||||
optimizer: hasWasm ? WasmOptimizer : undefined,
|
|
||||||
db: SystemDb,
|
|
||||||
});
|
|
||||||
|
|
||||||
System.on("auth", async (c, r, cb) => {
|
|
||||||
const { id } = LoginStore.snapshot();
|
|
||||||
const pub = LoginStore.getPublisher(id);
|
|
||||||
if (pub) {
|
|
||||||
cb(await pub.nip42Auth(c, r));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
System.on("event", (_, ev) => {
|
|
||||||
addEventToFuzzySearch(ev);
|
|
||||||
socialGraphInstance.handleEvent(ev);
|
|
||||||
if (CONFIG.useIndexedDBEvents && socialGraphInstance.getFollowDistance(ev.pubkey) <= 2) {
|
|
||||||
indexedDB.handleEvent(ev);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (CONFIG.useIndexedDBEvents) {
|
|
||||||
// load all profiles
|
|
||||||
indexedDB.find(
|
|
||||||
{ kinds: [0] },
|
|
||||||
Comlink.proxy((e: TaggedNostrEvent) => System.HandleEvent(e)),
|
|
||||||
);
|
|
||||||
|
|
||||||
System.on("request", (filter: ReqFilter) => {
|
|
||||||
indexedDB.find(
|
|
||||||
filter,
|
|
||||||
Comlink.proxy((e: TaggedNostrEvent) => {
|
|
||||||
System.HandleEvent(e);
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchProfile(key: string) {
|
|
||||||
try {
|
|
||||||
throwIfOffline();
|
|
||||||
const rsp = await fetch(`${CONFIG.httpCache}/profile/${key}`);
|
|
||||||
if (rsp.ok) {
|
|
||||||
const data = (await rsp.json()) as NostrEvent;
|
|
||||||
if (data) {
|
|
||||||
return mapEventToProfile(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add profile loader fn
|
|
||||||
*/
|
|
||||||
if (CONFIG.httpCache) {
|
|
||||||
System.ProfileLoader.loaderFn = async (keys: Array<string>) => {
|
|
||||||
return removeUndefined(await Promise.all(keys.map(a => fetchProfile(a))));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Singleton user profile loader
|
|
||||||
*/
|
|
||||||
export const ProfileLoader = new ProfileLoaderService(System, UserCache);
|
|
||||||
|
|
||||||
serviceWorkerRegistration.register();
|
serviceWorkerRegistration.register();
|
||||||
|
|
||||||
async function initSite() {
|
async function initSite() {
|
||||||
|
90
packages/app/src/system.ts
Normal file
90
packages/app/src/system.ts
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import {
|
||||||
|
mapEventToProfile,
|
||||||
|
NostrEvent,
|
||||||
|
NostrSystem,
|
||||||
|
ProfileLoaderService,
|
||||||
|
ReqFilter,
|
||||||
|
socialGraphInstance,
|
||||||
|
TaggedNostrEvent,
|
||||||
|
} from "@snort/system";
|
||||||
|
import { RelayMetrics, SystemDb, UserCache, UserRelays } from "@/Cache";
|
||||||
|
import { hasWasm, WasmOptimizer } from "@/wasm";
|
||||||
|
import * as Comlink from "comlink";
|
||||||
|
import IndexedDBWorker from "@/Cache/IndexedDB?worker";
|
||||||
|
import { removeUndefined, throwIfOffline } from "@snort/shared";
|
||||||
|
import { LoginStore } from "@/Login";
|
||||||
|
import { addEventToFuzzySearch } from "@/FuzzySearch";
|
||||||
|
|
||||||
|
export const indexedDB = Comlink.wrap(new IndexedDBWorker());
|
||||||
|
/**
|
||||||
|
* Singleton nostr system
|
||||||
|
*/
|
||||||
|
export const System = new NostrSystem({
|
||||||
|
relayCache: UserRelays,
|
||||||
|
profileCache: UserCache,
|
||||||
|
relayMetrics: RelayMetrics,
|
||||||
|
optimizer: hasWasm ? WasmOptimizer : undefined,
|
||||||
|
db: SystemDb,
|
||||||
|
});
|
||||||
|
|
||||||
|
System.on("auth", async (c, r, cb) => {
|
||||||
|
const { id } = LoginStore.snapshot();
|
||||||
|
const pub = LoginStore.getPublisher(id);
|
||||||
|
if (pub) {
|
||||||
|
cb(await pub.nip42Auth(c, r));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
System.on("event", (_, ev) => {
|
||||||
|
addEventToFuzzySearch(ev);
|
||||||
|
socialGraphInstance.handleEvent(ev);
|
||||||
|
if (CONFIG.useIndexedDBEvents && socialGraphInstance.getFollowDistance(ev.pubkey) <= 2) {
|
||||||
|
indexedDB.handleEvent(ev);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (CONFIG.useIndexedDBEvents) {
|
||||||
|
// load all profiles
|
||||||
|
indexedDB.find(
|
||||||
|
{ kinds: [0] },
|
||||||
|
Comlink.proxy((e: TaggedNostrEvent) => System.HandleEvent(e)),
|
||||||
|
);
|
||||||
|
|
||||||
|
System.on("request", (filter: ReqFilter) => {
|
||||||
|
indexedDB.find(
|
||||||
|
filter,
|
||||||
|
Comlink.proxy((e: TaggedNostrEvent) => {
|
||||||
|
System.HandleEvent(e);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add profile loader fn
|
||||||
|
*/
|
||||||
|
if (CONFIG.httpCache) {
|
||||||
|
System.ProfileLoader.loaderFn = async (keys: Array<string>) => {
|
||||||
|
return removeUndefined(await Promise.all(keys.map(a => fetchProfile(a))));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function fetchProfile(key: string) {
|
||||||
|
try {
|
||||||
|
throwIfOffline();
|
||||||
|
const rsp = await fetch(`${CONFIG.httpCache}/profile/${key}`);
|
||||||
|
if (rsp.ok) {
|
||||||
|
const data = (await rsp.json()) as NostrEvent;
|
||||||
|
if (data) {
|
||||||
|
return mapEventToProfile(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton user profile loader
|
||||||
|
*/
|
||||||
|
export const ProfileLoader = new ProfileLoaderService(System, UserCache);
|
44
packages/app/src/wasm.ts
Normal file
44
packages/app/src/wasm.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import {
|
||||||
|
compress,
|
||||||
|
expand_filter,
|
||||||
|
flat_merge,
|
||||||
|
get_diff,
|
||||||
|
pow,
|
||||||
|
schnorr_verify_event,
|
||||||
|
default as wasmInit,
|
||||||
|
} from "@snort/system-wasm";
|
||||||
|
import WasmPath from "@snort/system-wasm/pkg/system_wasm_bg.wasm";
|
||||||
|
|
||||||
|
import { FlatReqFilter, NostrEvent, Optimizer, PowMiner, PowWorker, ReqFilter } from "@snort/system";
|
||||||
|
import PowWorkerURL from "@snort/system/src/pow-worker.ts?worker&url";
|
||||||
|
import { unwrap } from "@/SnortUtils";
|
||||||
|
|
||||||
|
export const WasmOptimizer = {
|
||||||
|
expandFilter: (f: ReqFilter) => {
|
||||||
|
return expand_filter(f) as Array<FlatReqFilter>;
|
||||||
|
},
|
||||||
|
getDiff: (prev: Array<ReqFilter>, next: Array<ReqFilter>) => {
|
||||||
|
return get_diff(prev, next) as Array<FlatReqFilter>;
|
||||||
|
},
|
||||||
|
flatMerge: (all: Array<FlatReqFilter>) => {
|
||||||
|
return flat_merge(all) as Array<ReqFilter>;
|
||||||
|
},
|
||||||
|
compress: (all: Array<ReqFilter>) => {
|
||||||
|
return compress(all) as Array<ReqFilter>;
|
||||||
|
},
|
||||||
|
schnorrVerify: ev => {
|
||||||
|
return schnorr_verify_event(ev);
|
||||||
|
},
|
||||||
|
} as Optimizer;
|
||||||
|
|
||||||
|
export class WasmPowWorker implements PowMiner {
|
||||||
|
minePow(ev: NostrEvent, target: number): Promise<NostrEvent> {
|
||||||
|
const res = pow(ev, target);
|
||||||
|
return Promise.resolve(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { wasmInit, WasmPath };
|
||||||
|
export const hasWasm = "WebAssembly" in globalThis;
|
||||||
|
const DefaultPowWorker = hasWasm ? undefined : new PowWorker(PowWorkerURL);
|
||||||
|
export const GetPowWorker = () => (hasWasm ? new WasmPowWorker() : unwrap(DefaultPowWorker));
|
Loading…
Reference in New Issue
Block a user