diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 9e42b31964..1a55fd34fa 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -38,7 +38,7 @@ jobs: - name: install npm uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Matrix - Node Install run: npm install working-directory: .github/workflows/support-files diff --git a/.github/workflows/build-ts-packages.yml b/.github/workflows/build-ts-packages.yml index ba744b1a65..1fb210bd8e 100644 --- a/.github/workflows/build-ts-packages.yml +++ b/.github/workflows/build-ts-packages.yml @@ -16,9 +16,15 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Setup yarn run: npm install -g yarn + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - name: Build run: yarn && yarn build && yarn build:ci - name: Deploy branch to CI www (storybook) diff --git a/.github/workflows/cd-dev.yml b/.github/workflows/cd-dev.yml index ab5dd75f21..0ca463345f 100644 --- a/.github/workflows/cd-dev.yml +++ b/.github/workflows/cd-dev.yml @@ -16,7 +16,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: "16" + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/cd-docs.yml b/.github/workflows/cd-docs.yml index 6e7882785a..782a2c196d 100644 --- a/.github/workflows/cd-docs.yml +++ b/.github/workflows/cd-docs.yml @@ -16,7 +16,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: "16" + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/ci-dev.yml b/.github/workflows/ci-dev.yml index 39432c90e3..82068fce76 100644 --- a/.github/workflows/ci-dev.yml +++ b/.github/workflows/ci-dev.yml @@ -16,7 +16,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: "16" + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index e18370669d..2523013204 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -16,7 +16,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: "16" + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/connect-desktop-ci.yml b/.github/workflows/connect-desktop-ci.yml index 5846212222..569203cfff 100644 --- a/.github/workflows/connect-desktop-ci.yml +++ b/.github/workflows/connect-desktop-ci.yml @@ -20,7 +20,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Yarn run: npm install -g yarn - run: yarn diff --git a/.github/workflows/network-explorer-lint.yml b/.github/workflows/network-explorer-lint.yml deleted file mode 100644 index 35c07e654d..0000000000 --- a/.github/workflows/network-explorer-lint.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Linting for Network Explorer (eslint/prettier) - -on: - pull_request: - paths: - - 'explorer/**' - -defaults: - run: - working-directory: explorer - -jobs: - build: - runs-on: custom-runner-linux - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v3 - with: - node-version: 16 - - name: Setup yarn - run: npm install -g yarn - - name: Run ESLint - # GitHub should automatically annotate the PR - run: yarn && yarn lint \ No newline at end of file diff --git a/.github/workflows/network-explorer.yml b/.github/workflows/network-explorer.yml index 9f50548105..b4431b0ed4 100644 --- a/.github/workflows/network-explorer.yml +++ b/.github/workflows/network-explorer.yml @@ -21,7 +21,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Setup yarn run: npm install -g yarn continue-on-error: true diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 64b95f6368..1ee391d6a7 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -152,7 +152,7 @@ jobs: uses: actions/setup-node@v3 if: env.WORKFLOW_CONCLUSION == 'failure' with: - node-version: 16 + node-version: 18 - name: Matrix - Node Install if: env.WORKFLOW_CONCLUSION == 'failure' run: npm install diff --git a/.github/workflows/nightly_build_release.yml b/.github/workflows/nightly_build_release.yml index 71b7df2bd7..fa1c465c97 100644 --- a/.github/workflows/nightly_build_release.yml +++ b/.github/workflows/nightly_build_release.yml @@ -167,7 +167,7 @@ jobs: uses: actions/setup-node@v3 if: env.WORKFLOW_CONCLUSION == 'failure' with: - node-version: 16 + node-version: 18 - name: Matrix - Node Install if: env.WORKFLOW_CONCLUSION == 'failure' run: npm install diff --git a/.github/workflows/nightly_build_release2.yml b/.github/workflows/nightly_build_release2.yml index ee85a1c978..3c3f962582 100644 --- a/.github/workflows/nightly_build_release2.yml +++ b/.github/workflows/nightly_build_release2.yml @@ -167,7 +167,7 @@ jobs: uses: actions/setup-node@v3 if: env.WORKFLOW_CONCLUSION == 'failure' with: - node-version: 16 + node-version: 18 - name: Matrix - Node Install if: env.WORKFLOW_CONCLUSION == 'failure' run: npm install diff --git a/.github/workflows/nym-connect-publish-macos.yml b/.github/workflows/nym-connect-publish-macos.yml index 0c9b33e416..379443d4dd 100644 --- a/.github/workflows/nym-connect-publish-macos.yml +++ b/.github/workflows/nym-connect-publish-macos.yml @@ -23,7 +23,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/nym-connect-publish-ubuntu.yml b/.github/workflows/nym-connect-publish-ubuntu.yml index 473371c9e0..25d288581d 100644 --- a/.github/workflows/nym-connect-publish-ubuntu.yml +++ b/.github/workflows/nym-connect-publish-ubuntu.yml @@ -29,7 +29,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/nym-connect-publish-windows10.yml b/.github/workflows/nym-connect-publish-windows10.yml index 7bd0ac1bc6..4a869caf3e 100644 --- a/.github/workflows/nym-connect-publish-windows10.yml +++ b/.github/workflows/nym-connect-publish-windows10.yml @@ -42,7 +42,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/nym-wallet-publish-macos.yml b/.github/workflows/nym-wallet-publish-macos.yml index d3ef82759e..81c27a8338 100644 --- a/.github/workflows/nym-wallet-publish-macos.yml +++ b/.github/workflows/nym-wallet-publish-macos.yml @@ -23,7 +23,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/nym-wallet-publish-ubuntu.yml b/.github/workflows/nym-wallet-publish-ubuntu.yml index 2b5a55c37a..1f2bb0330d 100644 --- a/.github/workflows/nym-wallet-publish-ubuntu.yml +++ b/.github/workflows/nym-wallet-publish-ubuntu.yml @@ -28,7 +28,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/nym-wallet-publish-windows10.yml b/.github/workflows/nym-wallet-publish-windows10.yml index 53411b7571..044816953b 100644 --- a/.github/workflows/nym-wallet-publish-windows10.yml +++ b/.github/workflows/nym-wallet-publish-windows10.yml @@ -42,7 +42,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install Rust stable uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/nym-wallet-storybook.yml b/.github/workflows/nym-wallet-storybook.yml index e98fe5e338..88f1230895 100644 --- a/.github/workflows/nym-wallet-storybook.yml +++ b/.github/workflows/nym-wallet-storybook.yml @@ -16,19 +16,9 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Setup yarn run: npm install -g yarn - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - name: Install wasm-pack - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - working-directory: clients/webassembly - - name: Build WASM - run: wasm-pack build - working-directory: clients/webassembly - name: Build dependencies run: yarn && yarn build - name: Build storybook diff --git a/.github/workflows/nym_wallet.yml b/.github/workflows/nym_wallet.yml index 4b921ffb7a..d110314899 100644 --- a/.github/workflows/nym_wallet.yml +++ b/.github/workflows/nym_wallet.yml @@ -37,7 +37,7 @@ jobs: - name: Node v16 uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Install yarn for building application run: yarn install diff --git a/.github/workflows/support-files/.nvmrc b/.github/workflows/support-files/.nvmrc index b6a7d89c68..3c032078a4 100644 --- a/.github/workflows/support-files/.nvmrc +++ b/.github/workflows/support-files/.nvmrc @@ -1 +1 @@ -16 +18 diff --git a/.github/workflows/typescript-lint.yml b/.github/workflows/typescript-lint.yml index 347d9ea0f0..b473107386 100644 --- a/.github/workflows/typescript-lint.yml +++ b/.github/workflows/typescript-lint.yml @@ -11,6 +11,7 @@ on: - 'nym-connect/mobile/package.json' - 'nym-wallet/src/**' - 'nym-wallet/package.json' + - 'explorer/**' pull_request: paths: - 'ts-packages/**' @@ -21,6 +22,7 @@ on: - 'nym-connect/mobile/package.json' - 'nym-wallet/src/**' - 'nym-wallet/package.json' + - 'explorer/**' jobs: build: @@ -33,7 +35,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - name: Setup yarn run: npm install -g yarn - name: Install Rust stable @@ -42,10 +44,6 @@ jobs: toolchain: stable - name: Install wasm-pack run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - working-directory: clients/webassembly - - name: Build WASM - run: wasm-pack build - working-directory: clients/webassembly - name: Install run: yarn - name: Build packages diff --git a/clients/validator/.nvmrc b/clients/validator/.nvmrc index 19c7bdba7b..25bf17fc5a 100644 --- a/clients/validator/.nvmrc +++ b/clients/validator/.nvmrc @@ -1 +1 @@ -16 \ No newline at end of file +18 \ No newline at end of file diff --git a/explorer/.nvmrc b/explorer/.nvmrc index b6a7d89c68..3c032078a4 100644 --- a/explorer/.nvmrc +++ b/explorer/.nvmrc @@ -1 +1 @@ -16 +18 diff --git a/lerna.json b/lerna.json index 5d17094fd5..851bdf0b54 100644 --- a/lerna.json +++ b/lerna.json @@ -1,10 +1,4 @@ { - "packages": [ - "ts-packages/*", - "nym-wallet", - "nym-connect/**", - "sdk/typescript/examples/docs", - "sdk/typescript/packages/**" - ], - "version": "0.0.0" + "version": "0.0.0", + "useWorkspaces": true } diff --git a/nym-connect/desktop/.nvmrc b/nym-connect/desktop/.nvmrc index da2d3988d7..25bf17fc5a 100644 --- a/nym-connect/desktop/.nvmrc +++ b/nym-connect/desktop/.nvmrc @@ -1 +1 @@ -14 \ No newline at end of file +18 \ No newline at end of file diff --git a/nym-connect/mobile/.nvmrc b/nym-connect/mobile/.nvmrc index da2d3988d7..25bf17fc5a 100644 --- a/nym-connect/mobile/.nvmrc +++ b/nym-connect/mobile/.nvmrc @@ -1 +1 @@ -14 \ No newline at end of file +18 \ No newline at end of file diff --git a/nym-wallet/.nvmrc b/nym-wallet/.nvmrc index 19c7bdba7b..25bf17fc5a 100644 --- a/nym-wallet/.nvmrc +++ b/nym-wallet/.nvmrc @@ -1 +1 @@ -16 \ No newline at end of file +18 \ No newline at end of file diff --git a/nym-wallet/package.json b/nym-wallet/package.json index 4308313fe7..d6c7cdf442 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -31,6 +31,7 @@ "@nymproject/mui-theme": "^1.0.0", "@nymproject/react": "^1.0.0", "@nymproject/types": "^1.0.0", + "@nymproject/sdk": "1", "@storybook/react": "^6.5.15", "@tauri-apps/api": "^1.2.0", "@tauri-apps/tauri-forage": "^1.0.0-beta.2", @@ -41,7 +42,6 @@ "lodash": "^4.17.21", "notistack": "^2.0.3", "npm-run-all": "^4.1.5", - "nym-client-wasm": "1.1.1", "qrcode.react": "^1.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/nym-wallet/src/components/TestNode/Packets.tsx b/nym-wallet/src/components/TestNode/Packets.tsx index 46ee86bae1..dfbc4d7144 100644 --- a/nym-wallet/src/components/TestNode/Packets.tsx +++ b/nym-wallet/src/components/TestNode/Packets.tsx @@ -1,6 +1,6 @@ import React from 'react'; +import { TestStatus } from '@nymproject/sdk'; import { Divider, Typography } from '@mui/material'; -import { TestStatus } from 'src/pages/bonding/node-settings/node-test/types'; import { ResultsCard, ResultsCardDetail } from './ResultsCard'; export const Packets = ({ diff --git a/nym-wallet/src/components/TestNode/PrintResults.tsx b/nym-wallet/src/components/TestNode/PrintResults.tsx index 1395d2b575..c225d73708 100644 --- a/nym-wallet/src/components/TestNode/PrintResults.tsx +++ b/nym-wallet/src/components/TestNode/PrintResults.tsx @@ -1,8 +1,8 @@ import React, { useEffect } from 'react'; import { Card, CardContent, CardHeader, Dialog, Divider } from '@mui/material'; import { NymLogo } from '@nymproject/react/logo/NymLogo'; -import { ResultsCardDetail } from './ResultsCard'; import { sleep } from 'src/utils/sleep'; +import { ResultsCardDetail } from './ResultsCard'; export const PrintResults = ({ packetsSent, @@ -30,7 +30,7 @@ export const PrintResults = ({ asyncPrint(); window.addEventListener('afterprint', OnPrintRequestComplete); - () => window.removeEventListener('afterprint', OnPrintRequestComplete); + return () => window.removeEventListener('afterprint', OnPrintRequestComplete); }, []); return ( diff --git a/nym-wallet/src/components/TestNode/Results.tsx b/nym-wallet/src/components/TestNode/Results.tsx index 0ed14a814c..58856801b3 100644 --- a/nym-wallet/src/components/TestNode/Results.tsx +++ b/nym-wallet/src/components/TestNode/Results.tsx @@ -1,7 +1,6 @@ import React from 'react'; +import { TestStatus } from '@nymproject/sdk'; import { Grid } from '@mui/material'; - -import { TestStatus } from 'src/pages/bonding/node-settings/node-test/types'; import { Packets } from './Packets'; import { NodeScore } from './NodeScore'; import { Overview } from './Overview'; diff --git a/nym-wallet/src/pages/bonding/node-settings/node-test/__mocks__.ts b/nym-wallet/src/pages/bonding/node-settings/node-test/__mocks__.ts deleted file mode 100644 index c7a846d87a..0000000000 --- a/nym-wallet/src/pages/bonding/node-settings/node-test/__mocks__.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { WasmGateway, WasmMixNode, WasmNymTopology } from 'nym-client-wasm'; - -export const createDummyTopology = () => { - const l1Mixnode = new WasmMixNode( - 1, - 'n1fzv4jc7fanl9s0qj02ge2ezk3kts545kjtek47', - '178.79.143.65', - 1789, - '4Yr4qmEHd9sgsuQ83191FR2hD88RfsbMmB4tzhhZWriz', - '8ndjk5oZ6HxUZNScLJJ7hk39XtUqGexdKgW7hSX6kpWG', - 1, - '1.10.0', - ); - - const l2Mixnode = new WasmMixNode( - 2, - 'n1z93z44vf8ssvdhujjvxcj4rd5e3lz0l60wdk70', - '109.74.197.180', - 1789, - '7sVjiMrPYZrDWRujku9QLxgE8noT7NTgBAqizCsu7AoK', - 'GepXwRnKZDd8x2nBWAajGGBVvF3mrpVMQBkgfrGuqRCN', - 2, - '1.10.0', - ); - - const l3Mixnode = new WasmMixNode( - 3, - 'n1ptg680vnmef2cd8l0s9uyc4f0hgf3x8sed6w77', - '176.58.101.80', - 1789, - 'FoM5Mx9Pxk1g3zEqkS3APgtBeTtTo3M8k7Yu4bV6kK1R', - 'DeYjrDC2AcQRVFshiKnbUo6bRvPyZ33QGYR2DLeFJ9qD', - 3, - '1.10.0', - ); - - const gateway = new WasmGateway( - 'n16evnn8glr0sham3matj8rg2s24m6x56ayk87ts', - '85.159.212.96', - 1789, - 9000, - '336yuXAeGEgedRfqTJZsG2YV7P13QH1bHv1SjCZYarc9', - 'BtYjoWihiuFihGKQypmpSspbhmWDPxzqeTVSd8ciCpWL', - '1.10.1', - ); - - const mixnodes = new Map(); - mixnodes.set(1, [l1Mixnode]); - mixnodes.set(2, [l2Mixnode]); - mixnodes.set(3, [l3Mixnode]); - - const gateways = [gateway]; - - return new WasmNymTopology(mixnodes, gateways); -}; diff --git a/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx b/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx index e141d5f69c..7670fe1dcd 100644 --- a/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx +++ b/nym-wallet/src/pages/bonding/node-settings/node-test/index.tsx @@ -1,19 +1,20 @@ -import React, { useContext, useEffect, useRef, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import { Box, Button } from '@mui/material'; +import { Download } from '@mui/icons-material'; +import { NodeTestResultResponse, NodeTester, TestStatus, createNodeTesterClient } from '@nymproject/sdk'; +import { format } from 'date-fns'; import { AppContext, useBondingContext } from 'src/context'; import { LoadingModal } from 'src/components/Modals/LoadingModal'; import { Results } from 'src/components/TestNode/Results'; import { ErrorModal } from 'src/components/Modals/ErrorModal'; import { PrintResults } from 'src/components/TestNode/PrintResults'; -import { Download } from '@mui/icons-material'; -import { format } from 'date-fns'; -import { NodeTestEvent, NodeTestResult, TestStatus } from './types'; +import { MAINNET_VALIDATOR_URL, QA_VALIDATOR_URL } from 'src/constants'; export const NodeTestPage = () => { - const [nodeTestWorker, setNodeTestWorker] = useState(); + const [nodeTestClient, setNodeTestClient] = useState(); const [error, setError] = useState(); const [isLoading, setIsLoading] = useState(false); - const [results, setResults] = useState(); + const [results, setResults] = useState(); const [printResults, setPrintResults] = useState(false); const [testDate, setTestDate] = useState(); @@ -23,15 +24,6 @@ export const NodeTestPage = () => { const { network } = useContext(AppContext); const { bondedNode } = useBondingContext(); - const loadWorker = () => { - try { - const worker: Worker = new Worker(new URL('./worker.ts', import.meta.url)); - setNodeTestWorker(worker); - } catch (e) { - setError('Error loading worker'); - } - }; - const handleTestTimeout = () => { clearTimeout(timerRef.current); timerRef.current = setTimeout(() => { @@ -43,56 +35,52 @@ export const NodeTestPage = () => { }, 15000); }; - const handleWorkerMessages = (ev: MessageEvent) => { - const eventKind = ev.data.kind; - - if (eventKind === 'Error') { - setError(ev.data.args.message); - testStateRef.current = 'Stopped'; - } - if (eventKind === 'DisplayTesterResults') { - setResults(ev.data.args.result); - testStateRef.current = 'Complete'; - } - setIsLoading(false); - }; - const handleTestNode = async () => { - setError(undefined); - setResults(undefined); - setIsLoading(true); - setTestDate(format(new Date(), 'dd/MM/yyyy HH:mm')); - - if (nodeTestWorker) { + if (nodeTestClient && bondedNode) { + setResults(undefined); + setTestDate(format(new Date(), 'dd/MM/yyyy HH:mm')); + setIsLoading(true); + setError(undefined); testStateRef.current = 'Running'; - nodeTestWorker.postMessage({ - kind: 'TestPacket', - args: { - mixnodeIdentity: bondedNode?.identityKey, - network, - }, - } as NodeTestEvent); handleTestTimeout(); + try { + const result = await nodeTestClient.tester.startTest(bondedNode.identityKey); + setResults(result); + testStateRef.current = 'Complete'; + } catch (e) { + setError('Node test failed, please try again'); + testStateRef.current = 'Stopped'; + console.log(e); + } finally { + setIsLoading(false); + } } }; - useEffect(() => { - loadWorker(); - - return () => { - if (nodeTestWorker) { - nodeTestWorker.terminate(); - } - }; + const loadNodeTestClient = useCallback(async () => { + try { + const nodeTesterId = new Date().toISOString(); // make a new tester id for each session + const validator = network === 'MAINNET' ? MAINNET_VALIDATOR_URL : QA_VALIDATOR_URL; + const client = await createNodeTesterClient(); + await client.tester.init(validator, nodeTesterId); + setNodeTestClient(client); + } catch (e) { + console.log(e); + setError('Failed to load node tester client, please try again'); + } }, []); useEffect(() => { - if (nodeTestWorker) { - nodeTestWorker.addEventListener('message', (e) => handleWorkerMessages(e)); - } + loadNodeTestClient(); - return () => nodeTestWorker?.removeEventListener('message', handleWorkerMessages); - }, [nodeTestWorker]); + return () => { + clearTimeout(timerRef.current); + if (nodeTestClient) { + nodeTestClient.tester.disconnectFromGateway(); + nodeTestClient.terminate(); + } + }; + }, [loadNodeTestClient]); return ( diff --git a/nym-wallet/src/pages/bonding/node-settings/node-test/types.ts b/nym-wallet/src/pages/bonding/node-settings/node-test/types.ts deleted file mode 100644 index a15abf8620..0000000000 --- a/nym-wallet/src/pages/bonding/node-settings/node-test/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Network } from 'src/types'; - -export type NodeTestResult = { - score: number; - sentPackets: number; - receivedPackets: number; - receivedAcks: number; - duplicatePackets: number; - duplicateAcks: number; -}; - -type Error = { - kind: 'Error'; - args: { message: string }; -}; - -type WorkerLoaded = { - kind: 'WorkerLoaded'; -}; - -type DisplayTesterResults = { - kind: 'DisplayTesterResults'; - args: { - result: NodeTestResult; - }; -}; - -type TestPacket = { - kind: 'TestPacket'; - args: { - mixnodeIdentity: string; - network: Network; - }; -}; - -export type TestStatus = 'Stopped' | 'Running' | 'Complete'; - -export type NodeTestEvent = Error | DisplayTesterResults | TestPacket | WorkerLoaded; diff --git a/nym-wallet/src/pages/bonding/node-settings/node-test/worker.ts b/nym-wallet/src/pages/bonding/node-settings/node-test/worker.ts deleted file mode 100644 index 61c8b18bb9..0000000000 --- a/nym-wallet/src/pages/bonding/node-settings/node-test/worker.ts +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2020-2023 Nym Technologies SA -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* eslint-disable no-restricted-globals */ -import { NymNodeTester, set_panic_hook, current_network_topology, NodeTestResult } from 'nym-client-wasm'; -import { Network } from 'src/types'; -import { NodeTestEvent } from './types'; -import { MAINNET_VALIDATOR_URL, QA_VALIDATOR_URL } from 'src/constants'; - -console.log('Initializing worker'); - -const postMessage = (data: NodeTestEvent) => self.postMessage(data); - -postMessage({ - kind: 'WorkerLoaded', -}); - -const printAndDisplayTestResult = (result: NodeTestResult) => { - result.log_details(); - - postMessage({ - kind: 'DisplayTesterResults', - args: { - result: { - score: result.score(), - sentPackets: result.sent_packets, - receivedPackets: result.received_packets, - receivedAcks: result.received_acks, - duplicatePackets: result.duplicate_packets, - duplicateAcks: result.duplicate_acks, - }, - }, - }); -}; - -const buildTester = async (network: Network) => { - const validator = network === 'QA' ? QA_VALIDATOR_URL : MAINNET_VALIDATOR_URL; - const topology = await current_network_topology(validator); - const nodeTester = await new NymNodeTester(topology, network); - - return nodeTester; -}; - -async function testNode() { - self.onmessage = async (event: MessageEvent) => { - const eventKind = event.data.kind; - - switch (eventKind) { - case 'TestPacket': { - const { mixnodeIdentity, network } = event.data.args; - const nodeTester = await buildTester(network); - - try { - console.log(`Testing mixnode identity: ${mixnodeIdentity}, on network: ${network}.`); - const result = await nodeTester.test_node(mixnodeIdentity); - - printAndDisplayTestResult(result); - - await nodeTester.disconnect_from_gateway(); - console.log('Disconnected from gateway'); - } catch (e) { - const errorMessage = e instanceof Error ? e.message : 'Node test error'; - console.log(errorMessage); - - nodeTester.disconnect_from_gateway(); - - postMessage({ - kind: 'Error', - args: { message: errorMessage }, - }); - } - break; - } - default: - return undefined; - } - - return undefined; - }; -} - -async function main() { - // sets up better stack traces in case of in-rust panics - set_panic_hook(); - - // run test on simplified and dedicated tester: - await testNode(); -} - -// Let's get started! -main(); diff --git a/package.json b/package.json index 95b111b2f1..58d32165d3 100644 --- a/package.json +++ b/package.json @@ -10,14 +10,14 @@ "nym-connect/**", "explorer", "types", - "clients/validator", - "clients/webassembly/**" + "clients/validator" ], "scripts": { "clean": "lerna run clean", "build": "run-s build:types build:packages", "build:types": "lerna run --scope @nymproject/types build --stream", - "build:packages": "run-s build:packages:theme build:packages:react", + "build:packages": "run-s build:packages:theme build:packages:react build:packages:sdk", + "build:packages:sdk": "lerna run --scope @nymproject/sdk build:lint", "build:packages:theme": "lerna run --scope @nymproject/mui-theme build", "build:packages:react": "lerna run --scope @nymproject/react build", "build:react-example": "lerna run --scope @nymproject/react-webpack-with-theme-example build --stream", @@ -28,7 +28,9 @@ "lint:fix": "lerna run lint:fix --stream", "tsc": "lerna run tsc --stream", "types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app", - "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run" + "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run", + "preinstall": "yarn install:copy-placeholders", + "install:copy-placeholders": "cp scripts/build/yarn/wasm-placeholder/package.json sdk/typescript/packages/nym-client-wasm" }, "devDependencies": { "lerna": "^6.6.2", diff --git a/scripts/build/yarn/wasm-placeholder/package.json b/scripts/build/yarn/wasm-placeholder/package.json new file mode 100644 index 0000000000..50f57bc30d --- /dev/null +++ b/scripts/build/yarn/wasm-placeholder/package.json @@ -0,0 +1,5 @@ +{ + "name": "@nymproject/nym-client-wasm", + "version": "1.0.0", + "sideEffects": false +} diff --git a/sdk/typescript/.eslintrc.js b/sdk/typescript/.eslintrc.js index 040935b3bd..52bd4fe9a9 100644 --- a/sdk/typescript/.eslintrc.js +++ b/sdk/typescript/.eslintrc.js @@ -27,7 +27,7 @@ module.exports = { 'plugin:jest/recommended', 'plugin:jest/style', ], - ignorePatterns: ['dist/**/*', 'dist', 'node_modules', '**/wasm/worker.js'], + ignorePatterns: ['dist/**/*', 'dist', 'node_modules', '**/worker.js'], rules: { 'jest/prefer-strict-equal': 'error', 'jest/prefer-to-have-length': 'warn', diff --git a/sdk/typescript/examples/node-tester/plain-html/.babelrc b/sdk/typescript/examples/node-tester/plain-html/.babelrc new file mode 100644 index 0000000000..85e1f1ba26 --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/env", "@babel/react"] +} \ No newline at end of file diff --git a/sdk/typescript/examples/node-tester/plain-html/README.md b/sdk/typescript/examples/node-tester/plain-html/README.md new file mode 100644 index 0000000000..a255725316 --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/README.md @@ -0,0 +1,14 @@ +# HTML Nyn Node Test + +This is an example of using the Nym Mixnet node tester. + +You can use this example as a seed for a new project. + +## Running the example + +Try out the node tester app by running: + +``` +npm install +npm start +``` diff --git a/sdk/typescript/examples/node-tester/plain-html/jest.config.js b/sdk/typescript/examples/node-tester/plain-html/jest.config.js new file mode 100644 index 0000000000..e86e13bab9 --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', +}; diff --git a/sdk/typescript/examples/node-tester/plain-html/package.json b/sdk/typescript/examples/node-tester/plain-html/package.json new file mode 100644 index 0000000000..a3befe83ea --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/package.json @@ -0,0 +1,61 @@ +{ + "name": "@nymproject/sdk-example-node-tester-plain-html", + "description": "An example project that uses WASM node tester and plain HTML", + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "@babel/core": "^7.15.0", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/preset-env": "^7.15.0", + "@babel/preset-typescript": "^7.15.0", + "@types/jest": "^27.0.1", + "@types/node": "^16.7.13", + "@typescript-eslint/eslint-plugin": "^5.13.0", + "@typescript-eslint/parser": "^5.13.0", + "babel-loader": "^8.3.0", + "babel-plugin-root-import": "^5.1.0", + "clean-webpack-plugin": "^4.0.0", + "css-loader": "^6.7.3", + "css-minimizer-webpack-plugin": "^3.0.2", + "dotenv-webpack": "^7.0.3", + "eslint": "^8.10.0", + "eslint-config-airbnb": "^19.0.4", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-root-import": "^1.0.4", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^26.1.1", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "^7.2.1", + "html-webpack-plugin": "^5.3.2", + "jest": "^27.1.0", + "mini-css-extract-plugin": "^2.2.2", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.7", + "style-loader": "^3.3.1", + "thread-loader": "^3.0.4", + "ts-jest": "^27.0.5", + "ts-loader": "^9.4.2", + "tsconfig-paths-webpack-plugin": "^3.5.2", + "typescript": "^4.6.2", + "url-loader": "^4.1.1", + "webpack": "^5.75.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.5.0", + "webpack-merge": "^5.8.0" + }, + "scripts": { + "start": "webpack serve --progress --port 3000", + "build": "webpack build --progress --config webpack.prod.js", + "build:dev": "webpack build --progress", + "build:serve": "npx serve dist", + "test": "jest", + "test:watch": "jest --watch", + "tsc": "tsc", + "tsc:watch": "tsc --watch", + "lint": "eslint src", + "lint:fix": "eslint src --fix" + } +} diff --git a/sdk/typescript/examples/node-tester/plain-html/src/index.html b/sdk/typescript/examples/node-tester/plain-html/src/index.html new file mode 100644 index 0000000000..ccac6e2365 --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/src/index.html @@ -0,0 +1,29 @@ + + + + + + + Nym WebAssembly Demo + + + +

