diff --git a/.github/workflows/cloudflare-pages.yml b/.github/workflows/cloudflare-pages.yml new file mode 100644 index 00000000..2533e368 --- /dev/null +++ b/.github/workflows/cloudflare-pages.yml @@ -0,0 +1,48 @@ +name: Cloudflare Pages + +on: [push] + +jobs: + publish: + runs-on: ubuntu-20.04 + permissions: + contents: read + deployments: write + statuses: write + steps: + - name: Checkout + uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18.x + - run: node common/scripts/install-run-rush.js install + - run: node common/scripts/install-run-rush.js build --verbose + - run: npx next export + working-directory: ./apps/demo + + - name: Publish to Cloudflare Pages + id: cloudflare_pages_deploy + uses: cloudflare/pages-action@1 + with: + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + projectName: piping-adb + directory: './apps/demo/out' + gitHubToken: ${{ secrets.GITHUB_TOKEN }} + + - name: Add publish URL as commit status + uses: actions/github-script@v6 + with: + script: | + // When "pull_request", context.payload.pull_request?.head.sha is expected SHA. + // (base: https://github.community/t/github-sha-isnt-the-value-expected/17903/2) + const sha = context.payload.pull_request?.head.sha ?? context.sha; + await github.rest.repos.createCommitStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + context: 'Cloudflare Pages', + description: 'Cloudflare Pages deployment', + state: 'success', + sha, + target_url: "${{ steps.cloudflare_pages_deploy.outputs.url }}", + }); diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 3a5f323d..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,40 +0,0 @@ -# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Deploy - -on: - push: - branches: [main] - -env: - BASE_PATH: /ya-webadb - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Use Node.js 18.x - uses: actions/setup-node@v3 - with: - node-version: 18.x - - - run: node common/scripts/install-run-rush.js install - - run: node common/scripts/install-run-rush.js build --verbose - - - run: npx next export - working-directory: ./apps/demo - - - run: touch apps/demo/out/.nojekyll - - - name: Deploy - uses: s0/git-publish-subdir-action@develop - env: - REPO: self - BRANCH: gh-pages - FOLDER: apps/demo/out - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/netlify.yml b/.github/workflows/netlify.yml new file mode 100644 index 00000000..270b039e --- /dev/null +++ b/.github/workflows/netlify.yml @@ -0,0 +1,32 @@ +name: Build and Deploy to Netlify + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18.x + - run: node common/scripts/install-run-rush.js install + - run: node common/scripts/install-run-rush.js build --verbose + - run: npx next export + working-directory: ./apps/demo + - name: Deploy to Netlify + uses: nwtgck/actions-netlify@v1.2 + with: + publish-dir: './apps/demo/out' + production-branch: main + github-token: ${{ secrets.GITHUB_TOKEN }} + deploy-message: "Deploy from GitHub Actions" + enable-pull-request-comment: false + enable-commit-comment: true + overwrites-pull-request-comment: true + env: + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + timeout-minutes: 1 diff --git a/.gitignore b/.gitignore index 2a09a15b..1e58ac7c 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,5 @@ dts esm dist *.tsbuildinfo + +/.pnpm-store diff --git a/README.md b/README.md index a870c15d..5f20e350 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,25 @@ -# Tango +# Piping ADB +[Android Debug Bridge (ADB)](https://developer.android.com/studio/command-line/adb) over [Piping Server](https://github.com/nwtgck/piping-server) on Web browser + +## Usage +First, open adbd 5555 port on an Android device using `adb tcpip 5555` or `su 0 setprop service.adb.tcp.port 5555; su 0 stop adbd; su 0 start adbd` + +Second, the device starts a tunneling over Piping Server in some way, equivalent to the following command: +```bash +curl -sSN https://ppng.io/mycspath | nc localhost 5555 | curl -sSNT - https://ppng.io/myscpath +``` + +- [Termux](https://termux.dev) is useful to run `curl` and `nc`. +- See "[Secure TCP tunnel from anywhere with curl and nc for single connection](https://dev.to/nwtgck/secure-tcp-tunnel-from-anywhere-with-curl-and-nc-for-single-connection-2k5i)" to know how the tunneling works. + +Finally, open the following URL on a Chromium-based browser. + + +## Acknowledgements + +This project is highly based on [ya-webadb](https://github.com/yume-chan/ya-webadb). Thanks to the original author! + +The following document is from the original README. [![MIT license](https://img.shields.io/github/license/yume-chan/ya-webadb)](https://github.com/yume-chan/ya-webadb/blob/main/LICENSE) diff --git a/apps/demo/next.config.js b/apps/demo/next.config.js index 85c7c9f0..cfa6daa4 100644 --- a/apps/demo/next.config.js +++ b/apps/demo/next.config.js @@ -83,6 +83,7 @@ module.exports = pipe( }, }, withBundleAnalyzer, - withPwa, + // NOTE: `withPwa` tries to cache a GET response to Piping Server + // withPwa, withMDX ); diff --git a/apps/demo/public/manifest.json b/apps/demo/public/manifest.json new file mode 100644 index 00000000..c6b02978 --- /dev/null +++ b/apps/demo/public/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Tango", + "short_name": "Tango", + "categories": [ + "utilities", + "developer" + ], + "description": "ADB in your browser", + "scope": "/", + "start_url": "/", + "background_color": "#ffffff", + "display": "standalone", + "icons": [ + { + "src": "favicon-256.png", + "type": "image/png", + "sizes": "256x256" + } + ] +} \ No newline at end of file diff --git a/apps/demo/src/adb-piping-backend.ts b/apps/demo/src/adb-piping-backend.ts new file mode 100644 index 00000000..7469cc74 --- /dev/null +++ b/apps/demo/src/adb-piping-backend.ts @@ -0,0 +1,74 @@ +import { AdbPacket, AdbPacketSerializeStream, type AdbDaemonDevice } from '@yume-chan/adb'; +import { + Consumable, ConsumableWritableStream, + DuplexStreamFactory, + pipeFrom, + ReadableStream as YumeChanReadableStream, + StructDeserializeStream, +} from '@yume-chan/stream-extra'; + +export class AdbPipingBackend implements AdbDaemonDevice { + public readonly serial: string; + public readonly name: string | undefined = undefined; + + public constructor(private params: { + csUrl: string, + scUrl: string, + csHeaders: Headers | undefined, + scHeaders: Headers | undefined, + }) { + this.serial = `piping_${params.csUrl}_${params.scUrl}`; + } + + public async connect() { + const {readable: uploadReadableStream, writable: uploadWritableStream} = new TransformStream(); + fetch(this.params.csUrl, { + method: "POST", + // headers: this.params.csHeaders, + body: uploadReadableStream, + duplex: "half", + } as RequestInit); + + const scResReaderPromise = (async () => { + const scRes = await fetch(this.params.scUrl, { + headers: this.params.scHeaders, + }); + return scRes.body!.getReader(); + })() + + const scReadableStream = new ReadableStream({ + async pull(ctrl) { + const reader = await scResReaderPromise; + const result = await reader.read(); + if (result.done) { + ctrl.close(); + return; + } + ctrl.enqueue(result.value); + } + }); + + const duplex = new DuplexStreamFactory< + Uint8Array, + Consumable + >({ + close: () => { + // TODO: impl + console.log("TODO: close"); + }, + }); + + const readable = duplex.wrapReadable(scReadableStream as YumeChanReadableStream); + const uploadWritableStreamWriter = uploadWritableStream.getWriter(); + const writable = duplex.createWritable(new ConsumableWritableStream({ + async write(chunk) { + await uploadWritableStreamWriter.write(chunk); + } + })); + + return { + readable: readable.pipeThrough(new StructDeserializeStream(AdbPacket)), + writable: pipeFrom(writable, new AdbPacketSerializeStream()), + }; + } +} diff --git a/apps/demo/src/components/connect.tsx b/apps/demo/src/components/connect.tsx index a24073a6..a16820d9 100644 --- a/apps/demo/src/components/connect.tsx +++ b/apps/demo/src/components/connect.tsx @@ -34,13 +34,22 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { GLOBAL_STATE } from "../state"; import { CommonStackTokens, Icons } from "../utils"; +import {AdbPipingBackend} from "../adb-piping-backend"; +import {useRouter} from "next/router"; + const DropdownStyles = { dropdown: { width: "100%" } }; const CredentialStore = new AdbWebCredentialStore(); +function urlJoin(baseUrl: string, path: string): string { + return baseUrl.replace(/\/$/, '') + "/" + path; +} + function _Connect(): JSX.Element | null { const [selected, setSelected] = useState(); + const router = useRouter(); const [connecting, setConnecting] = useState(false); + const [autoConnect, setAutoConnect] = useState(false); const [usbSupported, setUsbSupported] = useState(true); const [usbDeviceList, setUsbDeviceList] = useState([]); @@ -170,6 +179,38 @@ function _Connect(): JSX.Element | null { }); }, []); + const [pipingBackendList, setPipingBackendList] = useState([]); + + useEffect(() => { + const pipingSererUrl = router.query["server"] as string ?? "https://ppng.io"; + const csPath = router.query["cs_path"] as string | undefined; + const scPath = router.query["sc_path"] as string | undefined; + if (csPath === undefined || scPath === undefined) { + return; + } + const headersString = router.query["headers"] as string | undefined; + const headers = headersString === undefined ? undefined : new Headers(JSON.parse(decodeURIComponent(headersString))); + const adbPipingBackend = new AdbPipingBackend({ + csUrl: urlJoin(pipingSererUrl, csPath), + scUrl: urlJoin(pipingSererUrl, scPath), + scHeaders: headers, + csHeaders: headers, + }); + setPipingBackendList([adbPipingBackend]); + // setSelectedBackend(adbPipingBackend); + setSelected(adbPipingBackend); + const autoConnectString = router.query["auto_connect"] as string | undefined; + setAutoConnect(autoConnectString === "" || autoConnectString === "true" || autoConnectString === "1"); + }, [router]); + + useEffect(() => { + if (autoConnect) { + console.log("auto connecting...", selected); + connect(); + } + }, [autoConnect]); + + const handleSelectedChange = ( e: React.FormEvent, option?: IDropdownOption @@ -270,7 +311,7 @@ function _Connect(): JSX.Element | null { webSocketDeviceList, tcpDeviceList ), - [usbDeviceList, webSocketDeviceList, tcpDeviceList] + [usbDeviceList, webSocketDeviceList, tcpDeviceList, pipingBackendList] ); const deviceOptions = useMemo(() => { diff --git a/apps/demo/src/pages/_app.tsx b/apps/demo/src/pages/_app.tsx index 1d15dd24..1bac4633 100644 --- a/apps/demo/src/pages/_app.tsx +++ b/apps/demo/src/pages/_app.tsx @@ -165,7 +165,7 @@ function App({ Component, pageProps }: AppProps) { /> -
Tango
+
Piping ADB
{ return ( - BugReport - Tango + BugReport - Piping ADB diff --git a/apps/demo/src/pages/device-info.tsx b/apps/demo/src/pages/device-info.tsx index 9de9e65e..2c0a6e39 100644 --- a/apps/demo/src/pages/device-info.tsx +++ b/apps/demo/src/pages/device-info.tsx @@ -42,7 +42,7 @@ const DeviceInfo: NextPage = () => { return ( - Device Info - Tango + Device Info - Piping ADB diff --git a/apps/demo/src/pages/file-manager.tsx b/apps/demo/src/pages/file-manager.tsx index 47676cf0..41d426f5 100644 --- a/apps/demo/src/pages/file-manager.tsx +++ b/apps/demo/src/pages/file-manager.tsx @@ -871,7 +871,7 @@ const FileManager: NextPage = (): JSX.Element | null => { return ( - File Manager - Tango + File Manager - Piping ADB diff --git a/apps/demo/src/pages/framebuffer.tsx b/apps/demo/src/pages/framebuffer.tsx index 5bc1aa20..018cdd1c 100644 --- a/apps/demo/src/pages/framebuffer.tsx +++ b/apps/demo/src/pages/framebuffer.tsx @@ -143,7 +143,7 @@ const FrameBuffer: NextPage = (): JSX.Element | null => { return ( - Screen Capture - Tango + Screen Capture - Piping ADB ya-webadb project, which can use ADB protocol to control Android phones, directly from Web browsers (or Node.js). +Source code is located in [https://github.com/nwtgck/piping-adb-web](https://github.com/nwtgck/piping-adb-web). + +## Usage +First, open adbd 5555 port on an Android device using `adb tcpip 5555` or `su 0 setprop service.adb.tcp.port 5555; su 0 stop adbd; su 0 start adbd` + +Second, the device starts a tunneling over Piping Server in some way, equivalent to the following command: +```bash +curl -sSN https://ppng.io/mycspath | nc localhost 5555 | curl -sSNT - https://ppng.io/myscpath +``` + +- [Termux](https://termux.dev) is useful to run `curl` and `nc`. +- See "[Secure TCP tunnel from anywhere with curl and nc for single connection](https://dev.to/nwtgck/secure-tcp-tunnel-from-anywhere-with-curl-and-nc-for-single-connection-2k5i)" to know how the tunneling works. + +Finally, open the following URL on a Chromium-based browser. + +[https://piping-adb.nwtgck.org/?auto_connect&server=https://ppng.io&cs_path=mycspath&sc_path=myscpath](https://piping-adb.nwtgck.org/?auto_connect&server=https://ppng.io&cs_path=mycspath&sc_path=myscpath) + +## Acknowledgements + +This project is highly based on [ya-webadb](https://github.com/yume-chan/ya-webadb). Thanks to the original author! + +The following document is from the original README. + +--- It started because I want to try the WebUSB API, and because I have an Android phone. It's not production-ready, and I don't recommend normal users to try it. If you have any questions or suggestions, please file an issue at here. @@ -51,7 +74,7 @@ Extra software is required to bridge the connection. See - Tango + Piping ADB {children} diff --git a/apps/demo/src/pages/install.tsx b/apps/demo/src/pages/install.tsx index 8a67ec4c..3ea5bb14 100644 --- a/apps/demo/src/pages/install.tsx +++ b/apps/demo/src/pages/install.tsx @@ -145,7 +145,7 @@ const Install: NextPage = () => { return ( - Install APK - Tango + Install APK - Piping ADB diff --git a/apps/demo/src/pages/logcat.tsx b/apps/demo/src/pages/logcat.tsx index 3096a1cb..e33eefd6 100644 --- a/apps/demo/src/pages/logcat.tsx +++ b/apps/demo/src/pages/logcat.tsx @@ -810,7 +810,7 @@ const LogcatPage: NextPage = () => { return ( - Logcat - Tango + Logcat - Piping ADB diff --git a/apps/demo/src/pages/packet-log.tsx b/apps/demo/src/pages/packet-log.tsx index 62425ff5..aa365919 100644 --- a/apps/demo/src/pages/packet-log.tsx +++ b/apps/demo/src/pages/packet-log.tsx @@ -322,7 +322,7 @@ const PacketLog: NextPage = () => { return ( - Packet Log - Tango + Packet Log - Piping ADB diff --git a/apps/demo/src/pages/power.tsx b/apps/demo/src/pages/power.tsx index 4ede7b81..89a984de 100644 --- a/apps/demo/src/pages/power.tsx +++ b/apps/demo/src/pages/power.tsx @@ -19,7 +19,7 @@ const Power: NextPage = () => { return ( - Power Menu - Tango + Power Menu - Piping ADB
diff --git a/apps/demo/src/pages/scrcpy.tsx b/apps/demo/src/pages/scrcpy.tsx index a0d3800b..e495a0cf 100644 --- a/apps/demo/src/pages/scrcpy.tsx +++ b/apps/demo/src/pages/scrcpy.tsx @@ -228,7 +228,7 @@ const Scrcpy: NextPage = () => { return ( - Scrcpy - Tango + Scrcpy - Piping ADB {STATE.running ? ( diff --git a/apps/demo/src/pages/shell.tsx b/apps/demo/src/pages/shell.tsx index a8314004..add8323e 100644 --- a/apps/demo/src/pages/shell.tsx +++ b/apps/demo/src/pages/shell.tsx @@ -28,7 +28,7 @@ const Shell: NextPage = (): JSX.Element | null => { return ( <> - Interactive Shell - Tango + Interactive Shell - Piping ADB
diff --git a/apps/demo/src/pages/tcpip.tsx b/apps/demo/src/pages/tcpip.tsx index 48e46258..594de679 100644 --- a/apps/demo/src/pages/tcpip.tsx +++ b/apps/demo/src/pages/tcpip.tsx @@ -169,7 +169,7 @@ const TcpIp: NextPage = () => { return ( - ADB over WiFi - Tango + ADB over WiFi - Piping ADB diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 17209840..1ab9c7ee 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -7,10 +7,10 @@ importers: ../../apps/cli: specifiers: - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/adb-server-node-tcp': workspace:^0.0.19 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 commander: ^10.0.1 eslint: ^8.41.0 @@ -49,25 +49,25 @@ importers: '@types/dom-webcodecs': ^0.1.6 '@types/node': ^20.2.1 '@types/react': 18.2.6 - '@yume-chan/adb': workspace:^0.0.19 - '@yume-chan/adb-credential-web': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 + '@yume-chan/adb-credential-web': workspace:^0.0.20 '@yume-chan/adb-daemon-direct-sockets': workspace:^0.0.9 - '@yume-chan/adb-daemon-webusb': workspace:^0.0.19 + '@yume-chan/adb-daemon-webusb': workspace:^0.0.20 '@yume-chan/adb-daemon-ws': workspace:^0.0.9 - '@yume-chan/adb-scrcpy': workspace:^0.0.19 - '@yume-chan/android-bin': workspace:^0.0.19 - '@yume-chan/aoa': workspace:^0.0.19 + '@yume-chan/adb-scrcpy': workspace:^0.0.20 + '@yume-chan/android-bin': workspace:^0.0.20 + '@yume-chan/aoa': workspace:^0.0.20 '@yume-chan/async': ^2.2.0 - '@yume-chan/b-tree': workspace:^0.0.19 - '@yume-chan/event': workspace:^0.0.19 + '@yume-chan/b-tree': workspace:^0.0.20 + '@yume-chan/event': workspace:^0.0.20 '@yume-chan/next-pwa': 5.6.0-mod.2 - '@yume-chan/pcm-player': workspace:^0.0.19 - '@yume-chan/scrcpy': workspace:^0.0.19 - '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.19 - '@yume-chan/scrcpy-decoder-webcodecs': workspace:^0.0.19 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/pcm-player': workspace:^0.0.20 + '@yume-chan/scrcpy': workspace:^0.0.20 + '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.20 + '@yume-chan/scrcpy-decoder-webcodecs': workspace:^0.0.20 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/stream-saver': ^2.0.6 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tabby-launcher': workspace:^1.0.197-nightly.1 '@yume-chan/undici-browser': 5.22.1-mod.7 comlink: ^4.4.1 @@ -139,12 +139,12 @@ importers: '@solidjs/meta': ^0.28.2 '@solidjs/router': ^0.8.2 '@types/node': ^20.2.1 - '@yume-chan/adb': workspace:^0.0.19 - '@yume-chan/adb-credential-web': workspace:^0.0.19 - '@yume-chan/adb-daemon-webusb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 + '@yume-chan/adb-credential-web': workspace:^0.0.20 + '@yume-chan/adb-daemon-webusb': workspace:^0.0.20 '@yume-chan/async': ^2.2.0 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 esbuild: ^0.14.54 postcss: ^8.4.21 solid-js: ^1.7.2 @@ -179,11 +179,11 @@ importers: '@jest/globals': ^29.5.0 '@types/node': ^20.2.1 '@yume-chan/async': ^2.2.0 - '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.19 + '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/event': workspace:^0.0.19 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/event': workspace:^0.0.20 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 eslint: ^8.41.0 @@ -215,7 +215,7 @@ importers: ../../libraries/adb-credential-web: specifiers: - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/tsconfig': workspace:^1.0.0 eslint: ^8.41.0 @@ -234,9 +234,9 @@ importers: ../../libraries/adb-daemon-direct-sockets: specifiers: - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 eslint: ^8.41.0 prettier: ^2.8.8 @@ -256,10 +256,10 @@ importers: ../../libraries/adb-daemon-webusb: specifiers: '@types/w3c-web-usb': ^1.0.6 - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 eslint: ^8.41.0 prettier: ^2.8.8 @@ -280,9 +280,9 @@ importers: ../../libraries/adb-daemon-ws: specifiers: - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 eslint: ^8.41.0 jest: ^29.5.0 @@ -304,13 +304,13 @@ importers: ../../libraries/adb-scrcpy: specifiers: '@jest/globals': ^29.5.0 - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/async': ^2.2.0 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/event': workspace:^0.0.19 - '@yume-chan/scrcpy': workspace:^0.0.19 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/event': workspace:^0.0.20 + '@yume-chan/scrcpy': workspace:^0.0.20 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 eslint: ^8.41.0 @@ -341,10 +341,10 @@ importers: ../../libraries/adb-server-node-tcp: specifiers: '@types/node': ^20.2.1 - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 eslint: ^8.41.0 jest: ^29.5.0 @@ -367,10 +367,10 @@ importers: ../../libraries/android-bin: specifiers: - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 eslint: ^8.41.0 prettier: ^2.8.8 @@ -505,8 +505,8 @@ importers: specifiers: '@jest/globals': ^29.5.0 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/stream-extra': workspace:^0.0.19 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 eslint: ^8.41.0 @@ -537,9 +537,9 @@ importers: '@jest/globals': ^29.5.0 '@yume-chan/async': ^2.2.0 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/event': workspace:^0.0.19 - '@yume-chan/scrcpy': workspace:^0.0.19 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/event': workspace:^0.0.20 + '@yume-chan/scrcpy': workspace:^0.0.20 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 eslint: ^8.41.0 @@ -576,9 +576,9 @@ importers: '@jest/globals': ^29.5.0 '@types/dom-webcodecs': ^0.1.6 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/scrcpy': workspace:^0.0.19 - '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.19 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/scrcpy': workspace:^0.0.20 + '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.20 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 eslint: ^8.41.0 @@ -609,7 +609,7 @@ importers: '@jest/globals': ^29.5.0 '@yume-chan/async': ^2.2.0 '@yume-chan/eslint-config': workspace:^1.0.0 - '@yume-chan/struct': workspace:^0.0.19 + '@yume-chan/struct': workspace:^0.0.20 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 eslint: ^8.41.0 @@ -638,7 +638,7 @@ importers: ../../libraries/struct: specifiers: '@jest/globals': ^29.5.0 - '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.19 + '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.20 '@yume-chan/eslint-config': workspace:^1.0.0 '@yume-chan/tsconfig': workspace:^1.0.0 cross-env: ^7.0.3 @@ -677,9 +677,9 @@ importers: '@ng-bootstrap/ng-bootstrap': ^14.1.1 '@popperjs/core': ^2.11.6 '@types/js-yaml': ^4.0.5 - '@yume-chan/adb': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 '@yume-chan/async': ^2.2.0 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/stream-extra': workspace:^0.0.20 '@yume-chan/tabby-tango': workspace:^0.0.19 buffer: ^6.0.3 comlink: ^4.4.1 @@ -781,8 +781,8 @@ importers: '@popperjs/core': ^2.11.6 '@types/node': ^20.2.1 '@types/webpack-env': ^1.16.0 - '@yume-chan/adb': workspace:^0.0.19 - '@yume-chan/stream-extra': workspace:^0.0.19 + '@yume-chan/adb': workspace:^0.0.20 + '@yume-chan/stream-extra': workspace:^0.0.20 babel-loader: ^9.1.2 mobx: ^6.7.0 rxjs: ^7.8.1 diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 67340cb6..15b7b43c 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "a14edaaec87943bdc5bdf6114640f71dcf626d70", + "pnpmShrinkwrapHash": "813226994271f81ac4b322dded639b0b837e3830", "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" }