Execute oxfmt (#1166)
Ran pnpm oxfmt . This should get the web repo aligned so that we can better enforce oxfmt going forward.
This commit is contained in:
@@ -2,43 +2,20 @@
|
||||
"name": "@meshtastic/transport-web-serial",
|
||||
"version": "1.0.0",
|
||||
"description": "A transport layer for Meshtastic applications using Web Serial API.",
|
||||
"exports": {
|
||||
".": "./mod.ts"
|
||||
},
|
||||
"type": "module",
|
||||
"main": "./dist/mod.js",
|
||||
"module": "./dist/mod.js",
|
||||
"types": "./dist/mod.d.ts",
|
||||
"license": "GPL-3.0-only",
|
||||
"files": [
|
||||
"package.json",
|
||||
"README.md",
|
||||
"LICENSE",
|
||||
"dist"
|
||||
],
|
||||
"license": "GPL-3.0-only",
|
||||
"tsdown": {
|
||||
"entry": "mod.ts",
|
||||
"target": "esnext",
|
||||
"dts": true,
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"splitting": false,
|
||||
"sourcemap": false,
|
||||
"minify": false,
|
||||
"treeshake": true,
|
||||
"report": false,
|
||||
"clean": true
|
||||
"type": "module",
|
||||
"main": "./dist/mod.js",
|
||||
"module": "./dist/mod.js",
|
||||
"types": "./dist/mod.d.ts",
|
||||
"exports": {
|
||||
".": "./mod.ts"
|
||||
},
|
||||
"jsrInclude": [
|
||||
"mod.ts",
|
||||
"src",
|
||||
"README.md",
|
||||
"LICENSE"
|
||||
],
|
||||
"jsrExclude": [
|
||||
"src/**/*.test.ts"
|
||||
],
|
||||
"scripts": {
|
||||
"preinstall": "npx only-allow pnpm",
|
||||
"prepack": "cp ../../LICENSE ./LICENSE",
|
||||
@@ -49,8 +26,31 @@
|
||||
"publish:jsr": "pnpm run prepack && pnpm prepare:jsr && deno publish --allow-dirty --no-check"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/w3c-web-serial": "npm:@types/w3c-web-serial@^1.0.7",
|
||||
"@meshtastic/sdk": "workspace:*",
|
||||
"@types/w3c-web-serial": "npm:@types/w3c-web-serial@^1.0.7",
|
||||
"better-result": "^2.9.2"
|
||||
}
|
||||
},
|
||||
"tsdown": {
|
||||
"clean": true,
|
||||
"dts": true,
|
||||
"entry": "mod.ts",
|
||||
"format": [
|
||||
"esm"
|
||||
],
|
||||
"minify": false,
|
||||
"report": false,
|
||||
"sourcemap": false,
|
||||
"splitting": false,
|
||||
"target": "esnext",
|
||||
"treeshake": true
|
||||
},
|
||||
"jsrExclude": [
|
||||
"src/**/*.test.ts"
|
||||
],
|
||||
"jsrInclude": [
|
||||
"mod.ts",
|
||||
"src",
|
||||
"README.md",
|
||||
"LICENSE"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
import * as MeshSDK from "@meshtastic/sdk";
|
||||
import { DeviceStatusEnum, type DeviceOutput, toDeviceStream } from "@meshtastic/sdk";
|
||||
import {
|
||||
DeviceStatusEnum,
|
||||
type DeviceOutput,
|
||||
toDeviceStream,
|
||||
} from "@meshtastic/sdk";
|
||||
import { Result } from "better-result";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { runTransportContract } from "../../../tests/utils/transportContract.ts";
|
||||
@@ -31,7 +35,11 @@ function stubCoreTransforms() {
|
||||
const restoreFrom = vi
|
||||
.spyOn(sdk, "fromDeviceStream")
|
||||
.mockImplementation(
|
||||
() => fromDeviceFactory() as unknown as TransformStream<Uint8Array, DeviceOutput>,
|
||||
() =>
|
||||
fromDeviceFactory() as unknown as TransformStream<
|
||||
Uint8Array,
|
||||
DeviceOutput
|
||||
>,
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -47,12 +55,18 @@ function stubNavigatorSerial() {
|
||||
const handlers = new Set<SerialDisconnectHandler>();
|
||||
|
||||
const serialStub = {
|
||||
addEventListener: (type: string, handler: EventListenerOrEventListenerObject) => {
|
||||
addEventListener: (
|
||||
type: string,
|
||||
handler: EventListenerOrEventListenerObject,
|
||||
) => {
|
||||
if (type === "disconnect") {
|
||||
handlers.add(handler as any as SerialDisconnectHandler);
|
||||
}
|
||||
},
|
||||
removeEventListener: (type: string, handler: EventListenerOrEventListenerObject) => {
|
||||
removeEventListener: (
|
||||
type: string,
|
||||
handler: EventListenerOrEventListenerObject,
|
||||
) => {
|
||||
if (type === "disconnect") {
|
||||
handlers.delete(handler as any as SerialDisconnectHandler);
|
||||
}
|
||||
@@ -188,7 +202,9 @@ describe("TransportWebSerial (contract)", () => {
|
||||
expect((globalThis as any).__ws.fake.lastWritten).toEqual(bytes);
|
||||
},
|
||||
triggerDisconnect: async () => {
|
||||
(globalThis as any).__ws.serial.dispatchDisconnect((globalThis as any).__ws.fake);
|
||||
(globalThis as any).__ws.serial.dispatchDisconnect(
|
||||
(globalThis as any).__ws.fake,
|
||||
);
|
||||
await Promise.resolve();
|
||||
},
|
||||
});
|
||||
@@ -235,7 +251,10 @@ describe("TransportWebSerial (extras)", () => {
|
||||
let saw = false;
|
||||
for (let i = 0; i < 6; i++) {
|
||||
const { value } = await reader.read();
|
||||
if (value?.type === "status" && value.data.reason === "serial-disconnected") {
|
||||
if (
|
||||
value?.type === "status" &&
|
||||
value.data.reason === "serial-disconnected"
|
||||
) {
|
||||
saw = true;
|
||||
break;
|
||||
}
|
||||
@@ -282,7 +301,9 @@ describe("TransportWebSerial.createFromPort port hygiene", () => {
|
||||
vi.spyOn(fake, "open").mockImplementation(async () => {
|
||||
attempts += 1;
|
||||
if (attempts < 3) {
|
||||
const err = new Error("Failed to open serial port") as Error & { name: string };
|
||||
const err = new Error("Failed to open serial port") as Error & {
|
||||
name: string;
|
||||
};
|
||||
err.name = "InvalidStateError";
|
||||
throw err;
|
||||
}
|
||||
@@ -299,7 +320,9 @@ describe("TransportWebSerial.createFromPort port hygiene", () => {
|
||||
const fake = new FakeSerialPort();
|
||||
await fake.close();
|
||||
vi.spyOn(fake, "open").mockImplementation(async () => {
|
||||
const err = new Error("Failed to open serial port") as Error & { name: string };
|
||||
const err = new Error("Failed to open serial port") as Error & {
|
||||
name: string;
|
||||
};
|
||||
err.name = "InvalidStateError";
|
||||
throw err;
|
||||
});
|
||||
|
||||
@@ -39,7 +39,9 @@ const POST_CLOSE_DELAY_MS = 200;
|
||||
function isPortBusyError(err: unknown): boolean {
|
||||
if (!(err instanceof Error)) return false;
|
||||
if ((err as DOMException).name === "InvalidStateError") return true;
|
||||
return /already open|failed to open serial port|access is denied/i.test(err.message);
|
||||
return /already open|failed to open serial port|access is denied/i.test(
|
||||
err.message,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,7 +76,9 @@ export class TransportWebSerial implements Transport {
|
||||
port = await navigator.serial.requestPort();
|
||||
} catch (cause) {
|
||||
return Result.err(
|
||||
new SerialConnectError("unavailable", "Serial port not selected.", { cause }),
|
||||
new SerialConnectError("unavailable", "Serial port not selected.", {
|
||||
cause,
|
||||
}),
|
||||
);
|
||||
}
|
||||
return TransportWebSerial.createFromPort(port, baudRate);
|
||||
@@ -130,7 +134,10 @@ export class TransportWebSerial implements Transport {
|
||||
log.debug("preparePort: close() ok");
|
||||
} catch (cause) {
|
||||
const err = cause as Error;
|
||||
log.warn("preparePort: close() threw", { name: err?.name, message: err?.message });
|
||||
log.warn("preparePort: close() threw", {
|
||||
name: err?.name,
|
||||
message: err?.message,
|
||||
});
|
||||
return Result.err(
|
||||
new SerialConnectError(
|
||||
"in-use",
|
||||
@@ -143,7 +150,11 @@ export class TransportWebSerial implements Transport {
|
||||
}
|
||||
|
||||
let lastErr: unknown;
|
||||
for (let attempt = 0; attempt <= PORT_OPEN_RETRY_DELAYS_MS.length; attempt++) {
|
||||
for (
|
||||
let attempt = 0;
|
||||
attempt <= PORT_OPEN_RETRY_DELAYS_MS.length;
|
||||
attempt++
|
||||
) {
|
||||
try {
|
||||
log.debug("preparePort: open() attempt", { attempt });
|
||||
await port.open({ baudRate });
|
||||
@@ -156,10 +167,17 @@ export class TransportWebSerial implements Transport {
|
||||
attempt,
|
||||
name: e?.name,
|
||||
message: e?.message,
|
||||
willRetry: isPortBusyError(err) && attempt < PORT_OPEN_RETRY_DELAYS_MS.length,
|
||||
willRetry:
|
||||
isPortBusyError(err) && attempt < PORT_OPEN_RETRY_DELAYS_MS.length,
|
||||
});
|
||||
if (!isPortBusyError(err) || attempt === PORT_OPEN_RETRY_DELAYS_MS.length) break;
|
||||
await new Promise((r) => setTimeout(r, PORT_OPEN_RETRY_DELAYS_MS[attempt]));
|
||||
if (
|
||||
!isPortBusyError(err) ||
|
||||
attempt === PORT_OPEN_RETRY_DELAYS_MS.length
|
||||
)
|
||||
break;
|
||||
await new Promise((r) =>
|
||||
setTimeout(r, PORT_OPEN_RETRY_DELAYS_MS[attempt]),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,7 +229,10 @@ export class TransportWebSerial implements Transport {
|
||||
return;
|
||||
}
|
||||
const e = err as Error;
|
||||
log.error("toDevice pipe rejected", { name: e?.name, message: e?.message });
|
||||
log.error("toDevice pipe rejected", {
|
||||
name: e?.name,
|
||||
message: e?.message,
|
||||
});
|
||||
this.connection.close().catch(() => {});
|
||||
this.emitStatus(DeviceStatusEnum.DeviceDisconnected, "write-error");
|
||||
});
|
||||
@@ -232,7 +253,10 @@ export class TransportWebSerial implements Transport {
|
||||
const { port } = ev as unknown as { port?: SerialPort };
|
||||
if (port && port === this.connection) {
|
||||
log.warn("OS-level disconnect event");
|
||||
this.emitStatus(DeviceStatusEnum.DeviceDisconnected, "serial-disconnected");
|
||||
this.emitStatus(
|
||||
DeviceStatusEnum.DeviceDisconnected,
|
||||
"serial-disconnected",
|
||||
);
|
||||
}
|
||||
};
|
||||
navigator.serial.addEventListener("disconnect", onOsDisconnect);
|
||||
@@ -328,7 +352,10 @@ export class TransportWebSerial implements Transport {
|
||||
log.debug("disconnect: connection.close() ok");
|
||||
} catch (error) {
|
||||
const e = error as Error;
|
||||
log.warn("disconnect: cleanup failed", { name: e?.name, message: e?.message });
|
||||
log.warn("disconnect: cleanup failed", {
|
||||
name: e?.name,
|
||||
message: e?.message,
|
||||
});
|
||||
} finally {
|
||||
this.emitStatus(DeviceStatusEnum.DeviceDisconnected, "user");
|
||||
this.closingByUser = false;
|
||||
|
||||
Reference in New Issue
Block a user