+ +

+

+ + + + +

+ +

Test a mixnode by entering the mixnode id above and click the Test button

+ +
+

+

+

+ + + diff --git a/sdk/typescript/examples/node-tester/plain-html/src/index.ts b/sdk/typescript/examples/node-tester/plain-html/src/index.ts new file mode 100644 index 0000000000..a2946ba079 --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/src/index.ts @@ -0,0 +1,116 @@ +import { createNodeTesterClient, NodeTester } from '@nymproject/sdk'; + +let nodeTester: NodeTester | null = null; + +/** + * Display messages that have been sent up the websocket. Colours them blue. + * + * @param {string} message + */ +function displayOutput(message: string, color?: string) { + const timestamp = new Date().toISOString().substr(11, 12); + + const sendDiv = document.createElement('div'); + const paragraph = document.createElement('p'); + paragraph.setAttribute('style', `color: ${color || 'blue'}`); + const paragraphContent = document.createTextNode(`${timestamp} >>> ${message}`); + paragraph.appendChild(paragraphContent); + + sendDiv.appendChild(paragraph); + document.getElementById('output')?.appendChild(sendDiv); +} + +/** + * The main entry point + */ +async function main() { + nodeTester = await createNodeTesterClient(); + + // add node tester to the Window globally, so that it can be used from the dev tools console + (window as any).nodeTester = nodeTester; + + if (!nodeTester) { + console.error('Oh no! Could not the node test'); + return; + } + + const nymApiUrl = 'https://validator.nymtech.net/api'; + const nodeTesterId = new Date().toISOString(); // make a new tester id for each session + await nodeTester.tester.init(nymApiUrl, nodeTesterId); + + const mixnodes = await (await fetch(`${nymApiUrl}/v1/mixnodes/active`)).json(); + + const exampleMixnodeIdentityKey = mixnodes[0].bond_information.mix_node.identity_key; + + const sendButton: HTMLButtonElement = document.querySelector('#send-button') as HTMLButtonElement; + const reconnectButton: HTMLButtonElement = document.querySelector('#reconnect-button') as HTMLButtonElement; + const disconnectButton: HTMLButtonElement = document.querySelector('#disconnect-button') as HTMLButtonElement; + const terminateButton: HTMLButtonElement = document.querySelector('#terminate-button') as HTMLButtonElement; + + const mixnodeIdInput = document.getElementById('mixnodeId') as HTMLFormElement; + + mixnodeIdInput.value = exampleMixnodeIdentityKey; + + reconnectButton.onclick = async function () { + try { + await nodeTester?.tester.reconnectToGateway(); + } catch (e: any) { + console.error('Error', e); + displayOutput(`ERROR: ${e.message}`, 'red'); + } + }; + + disconnectButton.onclick = async function () { + try { + await nodeTester?.tester.disconnectFromGateway(); + } catch (e: any) { + console.error('Error', e); + displayOutput(`ERROR: ${e.message}`, 'red'); + } + }; + + terminateButton.onclick = async function () { + try { + await nodeTester?.terminate(); + } catch (e: any) { + console.error('Error', e); + displayOutput(`ERROR: ${e.message}`, 'red'); + } + }; + + if (sendButton) { + sendButton.onclick = async function () { + const mixnodeId = mixnodeIdInput.value; + if (!nodeTester) { + displayOutput('ERROR: The node tester is not defined'); + console.error('The node tester is not defined'); + return; + } + if (!mixnodeId) { + displayOutput('ERROR: No mix id specified'); + console.error('No mix id specified'); + return; + } + + if (nodeTester && mixnodeId) { + displayOutput('Starting test...'); + try { + const response = await nodeTester.tester.startTest(mixnodeId); + displayOutput('Done!'); + if (response) { + displayOutput(JSON.stringify(response, null, 2), 'green'); + } + } catch (e: any) { + console.error('Error', e); + displayOutput(`ERROR: ${e.message}`, 'red'); + } + } + }; + } +} + +// wait for the html to load +window.addEventListener('DOMContentLoaded', () => { + // let's do this! + main(); +}); diff --git a/sdk/typescript/examples/node-tester/plain-html/tsconfig.json b/sdk/typescript/examples/node-tester/plain-html/tsconfig.json new file mode 100644 index 0000000000..86902367db --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "./dist" + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "build", "dist"] +} diff --git a/sdk/typescript/examples/node-tester/plain-html/tsconfig.prod.json b/sdk/typescript/examples/node-tester/plain-html/tsconfig.prod.json new file mode 100644 index 0000000000..cd04ae7aed --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/tsconfig.prod.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "outDir": "./dist", + "declaration": false + }, + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "build", "dist", "**/*.stories.*", "**/*.test.*", "**/*.spec.*"] +} diff --git a/sdk/typescript/examples/node-tester/plain-html/webpack.common.js b/sdk/typescript/examples/node-tester/plain-html/webpack.common.js new file mode 100644 index 0000000000..ae6ef6dc8e --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/webpack.common.js @@ -0,0 +1,30 @@ +const path = require('path'); +const { mergeWithRules } = require('webpack-merge'); +const { webpackCommon } = require('../../.webpack/webpack.base'); + +module.exports = mergeWithRules({ + module: { + rules: { + test: 'match', + use: 'replace', + }, + }, +})( + webpackCommon(__dirname, [ + { + inject: true, + filename: 'index.html', + template: path.resolve(__dirname, 'src/index.html'), + chunks: ['index'], + }, + ]), + { + entry: { + index: path.resolve(__dirname, 'src/index.ts'), + }, + output: { + path: path.resolve(__dirname, 'dist'), + publicPath: '/', + }, + }, +); diff --git a/sdk/typescript/examples/node-tester/plain-html/webpack.config.js b/sdk/typescript/examples/node-tester/plain-html/webpack.config.js new file mode 100644 index 0000000000..8c7288de81 --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/webpack.config.js @@ -0,0 +1,67 @@ +const { mergeWithRules } = require('webpack-merge'); +const webpack = require('webpack'); +const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); +const ReactRefreshTypeScript = require('react-refresh-typescript'); +const commonConfig = require('./webpack.common'); + +module.exports = mergeWithRules({ + module: { + rules: { + test: 'match', + use: 'replace', + }, + }, +})(commonConfig, { + mode: 'development', + devtool: 'inline-source-map', + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + options: { + getCustomTransformers: () => ({ + before: [ReactRefreshTypeScript()], + }), + // `ts-loader` does not work with HMR unless `transpileOnly` is used. + // If you need type checking, `ForkTsCheckerWebpackPlugin` is an alternative. + transpileOnly: true, + }, + }, + ], + }, + plugins: [ + new ReactRefreshWebpackPlugin(), + + // this can be included automatically by the dev server, however build mode fails if missing + new webpack.HotModuleReplacementPlugin(), + ], + + target: 'web', + + devServer: { + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + }, + historyApiFallback: true, + }, + + // recommended for faster rebuild + optimization: { + runtimeChunk: true, + removeAvailableModules: false, + removeEmptyChunks: false, + splitChunks: false, + }, + + cache: { + type: 'filesystem', + buildDependencies: { + // restart on config change + config: ['./webpack.config.js'], + }, + }, +}); diff --git a/sdk/typescript/examples/node-tester/plain-html/webpack.prod.js b/sdk/typescript/examples/node-tester/plain-html/webpack.prod.js new file mode 100644 index 0000000000..c92239179a --- /dev/null +++ b/sdk/typescript/examples/node-tester/plain-html/webpack.prod.js @@ -0,0 +1,42 @@ +const { mergeWithRules } = require('webpack-merge'); +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const commonConfig = require('./webpack.common'); + +module.exports = mergeWithRules({ + module: { + rules: { + test: 'match', + use: 'replace', + }, + }, +})(commonConfig, { + mode: 'production', + + // TODO: no source maps, add back + devtool: false, + + module: { + rules: [ + { + test: /\.css$/, + use: [MiniCssExtractPlugin.loader, 'css-loader'], + }, + ], + }, + optimization: { + minimizer: ['...', new CssMinimizerPlugin()], + splitChunks: { + chunks: 'all', + }, + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: '[name].[contenthash].css', + }), + ], + output: { + pathinfo: false, + filename: '[name].[contenthash].js', + }, +}); diff --git a/sdk/typescript/examples/plain-html/tsconfig.prod.json b/sdk/typescript/examples/plain-html/tsconfig.prod.json index ea260ca2f9..2e8a618c0f 100644 --- a/sdk/typescript/examples/plain-html/tsconfig.prod.json +++ b/sdk/typescript/examples/plain-html/tsconfig.prod.json @@ -1,20 +1,10 @@ { - "extends": "../tsconfig.json", + "extends": "../../tsconfig.json", "compilerOptions": { "jsx": "react-jsx", "outDir": "./dist", "declaration": false }, - "include": [ - "src/**/*.ts", - "src/**/*.tsx" - ], - "exclude": [ - "node_modules", - "build", - "dist", - "**/*.stories.*", - "**/*.test.*", - "**/*.spec.*" - ] + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": ["node_modules", "build", "dist", "**/*.stories.*", "**/*.test.*", "**/*.spec.*"] } diff --git a/sdk/typescript/packages/sdk/.gitignore b/sdk/typescript/packages/sdk/.gitignore index f2883f65bd..6166d37c02 100644 --- a/sdk/typescript/packages/sdk/.gitignore +++ b/sdk/typescript/packages/sdk/.gitignore @@ -1 +1,2 @@ src/mixnet/wasm/worker.js +src/mixnet/node-tester/worker.js \ No newline at end of file diff --git a/sdk/typescript/packages/sdk/package.json b/sdk/typescript/packages/sdk/package.json index 7b05d365af..7b2b512f37 100644 --- a/sdk/typescript/packages/sdk/package.json +++ b/sdk/typescript/packages/sdk/package.json @@ -26,10 +26,12 @@ "build:only-this": "scripts/build-prod.sh", "prebuild:dev": "yarn build:dependencies", "build:dev": "yarn build:dev:only-this", - "build:dev:only-this": "scripts/build.sh" + "build:dev:only-this": "scripts/build.sh", + "build:lint": "run-s build:dependencies:nym-client-wasm build:dev:only-this" }, "dependencies": { "@npmcli/node-gyp": "^3.0.0", + "@nymproject/nym-client-wasm": "1", "comlink": "^4.3.1", "lerna": "^6.6.2", "node-gyp": "^9.3.1" diff --git a/sdk/typescript/packages/sdk/rollup-cjs.config.mjs b/sdk/typescript/packages/sdk/rollup-cjs.config.mjs index fdd081ab49..9f6d102d3d 100644 --- a/sdk/typescript/packages/sdk/rollup-cjs.config.mjs +++ b/sdk/typescript/packages/sdk/rollup-cjs.config.mjs @@ -3,9 +3,7 @@ import resolve from '@rollup/plugin-node-resolve'; import { wasm } from '@rollup/plugin-wasm'; import webWorkerLoader from 'rollup-plugin-web-worker-loader'; -const extensions = [ - '.js', '.jsx', '.ts', '.tsx', -]; +const extensions = ['.js', '.jsx', '.ts', '.tsx']; export default { input: 'src/index.ts', @@ -17,6 +15,9 @@ export default { webWorkerLoader({ targetPlatform: 'browser', inline: true }), resolve({ extensions }), wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), - typescript({ compilerOptions: { outDir: 'dist/cjs', target: 'es5' }, exclude: 'mixnet/wasm/worker.ts', }), + typescript({ + compilerOptions: { outDir: 'dist/cjs', target: 'es5' }, + exclude: ['mixnet/wasm/worker.ts', 'mixnet/node-tester/worker.ts'], + }), ], }; diff --git a/sdk/typescript/packages/sdk/rollup-esm.config.mjs b/sdk/typescript/packages/sdk/rollup-esm.config.mjs index 546188a9c3..3ad4c148fc 100644 --- a/sdk/typescript/packages/sdk/rollup-esm.config.mjs +++ b/sdk/typescript/packages/sdk/rollup-esm.config.mjs @@ -2,9 +2,7 @@ import typescript from '@rollup/plugin-typescript'; import resolve from '@rollup/plugin-node-resolve'; import webWorkerLoader from 'rollup-plugin-web-worker-loader'; -const extensions = [ - '.js', '.jsx', '.ts', '.tsx', -]; +const extensions = ['.js', '.jsx', '.ts', '.tsx']; export default { input: 'src/index.ts', @@ -15,6 +13,9 @@ export default { plugins: [ webWorkerLoader({ targetPlatform: 'browser', inline: true }), resolve({ extensions }), - typescript({ exclude: 'mixnet/wasm/worker.ts', compilerOptions: { outDir: 'dist/esm' } }), + typescript({ + exclude: ['mixnet/wasm/worker.ts', 'mixnet/node-tester/worker.ts'], + compilerOptions: { outDir: 'dist/esm' }, + }), ], }; diff --git a/sdk/typescript/packages/sdk/rollup-node-tester-worker.config.mjs b/sdk/typescript/packages/sdk/rollup-node-tester-worker.config.mjs new file mode 100644 index 0000000000..5f18e7ce33 --- /dev/null +++ b/sdk/typescript/packages/sdk/rollup-node-tester-worker.config.mjs @@ -0,0 +1,26 @@ +import typescript from '@rollup/plugin-typescript'; +import resolve from '@rollup/plugin-node-resolve'; +import { wasm } from '@rollup/plugin-wasm'; +import replace from '@rollup/plugin-replace'; + +const extensions = ['.js', '.jsx', '.ts', '.tsx']; + +export default { + input: 'src/mixnet/node-tester/worker.ts', + output: { + dir: 'dist', + format: 'cjs', + }, + plugins: [ + resolve({ extensions }), + // this is some nasty monkey patching that removes the WASM URL (because it is handled by the `wasm` plugin) + replace({ + values: { "input = new URL('nym_client_wasm_bg.wasm', import.meta.url);": 'input = undefined;' }, + delimiters: ['', ''], + preventAssignment: true, + }), + // force the wasm plugin to embed the wasm bundle - this means no downstream bundlers have to worry about handling it + wasm({ maxFileSize: 10000000, targetEnv: 'browser' }), + typescript({ compilerOptions: { declaration: false, target: 'es5' } }), + ], +}; diff --git a/sdk/typescript/packages/sdk/scripts/build.sh b/sdk/typescript/packages/sdk/scripts/build.sh index 8440a3adda..d2763969e7 100755 --- a/sdk/typescript/packages/sdk/scripts/build.sh +++ b/sdk/typescript/packages/sdk/scripts/build.sh @@ -7,7 +7,7 @@ set -o pipefail rm -rf dist || true #------------------------------------------------------- -# WEB WORKER +# WEB WORKER (WASM client) #------------------------------------------------------- # The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies # must be included in the worker script (because it is not loaded as an ES Module) @@ -19,6 +19,19 @@ rollup -c rollup-worker.config.mjs rm -f src/mixnet/wasm/worker.js mv dist/worker.js src/mixnet/wasm/worker.js +#------------------------------------------------------- +# WEB WORKER (Node tester) +#------------------------------------------------------- +# The web worker needs to be bundled because the WASM bundle needs to be loaded synchronously and all dependencies +# must be included in the worker script (because it is not loaded as an ES Module) + +# build the worker +rollup -c rollup-node-tester-worker.config.mjs + +# move it next to the Typescript `mixnet/node-tester/index.ts` so it can be inlined by rollup +rm -f src/mixnet/node-tester/worker.js +mv dist/worker.js src/mixnet/node-tester/worker.js + #------------------------------------------------------- # ESM #------------------------------------------------------- diff --git a/sdk/typescript/packages/sdk/src/mixnet/index.ts b/sdk/typescript/packages/sdk/src/mixnet/index.ts index 3c4c661762..2fb66914e6 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/index.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/index.ts @@ -1,2 +1,4 @@ export * from './wasm'; export * from './wasm/types'; +export * from './node-tester'; +export * from './node-tester/types'; diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/constants.ts b/sdk/typescript/packages/sdk/src/mixnet/node-tester/constants.ts new file mode 100644 index 0000000000..55770cd39b --- /dev/null +++ b/sdk/typescript/packages/sdk/src/mixnet/node-tester/constants.ts @@ -0,0 +1,5 @@ +const QA_VALIDATOR_URL = 'https://qa-nym-api.qa.nymte.ch/api'; +const QWERTY_VALIDATOR_URL = 'https://qwerty-validator-api.qa.nymte.ch/api'; +const MAINNET_VALIDATOR_URL = 'https://validator.nymtech.net/api/'; + +export { QA_VALIDATOR_URL, QWERTY_VALIDATOR_URL, MAINNET_VALIDATOR_URL }; diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/index.ts b/sdk/typescript/packages/sdk/src/mixnet/node-tester/index.ts new file mode 100644 index 0000000000..04e52ee579 --- /dev/null +++ b/sdk/typescript/packages/sdk/src/mixnet/node-tester/index.ts @@ -0,0 +1,50 @@ +import InlineWasmWebWorker from 'web-worker:./worker'; +import * as Comlink from 'comlink'; +import { INodeTesterWorkerAsync, NodeTester, NodeTesterEventKinds } from './types'; + +/** + * Client for the Nym node tester. + */ +export const createNodeTesterClient = async (): Promise => { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const worker = await createWorker(); + + // let comlink handle interop with the web worker + const tester = Comlink.wrap(worker); + + // expose the method to terminate the worker + const terminate = async () => { + worker.terminate(); + }; + + return { tester, terminate }; +}; + +/** + * Async method to create a web worker that runs the Nym node tester client on another thread. It will only return once the worker + * has passed back a `Loaded` event to the calling thread. + * + * @return The instance of the web worker. + */ + +const createWorker = async () => + new Promise((resolve, reject) => { + // rollup will inline the built worker script, so that when the SDK is used in + // other projects, they will not need to mess around trying to bundle it + // however, it will make this SDK bundle bigger because of Base64 inline data + const worker = new InlineWasmWebWorker(); + + worker.addEventListener('error', reject); + worker.addEventListener( + 'message', + (msg) => { + worker.removeEventListener('error', reject); + if (msg.data?.kind === NodeTesterEventKinds.Loaded) { + resolve(worker); + } else { + reject(msg); + } + }, + { once: true }, + ); + }); diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/types.ts b/sdk/typescript/packages/sdk/src/mixnet/node-tester/types.ts new file mode 100644 index 0000000000..a556fec243 --- /dev/null +++ b/sdk/typescript/packages/sdk/src/mixnet/node-tester/types.ts @@ -0,0 +1,65 @@ +export interface INodeTesterWorkerAsync { + init: (validatorUrl: string, nodeTesterId?: string) => Promise; + reconnectToGateway: () => Promise; + disconnectFromGateway: () => Promise; + startTest: (mixnodeIdentityKey: string) => Promise; +} + +export interface INodeTesterWorkerDisposableAsync { + terminate: () => Promise; +} + +export interface NodeTester extends INodeTesterWorkerDisposableAsync { + tester: INodeTesterWorkerAsync; +} + +export enum NodeTesterEventKinds { + Loaded = 'Loaded', + Connected = 'Connected', +} + +export interface NodeTesterLoadedEvent { + kind: NodeTesterEventKinds.Loaded; + args: { + loaded: true; + }; +} + +export type Network = 'QA' | 'SANDBOX' | 'MAINNET'; + +export type NodeTestResultResponse = { + score: number; + sentPackets: number; + receivedPackets: number; + receivedAcks: number; + duplicatePackets: number; + duplicateAcks: number; +}; + +export type Error = { + kind: 'Error'; + args: { message: string }; +}; + +export type WorkerLoaded = { + kind: 'WorkerLoaded'; +}; + +export type DisplayTesterResults = { + kind: 'DisplayTesterResults'; + args: { + result: NodeTestResultResponse; + }; +}; + +export type TestPacket = { + kind: 'TestPacket'; + args: { + mixnodeIdentity: string; + network: Network; + }; +}; + +export type TestStatus = 'Stopped' | 'Running' | 'Complete'; + +export type NodeTestEvent = Error | DisplayTesterResults | TestPacket | WorkerLoaded; diff --git a/sdk/typescript/packages/sdk/src/mixnet/node-tester/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/node-tester/worker.ts new file mode 100644 index 0000000000..ec51afd3ce --- /dev/null +++ b/sdk/typescript/packages/sdk/src/mixnet/node-tester/worker.ts @@ -0,0 +1,105 @@ +// Copyright 2020-2023 Nym Technologies SA +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as Comlink from 'comlink'; + +// +// Rollup will replace wasmBytes with a function that loads the WASM bundle from a base64 string embedded in the output. +// +// Doing it this way, saves having to support a large variety of bundlers and their quirks. +// +// @ts-ignore +// eslint-disable-next-line import/no-extraneous-dependencies +import wasmBytes from '@nymproject/nym-client-wasm/nym_client_wasm_bg.wasm'; + +/* eslint-disable no-restricted-globals */ +import init, { NymNodeTester, current_network_topology, NodeTestResult } from '@nymproject/nym-client-wasm'; +import type { INodeTesterWorkerAsync, NodeTesterLoadedEvent } from './types'; +import { NodeTesterEventKinds } from './types'; + +/** + * Helper method to send typed messages. + * @param event The strongly typed message to send back to the calling thread. + */ +// eslint-disable-next-line no-restricted-globals +const postMessageWithType = (event: E) => self.postMessage(event); + +console.log('[Nym WASM client] Starting Nym WASM web worker...'); + +const buildTester = async (validatorUrl: string, nodeTesterId?: string): Promise => { + const topology = await current_network_topology(validatorUrl); + return new NymNodeTester(topology, nodeTesterId); +}; + +async function main() { + const importResult = await init(wasmBytes()); + importResult.set_panic_hook(); + + let nodeTester: NymNodeTester | null = null; + + const webWorker: INodeTesterWorkerAsync = { + async init(validatorUrl: string, nodeTesterId?: string) { + nodeTester = await buildTester(validatorUrl, nodeTesterId); + }, + async reconnectToGateway() { + if (!nodeTester) { + throw Error('Please run init first'); + } + await nodeTester.reconnect_to_gateway(); + }, + async disconnectFromGateway() { + if (!nodeTester) { + throw Error('Please run init first'); + } + await nodeTester.disconnect_from_gateway(); + }, + async startTest(mixnodeIdentityKey: string) { + if (!nodeTester) { + throw Error('Please run init first'); + } + console.log(`Testing mixnode with identity key = ${mixnodeIdentityKey}`); + // TODO: fix typing in Rust code + const result = (await nodeTester.test_node(mixnodeIdentityKey)) as NodeTestResult | undefined; + + // return early if there was an error + if (!result) { + return result; + } + + // log the result in the worker so that the packet stats are visible somewhere and extract the score + result.log_details(); + + // eslint-disable-next-line @typescript-eslint/naming-convention + const { duplicate_acks, duplicate_packets, received_acks, received_packets, sent_packets } = result; + + // construct the response to avoid any weird proxy effects + return { + score: result.score(), + sentPackets: sent_packets, + receivedPackets: received_packets, + receivedAcks: received_acks, + duplicatePackets: duplicate_packets, + duplicateAcks: duplicate_acks, + }; + }, + }; + + // start comlink listening for messages and handle them above + Comlink.expose(webWorker); + + // notify any listeners that the web worker has loaded and is ready for testing + postMessageWithType({ kind: NodeTesterEventKinds.Loaded, args: { loaded: true } }); +} + +main(); diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts new file mode 100644 index 0000000000..25fbba452c --- /dev/null +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types-from-wasm-pack.ts @@ -0,0 +1,336 @@ +/** + */ +export interface TopologyWasm { + free(): void; + /** + * Specifies whether the client should not refresh the network topology after obtaining + * the first valid instance. + * Supersedes `topology_refresh_rate_ms`. + */ + disable_refreshing: boolean; + /** + * The uniform delay every which clients are querying the directory server + * to try to obtain a compatible network topology to send sphinx packets through. + */ + topology_refresh_rate_ms: bigint; + /** + * During topology refresh, test packets are sent through every single possible network + * path. This timeout determines waiting period until it is decided that the packet + * did not reach its destination. + */ + topology_resolution_timeout_ms: bigint; +} +/** + */ +export interface TrafficWasm { + free(): void; + /** + * The parameter of Poisson distribution determining how long, on average, + * sent packet is going to be delayed at any given mix node. + * So for a packet going through three mix nodes, on average, it will take three times this value + * until the packet reaches its destination. + */ + average_packet_delay_ms: bigint; + /** + * Controls whether the main packet stream constantly produces packets according to the predefined + * poisson distribution. + */ + disable_main_poisson_packet_distribution: boolean; + /** + * The parameter of Poisson distribution determining how long, on average, + * it is going to take another 'real traffic stream' message to be sent. + * If no real packets are available and cover traffic is enabled, + * a loop cover message is sent instead in order to preserve the rate. + */ + message_sending_average_delay_ms: bigint; + /** + * Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. + */ + use_extended_packet_size: boolean; + /** + * Controls whether the sent packets should use outfox as opposed to the default sphinx. + */ + use_outfox: boolean; +} +/** + */ +export interface WasmGateway { + free(): void; + /** + */ + clients_port: number; + /** + */ + host: string; + /** + */ + identity_key: string; + /** + */ + mix_port: number; + /** + */ + owner: string; + /** + */ + sphinx_key: string; + /** + */ + version: string; +} + +/** + */ +export interface ReplySurbsWasm { + free(): void; + /** + * Defines the maximum number of reply surbs a remote party is allowed to request from this client at once. + */ + maximum_allowed_reply_surb_request_size: number; + /** + * Defines maximum amount of time given reply key is going to be valid for. + * This is going to be superseded by key rotation once implemented. + */ + maximum_reply_key_age_ms: bigint; + /** + * Defines maximum amount of time given reply surb is going to be valid for. + * This is going to be superseded by key rotation once implemented. + */ + maximum_reply_surb_age_ms: bigint; + /** + * Defines maximum amount of time the client is going to wait for reply surbs before + * deciding it's never going to get them and would drop all pending messages + */ + maximum_reply_surb_drop_waiting_period_ms: bigint; + /** + * Defines the maximum number of reply surbs the client would request. + */ + maximum_reply_surb_request_size: number; + /** + * Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking + * for more even though in theory they wouldn't need to. + */ + maximum_reply_surb_rerequest_waiting_period_ms: bigint; + /** + * Defines the maximum number of reply surbs the client wants to keep in its storage at any times. + */ + maximum_reply_surb_storage_threshold: number; + /** + * Defines the minimum number of reply surbs the client would request. + */ + minimum_reply_surb_request_size: number; + /** + * Defines the minimum number of reply surbs the client wants to keep in its storage at all times. + * It can only allow to go below that value if its to request additional reply surbs. + */ + minimum_reply_surb_storage_threshold: number; +} + +/** + */ +export interface GatewayConnectionWasm { + free(): void; + /** + * How long we're willing to wait for a response to a message sent to the gateway, + * before giving up on it. + */ + gateway_response_timeout_ms: bigint; +} + +/** + */ +export interface AcknowledgementsWasm { + free(): void; + /** + * Value added to the expected round trip time of an acknowledgement packet before + * it is assumed it was lost and retransmission of the data packet happens. + * In an ideal network with 0 latency, this value would have been 0. + */ + ack_wait_addition_ms: bigint; + /** + * Value multiplied with the expected round trip time of an acknowledgement packet before + * it is assumed it was lost and retransmission of the data packet happens. + * In an ideal network with 0 latency, this value would have been 1. + */ + ack_wait_multiplier: number; + /** + * The parameter of Poisson distribution determining how long, on average, + * sent acknowledgement is going to be delayed at any given mix node. + * So for an ack going through three mix nodes, on average, it will take three times this value + * until the packet reaches its destination. + */ + average_ack_delay_ms: bigint; +} + +/** + */ +export interface CoverTrafficWasm { + free(): void; + /** + * Specifies the ratio of `primary_packet_size` to `secondary_packet_size` used in cover traffic. + * Only applicable if `secondary_packet_size` is enabled. + */ + cover_traffic_primary_size_ratio: number; + /** + * Controls whether the dedicated loop cover traffic stream should be enabled. + * (and sending packets, on average, every [Self::loop_cover_traffic_average_delay]) + */ + disable_loop_cover_traffic_stream: boolean; + /** + * The parameter of Poisson distribution determining how long, on average, + * it is going to take for another loop cover traffic message to be sent. + */ + loop_cover_traffic_average_delay_ms: bigint; +} + +export interface Config { + free(): void; +} + +export interface DebugWasm { + free(): void; + /** + * Defines all configuration options related to acknowledgements, such as delays or wait timeouts. + */ + acknowledgements: AcknowledgementsWasm; + /** + * Defines all configuration options related to cover traffic stream(s). + */ + cover_traffic: CoverTrafficWasm; + /** + * Defines all configuration options related to the gateway connection. + */ + gateway_connection: GatewayConnectionWasm; + /** + * Defines all configuration options related to reply SURBs. + */ + reply_surbs: ReplySurbsWasm; + /** + * Defines all configuration options related topology, such as refresh rates or timeouts. + */ + topology: TopologyWasm; + /** + * Defines all configuration options related to traffic streams. + */ + traffic: TrafficWasm; +} +/** + */ +export interface GatewayEndpointConfig { + free(): void; + /** + * gateway_id specifies ID of the gateway to which the client should send messages. + * If initially omitted, a random gateway will be chosen from the available topology. + */ + gateway_id: string; + /** + * Address of the gateway listener to which all client requests should be sent. + */ + gateway_listener: string; + /** + * Address of the gateway owner to which the client should send messages. + */ + gateway_owner: string; +} +/** + */ +export interface NymClient { + free(): void; + /** + * @returns {string} + */ + self_address(): string; + /** + * The simplest message variant where no additional information is attached. + * You're simply sending your `data` to specified `recipient` without any tagging. + * + * Ends up with `NymMessage::Plain` variant + * @param {Uint8Array} message + * @param {string} recipient + * @returns {Promise} + */ + send_regular_message(message: Uint8Array, recipient: string): Promise; + /** + * Creates a message used for a duplex anonymous communication where the recipient + * will never learn of our true identity. This is achieved by carefully sending `reply_surbs`. + * + * Note that if reply_surbs is set to zero then + * this variant requires the client having sent some reply_surbs in the past + * (and thus the recipient also knowing our sender tag). + * + * Ends up with `NymMessage::Repliable` variant + * @param {Uint8Array} message + * @param {string} recipient + * @param {number} reply_surbs + * @returns {Promise} + */ + send_anonymous_message(message: Uint8Array, recipient: string, reply_surbs: number): Promise; + /** + * Attempt to use our internally received and stored `ReplySurb` to send the message back + * to specified recipient whilst not knowing its full identity (or even gateway). + * + * Ends up with `NymMessage::Reply` variant + * @param {Uint8Array} message + * @param {string} recipient_tag + * @returns {Promise} + */ + send_reply(message: Uint8Array, recipient_tag: string): Promise; +} + +export interface Topology { + free(): void; + /** + * Specifies whether the client should not refresh the network topology after obtaining + * the first valid instance. + * Supersedes `topology_refresh_rate_ms`. + */ + disable_refreshing: boolean; + /** + * The uniform delay every which clients are querying the directory server + * to try to obtain a compatible network topology to send sphinx packets through. + */ + topology_refresh_rate_ms: bigint; + /** + * During topology refresh, test packets are sent through every single possible network + * path. This timeout determines waiting period until it is decided that the packet + * did not reach its destination. + */ + topology_resolution_timeout_ms: bigint; +} + +export interface Traffic { + free(): void; + /** + * The parameter of Poisson distribution determining how long, on average, + * sent packet is going to be delayed at any given mix node. + * So for a packet going through three mix nodes, on average, it will take three times this value + * until the packet reaches its destination. + */ + average_packet_delay_ms: bigint; + /** + * Controls whether the main packet stream constantly produces packets according to the predefined + * poisson distribution. + */ + disable_main_poisson_packet_distribution: boolean; + /** + * The parameter of Poisson distribution determining how long, on average, + * it is going to take another 'real traffic stream' message to be sent. + * If no real packets are available and cover traffic is enabled, + * a loop cover message is sent instead in order to preserve the rate. + */ + message_sending_average_delay_ms: bigint; + /** + * Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. + */ + use_extended_packet_size: boolean; +} + +/** + */ +export interface NymClientBuilder { + free(): void; + /** + * @returns {Promise>} + */ + start_client(): Promise>; +} diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts index 4927f10cfc..1f11384b1a 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/types.ts @@ -1,174 +1,6 @@ -export interface Acknowledgements { - free(): void; - /** - * Value added to the expected round trip time of an acknowledgement packet before - * it is assumed it was lost and retransmission of the data packet happens. - * In an ideal network with 0 latency, this value would have been 0. - */ - ack_wait_addition_ms: bigint; - /** - * Value multiplied with the expected round trip time of an acknowledgement packet before - * it is assumed it was lost and retransmission of the data packet happens. - * In an ideal network with 0 latency, this value would have been 1. - */ - ack_wait_multiplier: number; - /** - * The parameter of Poisson distribution determining how long, on average, - * sent acknowledgement is going to be delayed at any given mix node. - * So for an ack going through three mix nodes, on average, it will take three times this value - * until the packet reaches its destination. - */ - average_ack_delay_ms: bigint; -} +import type { DebugWasm } from './types-from-wasm-pack'; -export interface CoverTraffic { - free(): void; - /** - * Specifies the ratio of `primary_packet_size` to `secondary_packet_size` used in cover traffic. - * Only applicable if `secondary_packet_size` is enabled. - */ - cover_traffic_primary_size_ratio: number; - /** - * Controls whether the dedicated loop cover traffic stream should be enabled. - * (and sending packets, on average, every [Self::loop_cover_traffic_average_delay]) - */ - disable_loop_cover_traffic_stream: boolean; - /** - * The parameter of Poisson distribution determining how long, on average, - * it is going to take for another loop cover traffic message to be sent. - */ - loop_cover_traffic_average_delay_ms: bigint; -} - -export interface GatewayConnection { - free(): void; - /** - * How long we're willing to wait for a response to a message sent to the gateway, - * before giving up on it. - */ - gateway_response_timeout_ms: bigint; -} - -export interface ReplySurbs { - free(): void; - /** - * Defines the maximum number of reply surbs a remote party is allowed to request from this client at once. - */ - maximum_allowed_reply_surb_request_size: number; - /** - * Defines maximum amount of time given reply key is going to be valid for. - * This is going to be superseded by key rotation once implemented. - */ - maximum_reply_key_age_ms: bigint; - /** - * Defines maximum amount of time given reply surb is going to be valid for. - * This is going to be superseded by key rotation once implemented. - */ - maximum_reply_surb_age_ms: bigint; - /** - * Defines maximum amount of time the client is going to wait for reply surbs before - * deciding it's never going to get them and would drop all pending messages - */ - maximum_reply_surb_drop_waiting_period_ms: bigint; - /** - * Defines the maximum number of reply surbs the client would request. - */ - maximum_reply_surb_request_size: number; - /** - * Defines maximum amount of time the client is going to wait for reply surbs before explicitly asking - * for more even though in theory they wouldn't need to. - */ - maximum_reply_surb_rerequest_waiting_period_ms: bigint; - /** - * Defines the maximum number of reply surbs the client wants to keep in its storage at any times. - */ - maximum_reply_surb_storage_threshold: number; - /** - * Defines the minimum number of reply surbs the client would request. - */ - minimum_reply_surb_request_size: number; - /** - * Defines the minimum number of reply surbs the client wants to keep in its storage at all times. - * It can only allow to go below that value if its to request additional reply surbs. - */ - minimum_reply_surb_storage_threshold: number; -} - -export interface Debug { - free(): void; - /** - * Defines all configuration options related to acknowledgements, such as delays or wait timeouts. - */ - acknowledgements: Acknowledgements; - /** - * Defines all configuration options related to cover traffic stream(s). - */ - cover_traffic: CoverTraffic; - /** - * Defines all configuration options related to the gateway connection. - */ - gateway_connection: GatewayConnection; - /** - * Defines all configuration options related to reply SURBs. - */ - reply_surbs: ReplySurbs; - /** - * Defines all configuration options related topology, such as refresh rates or timeouts. - */ - topology: Topology; - /** - * Defines all configuration options related to traffic streams. - */ - traffic: Traffic; -} - -export interface Topology { - free(): void; - /** - * Specifies whether the client should not refresh the network topology after obtaining - * the first valid instance. - * Supersedes `topology_refresh_rate_ms`. - */ - disable_refreshing: boolean; - /** - * The uniform delay every which clients are querying the directory server - * to try to obtain a compatible network topology to send sphinx packets through. - */ - topology_refresh_rate_ms: bigint; - /** - * During topology refresh, test packets are sent through every single possible network - * path. This timeout determines waiting period until it is decided that the packet - * did not reach its destination. - */ - topology_resolution_timeout_ms: bigint; -} - -export interface Traffic { - free(): void; - /** - * The parameter of Poisson distribution determining how long, on average, - * sent packet is going to be delayed at any given mix node. - * So for a packet going through three mix nodes, on average, it will take three times this value - * until the packet reaches its destination. - */ - average_packet_delay_ms: bigint; - /** - * Controls whether the main packet stream constantly produces packets according to the predefined - * poisson distribution. - */ - disable_main_poisson_packet_distribution: boolean; - /** - * The parameter of Poisson distribution determining how long, on average, - * it is going to take another 'real traffic stream' message to be sent. - * If no real packets are available and cover traffic is enabled, - * a loop cover message is sent instead in order to preserve the rate. - */ - message_sending_average_delay_ms: bigint; - /** - * Controls whether the sent sphinx packet use the NON-DEFAULT bigger size. - */ - use_extended_packet_size: boolean; -} +export * from './types-from-wasm-pack'; /** * Some common mime types, however, you can always just specify the mime-type as a string @@ -221,7 +53,7 @@ export interface NymClientConfig { /** * Optional. Settings for the WASM client. */ - debug?: Debug; + debug?: DebugWasm; } export interface IWebWorker { diff --git a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts index 4dbe9d5154..f1755b5d1f 100644 --- a/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts +++ b/sdk/typescript/packages/sdk/src/mixnet/wasm/worker.ts @@ -168,43 +168,40 @@ init(wasmBytes()) if (config.gatewayListener) gatewayEndpoint.gateway_listener = config.gatewayListener; // create the client, passing handlers for events - wrapper.init( - new Config(config.clientId, config.nymApiUrl, gatewayEndpoint, config.debug || default_debug()), - async (message) => { - // fire an event with the raw message - postMessageWithType({ - kind: EventKinds.RawMessageReceived, - args: { payload: message }, - }); + wrapper.init(new Config(config.clientId, config.nymApiUrl, config.debug || default_debug()), async (message) => { + // fire an event with the raw message + postMessageWithType({ + kind: EventKinds.RawMessageReceived, + args: { payload: message }, + }); - try { - // try to decode the payload to extract the mime-type, headers and payload body - const decodedPayload = decode_payload(message); - const { payload, headers } = decodedPayload; - const mimeType = decodedPayload.mimeType as MimeTypes; + try { + // try to decode the payload to extract the mime-type, headers and payload body + const decodedPayload = decode_payload(message); + const { payload, headers } = decodedPayload; + const mimeType = decodedPayload.mimeType as MimeTypes; - if (wrapper.getTextMimeTypes().includes(mimeType)) { - const stringMessage = parse_utf8_string(payload); + if (wrapper.getTextMimeTypes().includes(mimeType)) { + const stringMessage = parse_utf8_string(payload); - // the payload is a string type (in the options at creation time, string mime-types are set, or fall back - // to defaults, such as `text/plain`, `application/json`, etc) - postMessageWithType({ - kind: EventKinds.StringMessageReceived, - args: { mimeType, payload: stringMessage, payloadRaw: payload, headers }, - }); - return; - } - - // the payload is a binary type - postMessageWithType({ - kind: EventKinds.BinaryMessageReceived, - args: { mimeType, payload, headers }, + // the payload is a string type (in the options at creation time, string mime-types are set, or fall back + // to defaults, such as `text/plain`, `application/json`, etc) + postMessageWithType({ + kind: EventKinds.StringMessageReceived, + args: { mimeType, payload: stringMessage, payloadRaw: payload, headers }, }); - } catch (e) { - console.error('Failed to parse binary message', e); + return; } - }, - ); + + // the payload is a binary type + postMessageWithType({ + kind: EventKinds.BinaryMessageReceived, + args: { mimeType, payload, headers }, + }); + } catch (e) { + console.error('Failed to parse binary message', e); + } + }); // start the client sending traffic await wrapper.start(); diff --git a/ts-packages/mock-nym-api/src/index.ts b/ts-packages/mock-nym-api/src/index.ts index 89ab9ad245..dc5848fd1a 100644 --- a/ts-packages/mock-nym-api/src/index.ts +++ b/ts-packages/mock-nym-api/src/index.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-console */ import express from 'express'; import dotenv from 'dotenv'; import { createProxyMiddleware } from 'http-proxy-middleware'; diff --git a/ts-packages/react-webpack-with-theme-example/src/App.tsx b/ts-packages/react-webpack-with-theme-example/src/App.tsx index 6f70787807..35bca1929e 100644 --- a/ts-packages/react-webpack-with-theme-example/src/App.tsx +++ b/ts-packages/react-webpack-with-theme-example/src/App.tsx @@ -20,6 +20,7 @@ export const Content: FCWithChildren = () => { const isMounted = useIsMounted(); if (isMounted()) { + // eslint-disable-next-line no-console console.log('Content is mounted'); } diff --git a/yarn.lock b/yarn.lock index 34f8aaa416..197fe4355b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@adobe/css-tools@^4.0.1": version "4.2.0" resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" @@ -1203,7 +1208,7 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== @@ -1808,9 +1813,9 @@ integrity sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g== "@floating-ui/dom@^1.0.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.2.tgz#eb3a37f7506c4f95ef735967dc3496b5012e11cb" - integrity sha512-VKmvHVatWnewmGGy+7Mdy4cTJX71Pli6v/Wjb5RQBuq5wjUYx+Ef+kRThi8qggZqDgD8CogCpqhRoVp3+yQk+g== + version "1.4.3" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.4.3.tgz#0854a3297ea03894932381f3ea1403fab3a6e602" + integrity sha512-nB/68NyaQlcdY22L+Fgd1HERQ7UGv7XFN+tPxwrEfQL4nKtAP/jIZnZtpUlXbtV+VEGHh6W/63Gy2C5biWI3sA== dependencies: "@floating-ui/core" "^1.3.1" @@ -2390,6 +2395,20 @@ prop-types "^15.8.1" react-is "^18.2.0" +"@mui/base@5.0.0-beta.5": + version "5.0.0-beta.5" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.5.tgz#b566f3beb1eb2823139eabaf52014cf7be900015" + integrity sha512-vy3TWLQYdGNecTaufR4wDNQFV2WEg6wRPi6BVbx6q1vP3K1mbxIn1+XOqOzfYBXjFHvMx0gZAo2TgWbaqfgvAA== + dependencies: + "@babel/runtime" "^7.22.5" + "@emotion/is-prop-valid" "^1.2.1" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.13.6" + "@popperjs/core" "^2.11.8" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + "@mui/core-downloads-tracker@^5.13.4": version "5.13.4" resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz#7e4b491d8081b6d45ae51556d82cb16b31315a19" @@ -2417,16 +2436,16 @@ react-is "^18.2.0" "@mui/material@^5.0.1", "@mui/material@^5.2.2": - version "5.13.5" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.13.5.tgz#c14f14824f3a37ae0c5ebddbc0034956bc6fec30" - integrity sha512-eMay+Ue1OYXOFMQA5Aau7qbAa/kWHLAyi0McsbPTWssCbGehqkF6CIdPsfVGw6tlO+xPee1hUitphHJNL3xpOQ== + version "5.13.6" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.13.6.tgz#caaba1e071e394c415208404ce6964e6c14c16d6" + integrity sha512-/c2ZApeQm2sTYdQXjqEnldaBMBcUEiyu2VRS6bS39ZeNaAcCLBQbYocLR46R+f0S5dgpBzB0T4AsOABPOFYZ5Q== dependencies: - "@babel/runtime" "^7.21.0" - "@mui/base" "5.0.0-beta.4" + "@babel/runtime" "^7.22.5" + "@mui/base" "5.0.0-beta.5" "@mui/core-downloads-tracker" "^5.13.4" - "@mui/system" "^5.13.5" + "@mui/system" "^5.13.6" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.1" + "@mui/utils" "^5.13.6" "@types/react-transition-group" "^4.4.6" clsx "^1.2.1" csstype "^3.1.2" @@ -2476,16 +2495,16 @@ jss-plugin-vendor-prefixer "^10.10.0" prop-types "^15.8.1" -"@mui/system@>= 5", "@mui/system@^5.0.1", "@mui/system@^5.13.5": - version "5.13.5" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.13.5.tgz#9f67ea0c4f6974713f90b7b94c999fd3f40f8de3" - integrity sha512-n0gzUxoZ2ZHZgnExkh2Htvo9uW2oakofgPRQrDoa/GQOWyRD0NH9MDszBwOb6AAoXZb+OV5TE7I4LeZ/dzgHYA== +"@mui/system@>= 5", "@mui/system@^5.0.1", "@mui/system@^5.13.5", "@mui/system@^5.13.6": + version "5.13.6" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.13.6.tgz#5bf4f84fad0c9ed771458f821e384f61abfa33ca" + integrity sha512-G3Xr28uLqU3DyF6r2LQkHGw/ku4P0AHzlKVe7FGXOPl7X1u+hoe2xxj8Vdiq/69II/mh9OP21i38yBWgWb7WgQ== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.22.5" "@mui/private-theming" "^5.13.1" "@mui/styled-engine" "^5.13.2" "@mui/types" "^7.2.4" - "@mui/utils" "^5.13.1" + "@mui/utils" "^5.13.6" clsx "^1.2.1" csstype "^3.1.2" prop-types "^15.8.1" @@ -2495,12 +2514,12 @@ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== -"@mui/utils@^5.10.3", "@mui/utils@^5.13.1", "@mui/utils@^5.7.0": - version "5.13.1" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.1.tgz#86199e46014215f95da046a5ec803f4a39c96eee" - integrity sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A== +"@mui/utils@^5.10.3", "@mui/utils@^5.13.1", "@mui/utils@^5.13.6", "@mui/utils@^5.7.0": + version "5.13.6" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.13.6.tgz#aa29d75de59577585b9f23891b03592d40459ed7" + integrity sha512-ggNlxl5NPSbp+kNcQLmSig6WVB0Id+4gOxhx644987v4fsji+CSXc+MFYLocFB/x4oHtzCUlSzbVHlJfP/fXoQ== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.22.5" "@types/prop-types" "^15.7.5" "@types/react-is" "^18.2.0" prop-types "^15.8.1" @@ -2808,9 +2827,6 @@ dependencies: nx "15.9.4" -"@nymproject/nym-client-wasm@file:clients/webassembly/pkg": - version "1.1.1" - "@nymproject/nym-validator-client@^0.18.0": version "0.18.0" resolved "https://registry.yarnpkg.com/@nymproject/nym-validator-client/-/nym-validator-client-0.18.0.tgz#4dd72bafdf6c72b603242f32c0bb9a1f9e475b98" @@ -3036,10 +3052,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@remix-run/router@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.3.tgz#8205baf6e17ef93be35bf62c37d2d594e9be0dad" - integrity sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q== +"@remix-run/router@1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.0.tgz#550a8d5760b78efc5d60f62b5829b0f74c1fde81" + integrity sha512-Eu1V3kz3mV0wUpVTiFHuaT8UD1gj/0VnoFHQYX35xlslQUpe8CuYoKFn9d4WZFHm3yDywz6ALZuGdnUPKrNeAw== "@rollup/plugin-commonjs@^24.0.1": version "24.1.0" @@ -3107,9 +3123,9 @@ resolve "^1.22.1" "@rollup/plugin-typescript@^11.0.0": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.1.tgz#258663a7aa6b51390dd39ae6e5502f2c4b2807cb" - integrity sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg== + version "11.1.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.2.tgz#09eb5690a650bb0334bf84125bce9abd296442e4" + integrity sha512-0ghSOCMcA7fl1JM+0gYRf+Q/HWyg+zg7/gDSc+fRLmlJWcW5K1I+CLRzaRhXf4Y3DRyPnnDo4M2ktw+a6JcDEg== dependencies: "@rollup/pluginutils" "^5.0.1" resolve "^1.22.1" @@ -3142,79 +3158,79 @@ resolved "https://registry.yarnpkg.com/@sapphire/utilities/-/utilities-3.12.0.tgz#3ee8330338aa79a7e0cab04d4d0eec9ed69fc9bf" integrity sha512-y1JP4FdPBkZjJGJcb5Zx0ok64mtpGvz0TLOC49HTwYsfBQL8tsTct93yoYdEEMWSZFmOF1ZvV8L6jIJ1CW8bJw== -"@sentry-internal/tracing@7.56.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.56.0.tgz#ba709258f2f0f3d8a36f9740403088b39212b843" - integrity sha512-OKI4Pz/O13gng8hT9rNc+gRV3+P7nnk1HnHlV8fgaQydS6DsRxoDL1sHa42tZGbh7K9jqNAP3TC6VjBOsr2tXA== +"@sentry-internal/tracing@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.57.0.tgz#cb761931b635f8f24c84be0eecfacb8516b20551" + integrity sha512-tpViyDd8AhQGYYhI94xi2aaDopXOPfL2Apwrtb3qirWkomIQ2K86W1mPmkce+B0cFOnW2Dxv/ZTFKz6ghjK75A== dependencies: - "@sentry/core" "7.56.0" - "@sentry/types" "7.56.0" - "@sentry/utils" "7.56.0" - tslib "^1.9.3" + "@sentry/core" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + tslib "^2.4.1 || ^1.9.3" -"@sentry/browser@7.56.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.56.0.tgz#6bf3ff21bc2e9b66a72ea0c7dcc3572fdeb3bd8f" - integrity sha512-qpyyw+NM/psbNAYMlTCCdWwxHHcogppEQ+Q40jGE4sKP2VRIjjyteJkUcaEMoGpbJXx9puzTWbpzqlQ8r15Now== +"@sentry/browser@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.57.0.tgz#6e724c9eac680dba99ced0fdf81be8d1e3b3bceb" + integrity sha512-E0HaYYlaqHFiIRZXxcvOO8Odvlt+TR1vFFXzqUWXPOvDRxURglTOCQ3EN/u6bxtAGJ6y/Zc2obgihTtypuel/w== dependencies: - "@sentry-internal/tracing" "7.56.0" - "@sentry/core" "7.56.0" - "@sentry/replay" "7.56.0" - "@sentry/types" "7.56.0" - "@sentry/utils" "7.56.0" - tslib "^1.9.3" + "@sentry-internal/tracing" "7.57.0" + "@sentry/core" "7.57.0" + "@sentry/replay" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + tslib "^2.4.1 || ^1.9.3" -"@sentry/core@7.56.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.56.0.tgz#f4253e0d61f55444180a63e5278b62e57303f7cf" - integrity sha512-Nuyyfh09Yz27kPo74fXHlrdmZeK6zrlJVtxQ6LkwuoaTBcNcesNXVaOtr6gjvUGUmsfriVPP3Jero5LXufV7GQ== +"@sentry/core@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.57.0.tgz#65093d739c04f320a54395a21be955fcbe326acb" + integrity sha512-l014NudPH0vQlzybtXajPxYFfs9w762NoarjObC3gu76D1jzBBFzhdRelkGpDbSLNTIsKhEDDRpgAjBWJ9icfw== dependencies: - "@sentry/types" "7.56.0" - "@sentry/utils" "7.56.0" - tslib "^1.9.3" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" + tslib "^2.4.1 || ^1.9.3" "@sentry/integrations@^7.54.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.56.0.tgz#6fe812454fbccf00810f65667eb393b3bf298b92" - integrity sha512-0d/E/R3MW+5bQ9wcHPD0h/B2KFOpUt+wQgN1kNk7atY12auDzHKuGCjPP87D/xVyRoma3ErFqZCRqwtvCj1cfQ== + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.57.0.tgz#298085b3a2fe862cc70bc7f2143aa0fbc617322c" + integrity sha512-C3WZo5AGI2L0dj+mIjeZpdAwDEG2nDYvZbTzq5J9hVoHFdP3t7fOWBHSPkSFVtTdMaJrv+82aKnUefVCeAjxGg== dependencies: - "@sentry/types" "7.56.0" - "@sentry/utils" "7.56.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" localforage "^1.8.1" - tslib "^1.9.3" + tslib "^2.4.1 || ^1.9.3" "@sentry/react@^7.54.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.56.0.tgz#7e2e9363a76c7d67854bdb179142a2f7f910d476" - integrity sha512-dRnkZwspef5aEHV/eiLS/mhomFCXItylU8s78fzAn5QMTDGHmu5Pnhl5dxh/zbPUcdXqFA6GwJVucV4gzsNEJw== + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.57.0.tgz#cf91f0115bcd2a8306d6c8a39d8e8b53d4b21814" + integrity sha512-XGNTjIoCG3naSmCU8qObd+y+CqAB6NQkGWOp2yyBwp2inyKF2ehJvDh6bIQloBYq2TmOJDa4NfXdMrkilxaLFQ== dependencies: - "@sentry/browser" "7.56.0" - "@sentry/types" "7.56.0" - "@sentry/utils" "7.56.0" + "@sentry/browser" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" hoist-non-react-statics "^3.3.2" - tslib "^1.9.3" + tslib "^2.4.1 || ^1.9.3" -"@sentry/replay@7.56.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.56.0.tgz#8a49dcb45e9ea83bf905cec0d9b42fed4b8085bd" - integrity sha512-bvjiJK1+SM/paLapuL+nEJ8CIF1bJqi0nnFyxUIi2L5L6yb2uMwfyT3IQ+kz0cXJsLdb3HN4WMphVjyiU9pFdg== +"@sentry/replay@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.57.0.tgz#c8f7eae7b7edc9d32c3d2955b337f3b3c76dff39" + integrity sha512-pN4ryNS3J5EYbkXvR+O/+hseAJha7XDl8mPFtK0OGTHG10JzCi4tQJazblHQdpb5QBaMMPCeZ+isyfoQLDNXnw== dependencies: - "@sentry/core" "7.56.0" - "@sentry/types" "7.56.0" - "@sentry/utils" "7.56.0" + "@sentry/core" "7.57.0" + "@sentry/types" "7.57.0" + "@sentry/utils" "7.57.0" -"@sentry/types@7.56.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.56.0.tgz#9042a099cf9e8816d081886d24b88082a5d9f87a" - integrity sha512-5WjhVOQm75ItOytOx2jTx+5yw8/qJ316+g1Di8dS9+kgIi1zniqdMcX00C2yYe3FMUgFB49PegCUYulm9Evapw== +"@sentry/types@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.57.0.tgz#4fdb80cbd49ba034dd8d9be0c0005a016d5db3ce" + integrity sha512-D7ifoUfxuVCUyktIr5Gc+jXUbtcUMmfHdTtTbf1XCZHua5mJceK9wtl3YCg3eq/HK2Ppd52BKnTzEcS5ZKQM+w== -"@sentry/utils@7.56.0": - version "7.56.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.56.0.tgz#e60e4935d17b2197584abf6ce61b522ad055352c" - integrity sha512-wgeX7bufxc//TjjSIE+gCMm8hVId7Jzvc+f441bYrWnNZBuzPIDW2BummCcPrKzSYe5GeYZDTZGV8YZGMLGBjw== +"@sentry/utils@7.57.0": + version "7.57.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.57.0.tgz#8253c6fcf35138b4c424234b8da1596e11b98ad8" + integrity sha512-YXrkMCiNklqkXctn4mKYkrzNCf/dfVcRUQrkXjeBC+PHXbcpPyaJgInNvztR7Skl8lE3JPGPN4v5XhLxK1bUUg== dependencies: - "@sentry/types" "7.56.0" - tslib "^1.9.3" + "@sentry/types" "7.57.0" + tslib "^2.4.1 || ^1.9.3" "@sigstore/protobuf-specs@^0.1.0": version "0.1.0" @@ -3620,14 +3636,14 @@ qs "^6.10.0" telejson "^6.0.8" -"@storybook/channel-postmessage@7.0.23": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-7.0.23.tgz#eff248def859a0106cb45d535eb13111b8abb2df" - integrity sha512-SfXTV55Z9U5rN1OuyR56s+PUpav3b4SgXtP67bnNsrv7dkKhBwr0DUUJogIRnjmY0Loy/hLvJ23kfmKXPWC4vQ== +"@storybook/channel-postmessage@7.0.24": + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-7.0.24.tgz#789bd121cf64e306737ec0f3b096ea0ac6f47bf5" + integrity sha512-QLtLXjEeTEwBN/7pB888mBaykmRU9Jy2BitvZuLJWyHHygTYm3vYZOaGR37DT+q/6Ob5GaZ0tURZmCSNDe8IIA== dependencies: - "@storybook/channels" "7.0.23" - "@storybook/client-logger" "7.0.23" - "@storybook/core-events" "7.0.23" + "@storybook/channels" "7.0.24" + "@storybook/client-logger" "7.0.24" + "@storybook/core-events" "7.0.24" "@storybook/global" "^5.0.0" qs "^6.10.0" telejson "^7.0.3" @@ -3652,10 +3668,10 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/channels@7.0.23": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.0.23.tgz#4c57f5f43289ca21b6a713ff9c399c8abb6c868a" - integrity sha512-cCxR3Z84YQjsVMPgFTI+kDVNOlgXSDakwjkNFBznU+s2qhGW5eZt2g9YRDeVDQ6AjR4j4RrGhwddRq4lQZF2pg== +"@storybook/channels@7.0.24": + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-7.0.24.tgz#fcfe7a1a5599265506f07fe81d03b0585303fc15" + integrity sha512-NZVLwMhtzy6cZrNRjshFvMAD9mQTmJDNwhohodSkM/YFCDVFhmxQk9tgizVGh9MwY3CYGJ1SI96RUejGosb49Q== "@storybook/client-api@6.5.16": version "6.5.16" @@ -3691,10 +3707,10 @@ core-js "^3.8.2" global "^4.4.0" -"@storybook/client-logger@7.0.23", "@storybook/client-logger@^6.4.0 || >=6.5.0-0": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-7.0.23.tgz#5db5d144d1948fd8c856195ee6a699c002046557" - integrity sha512-L287SRO8EaYOxTpryV7N/1WCL5I1IFs5Naiq3FpybhguUP7F3Si7KWvVdFmSW06K9jNj2IEQ/8zBRM8ra4ttyg== +"@storybook/client-logger@7.0.24", "@storybook/client-logger@^6.4.0 || >=6.5.0-0": + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-7.0.24.tgz#7be57ce1f90e65c6e9da7a88ed9ca7c5ce3c6536" + integrity sha512-4zRTb+QQ1hWaRqad/UufZNRfi2d/cf5a40My72Ct97VwjhJFE6aQ3K+hl1Xt6hh8dncDL2JK3cgziw6ElqjT0w== dependencies: "@storybook/global" "^5.0.0" @@ -3801,10 +3817,10 @@ dependencies: core-js "^3.8.2" -"@storybook/core-events@7.0.23": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.0.23.tgz#99d36712dba8eae9e1585298dd9b97385ae13ad5" - integrity sha512-Hdt18p/qbgJc+1wY2dGcdjmlsuNXWsoLTaXrjInuvr1U0kmKmKs0VMaB0cFubnUgCmB3YQWTGnVr3q8iz9iB7g== +"@storybook/core-events@7.0.24": + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-7.0.24.tgz#3fa4b2b3af64a86525b4cf07f49a7410125ef810" + integrity sha512-xkf/rihCkhqMeh5EA8lVp90/mzbb2gcg6I3oeFWw2hognVcTnPXg6llhWdU4Spqd0cals7GEFmQugIILCmH8GA== "@storybook/core-server@6.5.16": version "6.5.16" @@ -3936,15 +3952,15 @@ global "^4.4.0" "@storybook/instrumenter@^6.4.0 || >=6.5.0-0": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-7.0.23.tgz#0f7efd95cb2ec4698fc57cc012045cec42b7ef6b" - integrity sha512-CeV2se64XxccD4L6XFI3cFfEz3/Lcbrvb+T3bZZzGOXO18zH5tN3jXVfAONrz/mU69jL9mbo96hFl51UDtwcAg== + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/instrumenter/-/instrumenter-7.0.24.tgz#fbc81250f25b0d5f3da3a3aa9dad48cdc82642f9" + integrity sha512-XQ4Whq0rqW9eFMTtRpLxcl6bCf+KO3UZYcm+H63EDn9TstDyopmqv1fDg2tmJOpqLo143F8qLVC89rI7M/lO6w== dependencies: - "@storybook/channels" "7.0.23" - "@storybook/client-logger" "7.0.23" - "@storybook/core-events" "7.0.23" + "@storybook/channels" "7.0.24" + "@storybook/client-logger" "7.0.24" + "@storybook/core-events" "7.0.24" "@storybook/global" "^5.0.0" - "@storybook/preview-api" "7.0.23" + "@storybook/preview-api" "7.0.24" "@storybook/manager-webpack4@6.5.16": version "6.5.16" @@ -4060,18 +4076,18 @@ dependencies: core-js "^3.8.2" -"@storybook/preview-api@7.0.23": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-7.0.23.tgz#6f4d98a54c7367341e086a1818866e2e1e97faea" - integrity sha512-kXhDX6gVjQu4Lx4SnCW5Yt5W/TbQofp9SL0paB1ywsJ15xSAPU5KVILe9OWAOba2YUnk7sHux/xDX/gH5RCpVw== +"@storybook/preview-api@7.0.24": + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-7.0.24.tgz#93634c060aa43bb10fb233f28ae83b7d74b98aad" + integrity sha512-psycU07tuB5nyJvfAJiDN/9e8cjOdJ+5lrCSYC3vPzH86LxADDIN0/8xFb1CaQWcXZsADEFJGpHKWbRhjym5ew== dependencies: - "@storybook/channel-postmessage" "7.0.23" - "@storybook/channels" "7.0.23" - "@storybook/client-logger" "7.0.23" - "@storybook/core-events" "7.0.23" + "@storybook/channel-postmessage" "7.0.24" + "@storybook/channels" "7.0.24" + "@storybook/client-logger" "7.0.24" + "@storybook/core-events" "7.0.24" "@storybook/csf" "^0.1.0" "@storybook/global" "^5.0.0" - "@storybook/types" "7.0.23" + "@storybook/types" "7.0.24" "@types/qs" "^6.9.5" dequal "^2.0.2" lodash "^4.17.21" @@ -4252,15 +4268,15 @@ memoizerific "^1.11.3" regenerator-runtime "^0.13.7" -"@storybook/types@7.0.23": - version "7.0.23" - resolved "https://registry.yarnpkg.com/@storybook/types/-/types-7.0.23.tgz#08ae3223e97ed1baa9aa715745a05ae83311425c" - integrity sha512-ziszL3OfhTT5PHE7kiQjWWx3Lw3qro8eLX+56dXDNgmft5LS66yEANcaA7OzxLnEgdyWSxJqgrVo6r0JwHp2Eg== +"@storybook/types@7.0.24": + version "7.0.24" + resolved "https://registry.yarnpkg.com/@storybook/types/-/types-7.0.24.tgz#22b2f6658f9a091ff584e1a0643ee1ea9a54ed39" + integrity sha512-SZh/XBHP1TT5bmEk0W52nT0v6fUnYwmZVls3da5noutdgOAiwL7TANtl41XrNjG+UDr8x0OE3PVVJi+LhwUaNA== dependencies: - "@storybook/channels" "7.0.23" + "@storybook/channels" "7.0.24" "@types/babel__core" "^7.0.0" "@types/express" "^4.7.0" - file-system-cache "^2.0.0" + file-system-cache "2.3.0" "@storybook/ui@6.5.16": version "6.5.16" @@ -5001,9 +5017,9 @@ form-data "^3.0.0" "@types/node@*", "@types/node@>=13.7.0": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== + version "20.3.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" + integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== "@types/node@^13.7.0": version "13.13.52" @@ -5011,9 +5027,9 @@ integrity sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ== "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^16.7.13": - version "16.18.36" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.36.tgz#0db5d7efc4760d36d0d1d22c85d1a53accd5dc27" - integrity sha512-8egDX8dE50XyXWH6C6PRCNkTP106DuUrvdrednFouDSmCi7IOvrqr0frznfZaHifHH/3aq/7a7v9N4wdXMqhBQ== + version "16.18.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.37.tgz#a1f8728e4dc30163deb41e9b7aba65d0c2d4eda1" + integrity sha512-ql+4dw4PlPFBP495k8JzUX/oMNRI2Ei4PrMHgj8oT4VhGlYUzF4EYr0qk2fW+XBVGIrq8Zzk13m4cvyXZuv4pA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -5113,9 +5129,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.0.26": - version "18.2.13" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.13.tgz#a98c09bde8b18f80021935b11d2d29ef5f4dcb2f" - integrity sha512-vJ+zElvi/Zn9cVXB5slX2xL8PZodPCwPRDpittQdw43JR2AJ5k3vKdgJJyneV/cYgIbLQUwXa9JVDvUZXGba+Q== + version "18.2.14" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.14.tgz#fa7a6fecf1ce35ca94e74874f70c56ce88f7a127" + integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -5300,14 +5316,14 @@ integrity sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w== "@typescript-eslint/eslint-plugin@^5.13.0", "@typescript-eslint/eslint-plugin@^5.7.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz#2f4bea6a3718bed2ba52905358d0f45cd3620d31" - integrity sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg== + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.1.tgz#81382d6ecb92b8dda70e91f9035611cb2fecd1c3" + integrity sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/type-utils" "5.60.0" - "@typescript-eslint/utils" "5.60.0" + "@typescript-eslint/scope-manager" "5.60.1" + "@typescript-eslint/type-utils" "5.60.1" + "@typescript-eslint/utils" "5.60.1" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -5316,78 +5332,78 @@ tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.3.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.60.0.tgz#48ffa47238592397c3d857fe1403eed3b1d5e604" - integrity sha512-ovid3u7CNBrr0Ct35LUPkNYH4e+z4Kc6dPfSG99oMmH9SfoEoefq09uSnJI4mUb/UM7a/peVM03G+MzLxrD16g== + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.60.1.tgz#d783bb63b9183541019a945eda6a9d96b096d985" + integrity sha512-TXUdLxv2t8181nh5yLXl/Gr/zKj1ZofQ7m+ZdmG2+El0TYOHCvlZfc35D4nturemC3RUnf3KmLuFp3bVBjkG5w== dependencies: - "@typescript-eslint/utils" "5.60.0" + "@typescript-eslint/utils" "5.60.1" "@typescript-eslint/parser@^5.13.0", "@typescript-eslint/parser@^5.7.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.0.tgz#08f4daf5fc6548784513524f4f2f359cebb4068a" - integrity sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ== + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.60.1.tgz#0f2f58209c0862a73e3d5a56099abfdfa21d0fd3" + integrity sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q== dependencies: - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" + "@typescript-eslint/scope-manager" "5.60.1" + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/typescript-estree" "5.60.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz#ae511967b4bd84f1d5e179bb2c82857334941c1c" - integrity sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ== +"@typescript-eslint/scope-manager@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.60.1.tgz#35abdb47f500c68c08f2f2b4f22c7c79472854bb" + integrity sha512-Dn/LnN7fEoRD+KspEOV0xDMynEmR3iSHdgNsarlXNLGGtcUok8L4N71dxUgt3YvlO8si7E+BJ5Fe3wb5yUw7DQ== dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/visitor-keys" "5.60.1" -"@typescript-eslint/type-utils@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz#69b09087eb12d7513d5b07747e7d47f5533aa228" - integrity sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g== +"@typescript-eslint/type-utils@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.60.1.tgz#17770540e98d65ab4730c7aac618003f702893f4" + integrity sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A== dependencies: - "@typescript-eslint/typescript-estree" "5.60.0" - "@typescript-eslint/utils" "5.60.0" + "@typescript-eslint/typescript-estree" "5.60.1" + "@typescript-eslint/utils" "5.60.1" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.0.tgz#3179962b28b4790de70e2344465ec97582ce2558" - integrity sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA== +"@typescript-eslint/types@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.60.1.tgz#a17473910f6b8d388ea83c9d7051af89c4eb7561" + integrity sha512-zDcDx5fccU8BA0IDZc71bAtYIcG9PowaOwaD8rjYbqwK7dpe/UMQl3inJ4UtUK42nOCT41jTSCwg76E62JpMcg== -"@typescript-eslint/typescript-estree@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz#4ddf1a81d32a850de66642d9b3ad1e3254fb1600" - integrity sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ== +"@typescript-eslint/typescript-estree@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.1.tgz#8c71824b7165b64d5ebd7aa42968899525959834" + integrity sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw== dependencies: - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/visitor-keys" "5.60.0" + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/visitor-keys" "5.60.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.60.0", "@typescript-eslint/utils@^5.10.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.0.tgz#4667c5aece82f9d4f24a667602f0f300864b554c" - integrity sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ== +"@typescript-eslint/utils@5.60.1", "@typescript-eslint/utils@^5.10.0": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.60.1.tgz#6861ebedbefba1ac85482d2bdef6f2ff1eb65b80" + integrity sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.60.0" - "@typescript-eslint/types" "5.60.0" - "@typescript-eslint/typescript-estree" "5.60.0" + "@typescript-eslint/scope-manager" "5.60.1" + "@typescript-eslint/types" "5.60.1" + "@typescript-eslint/typescript-estree" "5.60.1" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.60.0": - version "5.60.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz#b48b29da3f5f31dd1656281727004589d2722a66" - integrity sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw== +"@typescript-eslint/visitor-keys@5.60.1": + version "5.60.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.1.tgz#19a877358bf96318ec35d90bfe6bd1445cce9434" + integrity sha512-xEYIxKcultP6E/RMKqube11pGjXH1DCo60mQoWhVYyKfLkwbIVVjYxmOenNMxILx0TjCujPTjjnTIVzm09TXIw== dependencies: - "@typescript-eslint/types" "5.60.0" + "@typescript-eslint/types" "5.60.1" eslint-visitor-keys "^3.3.0" "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": @@ -5689,9 +5705,9 @@ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== "@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.46" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" - integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== + version "3.0.0-rc.47" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.47.tgz#2b67a2f5098cafcd0a1ce7f2e9174794d639046e" + integrity sha512-ri/QnMiMobEgRUBF1fPcxH1ICa9jsG8y4tDNRAuk6zPdCPkSAzACKaXjmDiAZFiwKxK4hTVj0E8nklgWFeTLng== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -6045,9 +6061,9 @@ aria-query@5.1.3: deep-equal "^2.0.5" aria-query@^5.0.0, aria-query@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.2.1.tgz#bc285d9d654d1df121bcd0c134880d415ca67c15" - integrity sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g== + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" @@ -6099,7 +6115,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.0.3, array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.0.3, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -6122,11 +6138,6 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-union@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" - integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== - array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -7086,9 +7097,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001503: - version "1.0.30001507" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001507.tgz#fae53f6286e7564783eadea9b447819410a59534" - integrity sha512-SFpUDoSLCaE5XYL2jfqe9ova/pbQHEmbheDf5r4diNwbAgR3qxM9NQtfsiSscjqoya5K7kFcHPUQ+VsUkIJR4A== + version "1.0.30001509" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz#2b7ad5265392d6d2de25cd8776d1ab3899570d14" + integrity sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA== capture-exit@^2.0.0: version "2.0.0" @@ -7807,18 +7818,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -copy-webpack-plugin@^10.2.4: - version "10.2.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" - integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^12.0.2" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - core-js-compat@^3.30.1, core-js-compat@^3.30.2, core-js-compat@^3.8.1: version "3.31.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.0.tgz#4030847c0766cc0e803dcdfb30055d7ef2064bf1" @@ -8913,9 +8912,9 @@ ejs@^3.1.7: jake "^10.8.5" electron-to-chromium@^1.4.431: - version "1.4.439" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.439.tgz#d0748e8128c18f92354d3412dfb2104c3fb90e8f" - integrity sha512-BHpErPSNhb9FB25+OwQP6mCAf3ZXfGbmuvc4LzBNVJwpCcXQJm++LerimocYRG9FRxUVRKZqaB7d0+pImSTPSg== + version "1.4.445" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz#058d2c5f3a2981ab1a37440f5a5e42d15672aa6d" + integrity sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA== elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -9018,9 +9017,9 @@ env-paths@^2.2.0: integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== envinfo@^7.7.3, envinfo@^7.7.4: - version "7.9.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.9.0.tgz#47594a13081be0d9be6e513534e8c58dbb26c7a1" - integrity sha512-RODB4txU+xImYDemN5DqaKC0CHk05XSVkOX4pq0hK26Qx+1LChkuOyUDlGEjYb3ACr0n9qBhFjg37hQuJvpkRQ== + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== err-code@^2.0.2: version "2.0.3" @@ -9854,7 +9853,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.2.7, fast-glob@^3.2.9: +fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -9972,6 +9971,14 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +file-system-cache@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.3.0.tgz#201feaf4c8cd97b9d0d608e96861bb6005f46fe6" + integrity sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ== + dependencies: + fs-extra "11.1.1" + ramda "0.29.0" + file-system-cache@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-1.1.0.tgz#984de17b976b75a77a27e08d6828137c1aa80fa1" @@ -9980,14 +9987,6 @@ file-system-cache@^1.0.5: fs-extra "^10.1.0" ramda "^0.28.0" -file-system-cache@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/file-system-cache/-/file-system-cache-2.3.0.tgz#201feaf4c8cd97b9d0d608e96861bb6005f46fe6" - integrity sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ== - dependencies: - fs-extra "11.1.1" - ramda "0.29.0" - file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -10552,7 +10551,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^6.0.1, glob-parent@^6.0.2: +glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -10601,15 +10600,15 @@ glob@7.2.0: path-is-absolute "^1.0.0" glob@^10.2.2: - version "10.3.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.0.tgz#763d02a894f3cdfc521b10bbbbc8e0309e750cce" - integrity sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg== + version "10.3.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.1.tgz#9789cb1b994515bedb811a6deca735b5c37d2bf4" + integrity sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw== dependencies: foreground-child "^3.1.0" jackspeak "^2.0.3" minimatch "^9.0.1" minipass "^5.0.0 || ^6.0.2" - path-scurry "^1.7.0" + path-scurry "^1.10.0" glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" @@ -10683,18 +10682,6 @@ globby@11.1.0, globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^12.0.2: - version "12.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" - integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== - dependencies: - array-union "^3.0.1" - dir-glob "^3.0.1" - fast-glob "^3.2.7" - ignore "^5.1.9" - merge2 "^1.4.1" - slash "^4.0.0" - globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -10974,11 +10961,6 @@ he@1.2.0, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hello-wasm-pack@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/hello-wasm-pack/-/hello-wasm-pack-0.1.0.tgz#482a2e3371828056ac35f5b5fec76c0b99dcd530" - integrity sha512-3hx0GDkDLf/a9ThCMV2qG4mwza8N/MCtm8aeFFc/cdBCL2zMJ1kW1wjNl7xPqD1lz8Yl5+uhnc/cpui4dLwz/w== - hex-rgb@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-4.3.0.tgz#af5e974e83bb2fefe44d55182b004ec818c07776" @@ -11051,9 +11033,9 @@ html-encoding-sniffer@^2.0.1: whatwg-encoding "^1.0.5" html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.6" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.6.tgz#966391d58e5737c77bca4025e31721b496ab7454" - integrity sha512-9o0+dcpIw2/HxkNuYKxSJUF/MMRZQECK4GnF+oQOmJ83yCVHTWgCH5aOXxK5bozNRmM8wtgryjHD3uloPBDEGw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-escaper@^2.0.0: version "2.0.2" @@ -11303,7 +11285,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4, ignore@^5.1.9, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -12916,12 +12898,14 @@ jss@10.10.0, jss@^10.10.0: tiny-warning "^1.0.2" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" junk@^3.1.0: version "3.1.0" @@ -13384,10 +13368,10 @@ lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -lru-cache@^9.1.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" - integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== lunr@^2.3.9: version "2.3.9" @@ -13724,9 +13708,9 @@ mem@^8.1.1: mimic-fn "^3.1.0" memfs@^3.1.2, memfs@^3.2.2, memfs@^3.4.1, memfs@^3.4.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.3.tgz#d9b40fe4f8d5788c5f895bda804cd0d9eeee9f3b" - integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" @@ -14248,9 +14232,9 @@ minimatch@^8.0.2: brace-expansion "^2.0.1" minimatch@^9.0.0, minimatch@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + version "9.0.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.2.tgz#397e387fff22f6795844d00badc903a3d5de7057" + integrity sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg== dependencies: brace-expansion "^2.0.1" @@ -15104,7 +15088,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.2, object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.2, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -15233,16 +15217,16 @@ optionator@^0.8.1: word-wrap "~1.2.3" optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ora@^5.4.1: version "5.4.1" @@ -15682,12 +15666,12 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.6.1, path-scurry@^1.7.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" - integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== +path-scurry@^1.10.0, path-scurry@^1.6.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.0.tgz#0ffbd4c1f7de9600f98a1405507d9f9acb438ab3" + integrity sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g== dependencies: - lru-cache "^9.1.1" + lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2" path-to-regexp@0.1.7: @@ -16659,9 +16643,9 @@ react-google-charts@^3.0.15: react-load-script "^0.0.6" react-hook-form@^7.14.2: - version "7.45.0" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.45.0.tgz#df2bbc8cee598855a63ba446e0bb06f7c8120ccf" - integrity sha512-AbHeZ4ad+0dEIknSW9dBgIwcvRDfZ1O97sgj75WaMdOX0eg8TBiUf9wxzVkIjZbk76BBIE9lmFOzyD4PN80ZQg== + version "7.45.1" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.45.1.tgz#e352c7f4dbc7540f0756abbb4dcfd1122fecc9bb" + integrity sha512-6dWoFJwycbuFfw/iKMcl+RdAOAOHDiF11KWYhNDRN/OkUt+Di5qsZHwA0OwsVnu9y135gkHpTw9DJA+WzCeR9w== react-identicons@^1.2.5: version "1.2.5" @@ -16751,19 +16735,19 @@ react-resize-detector@^8.0.4: lodash "^4.17.21" react-router-dom@6, react-router-dom@^6.7.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.13.0.tgz#6651f456bb2af42ef14f6880123b1f575539e81f" - integrity sha512-6Nqoqd7fgwxxVGdbiMHTpDHCYPq62d7Wk1Of7B82vH7ZPwwsRaIa22zRZKPPg413R5REVNiyuQPKDG1bubcOFA== + version "6.14.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.14.0.tgz#7ce6c3f73549e4d40216ba150253d3bf30812b33" + integrity sha512-YEwlApKwzMMMbGbhh+Q7MsloTldcwMgHxUY/1g0uA62+B1hZo2jsybCWIDCL8zvIDB1FA0pBKY9chHbZHt+2dQ== dependencies: - "@remix-run/router" "1.6.3" - react-router "6.13.0" + "@remix-run/router" "1.7.0" + react-router "6.14.0" -react-router@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.13.0.tgz#7e4427a271dae0cafbdb88c56ccbd9b1434ee93f" - integrity sha512-Si6KnfEnJw7gUQkNa70dlpI1bul46FuSxX5t5WwlUBxE25DAz2BjVkwaK8Y2s242bQrZPXCpmwLPtIO5pv4tXg== +react-router@6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.14.0.tgz#1c3e8e922d934d43a253fd862c72c82167c0a7f1" + integrity sha512-OD+vkrcGbvlwkspUFDgMzsu1RXwdjNh83YgG/28lBnDzgslhCgxIqoExLlxsfTpIygp7fc+Hd3esloNwzkm2xA== dependencies: - "@remix-run/router" "1.6.3" + "@remix-run/router" "1.7.0" react-simple-maps@^2.3.0: version "2.3.0" @@ -16784,9 +16768,9 @@ react-smooth@^2.0.2: react-transition-group "2.9.0" react-tooltip@*: - version "5.15.0" - resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.15.0.tgz#54a1fdbd43b5ce90733c7495bc8b575e9c88f58e" - integrity sha512-OiH870zteP4T5B/J7cUGz37aY8C0Cny/i1qcLXevL+wZlW09mfjdcQ6FKP9OMMsRlszRwieOqAPT9l8rWz+BtA== + version "5.16.1" + resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-5.16.1.tgz#dafb42170c50d93eaa06e26581ba8e6f7ceb2c48" + integrity sha512-z3IKJppX4llW8wQLQB3o5qUutVul79HVXI+Ncjf/5FMHbniCYPnxS1oCLpOhOEG9lV2QZRrQe9+l/pLEPOrrXA== dependencies: "@floating-ui/dom" "^1.0.0" classnames "^2.3.0" @@ -16965,9 +16949,9 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre util-deprecate "^1.0.1" readable-stream@^4.1.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468" - integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg== + version "4.4.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.1.tgz#fa0f0878c3bc0c12b6a82e4e58c5dc160e1faaa2" + integrity sha512-llAHX9QC25bz5RPIoTeJxPaA/hgryaldValRhVZ2fK9bzbmFiscpz8fw6iBTvJfAk1w4FC1KXQme/nO7fbKyKg== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -17416,9 +17400,9 @@ rollup-plugin-web-worker-loader@^1.6.1: integrity sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== rollup@^3.17.2, rollup@^3.2.1, rollup@^3.9.1: - version "3.25.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.25.1.tgz#9fff79d22ff1a904b2b595a2fb9bc3793cb987d8" - integrity sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ== + version "3.25.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.25.3.tgz#f9a8986f0f244bcfde2208da91ba46b8fd252551" + integrity sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw== optionalDependencies: fsevents "~2.3.2" @@ -17903,11 +17887,6 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -18728,9 +18707,9 @@ terser@^4.1.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.10.0, terser@^5.15.1, terser@^5.16.8, terser@^5.3.4: - version "5.18.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.1.tgz#6d8642508ae9fb7b48768e48f16d675c89a78460" - integrity sha512-j1n0Ao919h/Ai5r43VAnfV/7azUYW43GPxK7qSATzrsERfW7+y2QW9Cp9ufnRF5CQUWbnLSo7UJokSWCqg4tsQ== + version "5.18.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948" + integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -18976,9 +18955,9 @@ ts-jest@^27.0.5: yargs-parser "20.x" ts-loader@^9.4.2: - version "9.4.3" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.3.tgz#55cfa7c28dd82a2de968ae45c3adb75fb888b27e" - integrity sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA== + version "9.4.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" + integrity sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -19070,10 +19049,10 @@ tslib@^1.8.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, "tslib@^2.4.1 || ^1.9.3": + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== tsutils@^3.21.0: version "3.21.0" @@ -19878,7 +19857,7 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^4.8.0, webpack-cli@^4.9.2: +webpack-cli@^4.8.0: version "4.10.0" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== @@ -19930,7 +19909,7 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.5.0, webpack-dev-server@^4.7.4: +webpack-dev-server@^4.5.0: version "4.15.1" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== @@ -20057,10 +20036,10 @@ webpack@4: watchpack "^1.7.4" webpack-sources "^1.4.1" -"webpack@>=4.43.0 <6.0.0", webpack@^5.70.0, webpack@^5.75.0, webpack@^5.9.0: - version "5.88.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.0.tgz#a07aa2f8e7a64a8f1cec0c6c2e180e3cb34440c8" - integrity sha512-O3jDhG5e44qIBSi/P6KpcCcH7HD+nYIHVBhdWFxcLOcIGN8zGo5nqF3BjyNCxIh4p1vFdNnreZv2h2KkoAw3lw== +"webpack@>=4.43.0 <6.0.0", webpack@^5.75.0, webpack@^5.9.0: + version "5.88.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" + integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -20203,7 +20182,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==