Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit d50a170a authored by Simon Chan's avatar Simon Chan
Browse files

feat(struct): new API full rewrite

parent a2926842
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ import {
    pipeFrom,
} from "@yume-chan/stream-extra";
import type { ExactReadable } from "@yume-chan/struct";
import { EMPTY_UINT8_ARRAY } from "@yume-chan/struct";
import { EmptyUint8Array } from "@yume-chan/struct";

import type { UsbInterfaceFilter } from "./utils.js";
import {
@@ -185,7 +185,7 @@ export class AdbDaemonWebUsbConnection
                            if (zeroMask && (chunk.length & zeroMask) === 0) {
                                await device.raw.transferOut(
                                    outEndpoint.endpointNumber,
                                    EMPTY_UINT8_ARRAY,
                                    EmptyUint8Array,
                                );
                            }
                        } catch (e) {
@@ -234,7 +234,7 @@ export class AdbDaemonWebUsbConnection
                    );
                    packet.payload = new Uint8Array(result.data!.buffer);
                } else {
                    packet.payload = EMPTY_UINT8_ARRAY;
                    packet.payload = EmptyUint8Array;
                }

                return packet;
+3 −3
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ import {
    BufferedReadableStream,
    PushReadableStream,
} from "@yume-chan/stream-extra";
import type { ValueOrPromise } from "@yume-chan/struct";
import type { MaybePromiseLike } from "@yume-chan/struct";

export interface AdbScrcpyConnectionOptions {
    scid: number;
@@ -54,7 +54,7 @@ export abstract class AdbScrcpyConnection implements Disposable {
        this.socketName = this.getSocketName();
    }

