From 0a1afa988e7e141b3020b98ecb13074b0fc926b5 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Tue, 19 Aug 2025 11:33:00 -0400 Subject: [PATCH 1/6] update order of steps in nightly github action (#793) --- .github/workflows/nightly.yml | 15 +++++++-------- packages/web/package.json | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 94faaaca..11775f9d 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -17,10 +17,14 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout + - name: Checkout code uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest - # Node + pnpm (with built-in cache) - name: Setup Node.js uses: actions/setup-node@v4 with: @@ -28,12 +32,7 @@ jobs: cache: pnpm cache-dependency-path: '**/pnpm-lock.yaml' - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: latest - - - name: Install deps (root) + - name: Install dependencies (root) run: pnpm install --frozen-lockfile - name: Run tests diff --git a/packages/web/package.json b/packages/web/package.json index c29040e1..cdfc7e66 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "meshtastic-web", - "version": "2.7.0-0", + "version": "2.6.6-0", "type": "module", "description": "Meshtastic web client", "license": "GPL-3.0-only", From a10023fad6c5d1afb72238986f995b91a50113d6 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Tue, 19 Aug 2025 13:19:28 -0400 Subject: [PATCH 2/6] more github changes (#794) --- .github/workflows/pr.yml | 2 +- .github/workflows/release-web.yml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 5e1c27cb..495a1b18 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -36,7 +36,7 @@ jobs: cache: pnpm cache-dependency-path: '**/pnpm-lock.yaml' - - name: Install dependencies (root) + - name: Install dependencies run: pnpm install --frozen-lockfile - name: Run linter diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index e8f14687..1433bac4 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -62,7 +62,11 @@ jobs: echo "push_latest=$PUSH_LATEST" >> "$GITHUB_OUTPUT" echo "Resolved tag: $TAG (push_latest=$PUSH_LATEST)" - # --- Setup Node.js and pnpm (with cache) --- + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + - name: Setup Node.js uses: actions/setup-node@v4 with: @@ -70,13 +74,9 @@ jobs: cache: pnpm cache-dependency-path: '**/pnpm-lock.yaml' - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: latest - - - name: Install dependencies - run: pnpm install --frozen-lockfile + - name: Build web package + working-directory: packages/web + run: pnpm run build - name: Create Web App Release Archive working-directory: packages/web From 40c2bfa535c176d0919b0afac298e11c7a0f847a Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Tue, 19 Aug 2025 14:50:54 -0400 Subject: [PATCH 3/6] Add pnpm install to release step (#795) * more github changes * moar changes --- .github/workflows/release-web.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/release-web.yml b/.github/workflows/release-web.yml index 1433bac4..8edd528b 100644 --- a/.github/workflows/release-web.yml +++ b/.github/workflows/release-web.yml @@ -74,6 +74,13 @@ jobs: cache: pnpm cache-dependency-path: '**/pnpm-lock.yaml' + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build web package + working-directory: packages/web + run: pnpm run build + - name: Build web package working-directory: packages/web run: pnpm run build From 5b2c25d8ee435eaf0cba02c166f9b2219468b2e5 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Wed, 20 Aug 2025 10:01:17 -0500 Subject: [PATCH 4/6] Try-fix webserial disconnect not actually disconnecting (#796) * Try-fix webserial disconnects * Instantiate abort controller on new connection --- .../transport-web-serial/src/transport.ts | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/packages/transport-web-serial/src/transport.ts b/packages/transport-web-serial/src/transport.ts index 47d98586..1c1706dc 100644 --- a/packages/transport-web-serial/src/transport.ts +++ b/packages/transport-web-serial/src/transport.ts @@ -5,6 +5,8 @@ export class TransportWebSerial implements Types.Transport { private _toDevice: WritableStream; private _fromDevice: ReadableStream; private connection: SerialPort; + private pipePromise: Promise | null = null; + private abortController: AbortController; public static async create(baudRate?: number): Promise { const port = await navigator.serial.requestPort(); @@ -26,8 +28,13 @@ export class TransportWebSerial implements Types.Transport { } this.connection = connection; + this.abortController = new AbortController(); - Utils.toDeviceStream.readable.pipeTo(connection.writable); + // Set up the pipe with abort signal for clean cancellation + this.pipePromise = Utils.toDeviceStream.readable.pipeTo( + connection.writable, + { signal: this.abortController.signal } + ); this._toDevice = Utils.toDeviceStream.writable; this._fromDevice = connection.readable.pipeThrough( @@ -43,7 +50,54 @@ export class TransportWebSerial implements Types.Transport { return this._fromDevice; } - disconnect() { - return this.connection.close(); + /** + * Safely disconnects the serial port, following best practices from + * https://github.com/WICG/serial/. Cancels any active pipe + * operations and only closes the port after streams are unlocked. + */ + async disconnect() { + try { + this.abortController.abort(); + + if (this.pipePromise) { + try { + await this.pipePromise; + } catch (error) { + if (error instanceof Error && error.name !== 'AbortError') { + throw error; + } + } + } + + // Cancel any remaining streams + if (this._fromDevice && this._fromDevice.locked) { + try { + await this._fromDevice.cancel(); + } catch (error) { + // Stream cancellation might fail if already cancelled + } + } + + await this.connection.close(); + + } catch (error) { + // If we can't close cleanly, let the browser handle cleanup + console.warn('Could not cleanly disconnect serial port:', error); + } + } + + /** + * Reconnects the transport by creating a new AbortController and re-establishing + * the pipe connection. Only call this after disconnect() or if the connection failed. + */ + async reconnect() { + // Create a new AbortController for the new connection + this.abortController = new AbortController(); + + // Re-establish the pipe connection + this.pipePromise = Utils.toDeviceStream.readable.pipeTo( + this.connection.writable, + { signal: this.abortController.signal } + ); } } From 6eece7172a10880d6839e3d3e238946a4aff8808 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Wed, 20 Aug 2025 11:53:12 -0400 Subject: [PATCH 5/6] bumped web-serial version (#797) --- packages/transport-web-serial/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transport-web-serial/package.json b/packages/transport-web-serial/package.json index f615b8d0..efc9d230 100644 --- a/packages/transport-web-serial/package.json +++ b/packages/transport-web-serial/package.json @@ -1,6 +1,6 @@ { "name": "@meshtastic/transport-web-serial", - "version": "0.2.3-1", + "version": "0.2.4-0", "description": "A transport layer for Meshtastic applications using Web Serial API.", "exports": { ".": "./mod.ts" From fdd3e7f971622173f6e03eae95a2ba73357b1f78 Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Wed, 20 Aug 2025 12:19:26 -0400 Subject: [PATCH 6/6] re-order package steps (#798) --- .github/workflows/release-packages.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release-packages.yml b/.github/workflows/release-packages.yml index 63e59f21..2719d397 100644 --- a/.github/workflows/release-packages.yml +++ b/.github/workflows/release-packages.yml @@ -18,18 +18,20 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - # Node + pnpm (with cache) - - name: Setup Node + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 cache: pnpm cache-dependency-path: '**/pnpm-lock.yaml' - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: latest + - name: Install dependencies + run: pnpm install --frozen-lockfile - name: Configure npm auth env: @@ -38,9 +40,6 @@ jobs: pnpm config set //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN} pnpm config set registry https://registry.npmjs.org/ - - name: Install deps (root) - run: pnpm install - - name: Resolve package list id: pkgs shell: bash