    initialize(): ValueOrPromise<void> {
    initialize(): MaybePromiseLike<void> {
        // pure virtual method
    }

@@ -66,7 +66,7 @@ export abstract class AdbScrcpyConnection implements Disposable {
        return socketName;
    }

    abstract getStreams(): ValueOrPromise<AdbScrcpyConnectionStreams>;
    abstract getStreams(): MaybePromiseLike<AdbScrcpyConnectionStreams>;

    dispose(): void {
        // pure virtual method
+3 −3
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ import {
    PushReadableStream,
    tryClose,
} from "@yume-chan/stream-extra";
import type { ValueOrPromise } from "@yume-chan/struct";
import type { MaybePromiseLike } from "@yume-chan/struct";

function nodeSocketToConnection(
    socket: Socket,
@@ -138,7 +138,7 @@ export class AdbServerNodeTcpConnector
        return address;
    }

    removeReverseTunnel(address: string): ValueOrPromise<void> {
    removeReverseTunnel(address: string): MaybePromiseLike<void> {
        const server = this.#listeners.get(address);
        if (!server) {
            return;
@@ -147,7 +147,7 @@ export class AdbServerNodeTcpConnector
        this.#listeners.delete(address);
    }

    clearReverseTunnels(): ValueOrPromise<void> {
    clearReverseTunnels(): MaybePromiseLike<void> {
        for (const server of this.#listeners.values()) {
            server.close();
        }
+7 −7
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@ import type {
    ReadableWritablePair,
} from "@yume-chan/stream-extra";
import { ConcatStringStream, TextDecoderStream } from "@yume-chan/stream-extra";
import type { ValueOrPromise } from "@yume-chan/struct";
import type { MaybePromiseLike } from "@yume-chan/struct";

import type { AdbBanner } from "./banner.js";
import type { AdbFrameBuffer } from "./commands/index.js";
@@ -19,7 +19,7 @@ import {
import type { AdbFeature } from "./features.js";

export interface Closeable {
    close(): ValueOrPromise<void>;
    close(): MaybePromiseLike<void>;
}

/**
@@ -37,7 +37,7 @@ export interface AdbSocket

export type AdbIncomingSocketHandler = (
    socket: AdbSocket,
) => ValueOrPromise<void>;
) => MaybePromiseLike<void>;

export interface AdbTransport extends Closeable {
    readonly serial: string;
@@ -50,16 +50,16 @@ export interface AdbTransport extends Closeable {

    readonly clientFeatures: readonly AdbFeature[];

    connect(service: string): ValueOrPromise<AdbSocket>;
    connect(service: string): MaybePromiseLike<AdbSocket>;

    addReverseTunnel(
        handler: AdbIncomingSocketHandler,
        address?: string,
    ): ValueOrPromise<string>;
    ): MaybePromiseLike<string>;

    removeReverseTunnel(address: string): ValueOrPromise<void>;
    removeReverseTunnel(address: string): MaybePromiseLike<void>;

    clearReverseTunnels(): ValueOrPromise<void>;
    clearReverseTunnels(): MaybePromiseLike<void>;
}

export class Adb implements Closeable {
+44 −41
Original line number Diff line number Diff line
import { BufferedReadableStream } from "@yume-chan/stream-extra";
import Struct, { StructEmptyError } from "@yume-chan/struct";
import type { StructValue } from "@yume-chan/struct";
import { buffer, Struct, StructEmptyError, u32 } from "@yume-chan/struct";

import type { Adb } from "../adb.js";

const Version =
    /* #__PURE__ */
    new Struct({ littleEndian: true }).uint32("version");
const Version = new Struct({ version: u32 }, { littleEndian: true });

export const AdbFrameBufferV1 =
    /* #__PURE__ */
    new Struct({ littleEndian: true })
        .uint32("bpp")
        .uint32("size")
        .uint32("width")
        .uint32("height")
        .uint32("red_offset")
        .uint32("red_length")
        .uint32("blue_offset")
        .uint32("blue_length")
        .uint32("green_offset")
        .uint32("green_length")
        .uint32("alpha_offset")
        .uint32("alpha_length")
        .uint8Array("data", { lengthField: "size" });
export const AdbFrameBufferV1 = new Struct(
    {
        bpp: u32,
        size: u32,
        width: u32,
        height: u32,
        red_offset: u32,
        red_length: u32,
        blue_offset: u32,
        blue_length: u32,
        green_offset: u32,
        green_length: u32,
        alpha_offset: u32,
        alpha_length: u32,
        data: buffer("size"),
    },
    { littleEndian: true },
);

export type AdbFrameBufferV1 = (typeof AdbFrameBufferV1)["TDeserializeResult"];
export type AdbFrameBufferV1 = StructValue<typeof AdbFrameBufferV1>;

export const AdbFrameBufferV2 =
    /* #__PURE__ */
    new Struct({ littleEndian: true })
        .uint32("bpp")
        .uint32("colorSpace")
        .uint32("size")
        .uint32("width")
        .uint32("height")
        .uint32("red_offset")
        .uint32("red_length")
        .uint32("blue_offset")
        .uint32("blue_length")
        .uint32("green_offset")
        .uint32("green_length")
        .uint32("alpha_offset")
        .uint32("alpha_length")
        .uint8Array("data", { lengthField: "size" });
export const AdbFrameBufferV2 = new Struct(
    {
        bpp: u32,
        colorSpace: u32,
        size: u32,
        width: u32,
        height: u32,
        red_offset: u32,
        red_length: u32,
        blue_offset: u32,
        blue_length: u32,
        green_offset: u32,
        green_length: u32,
        alpha_offset: u32,
        alpha_length: u32,
        data: buffer("size"),
    },
    { littleEndian: true },
);

export type AdbFrameBufferV2 = (typeof AdbFrameBufferV2)["TDeserializeResult"];
export type AdbFrameBufferV2 = StructValue<typeof AdbFrameBufferV2>;

/**
 * ADB uses 8 int32 fields to describe bit depths
@@ -99,9 +102,9 @@ export async function framebuffer(adb: Adb): Promise<AdbFrameBuffer> {
    switch (version) {
        case 1:
            // TODO: AdbFrameBuffer: does all v1 responses uses the same color space? Add it so the command returns same format for all versions.
            return AdbFrameBufferV1.deserialize(stream);
            return await AdbFrameBufferV1.deserialize(stream);
        case 2:
            return AdbFrameBufferV2.deserialize(stream);
            return await AdbFrameBufferV2.deserialize(stream);
        default:
            throw new AdbFrameBufferUnsupportedVersionError(version);
    }
Loading