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

Unverified Commit 70b0d3e5 authored by Simon Chan's avatar Simon Chan
Browse files

fix(struct): fix dynamic length buffer serialize size

parent c5b998fe
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -39,14 +39,6 @@ export class AdbDaemonWebUsbDeviceObserver
        this.#usbManager.addEventListener("disconnect", this.#handleDisconnect);
    }

    dispose(): void {
        this.#usbManager.removeEventListener("connect", this.#handleConnect);
        this.#usbManager.removeEventListener(
            "disconnect",
            this.#handleDisconnect,
        );
    }

    #handleConnect = (e: USBConnectionEvent) => {
        if (!matchesFilters(e.device, this.#filters)) {
            return;
+57 −45
Original line number Diff line number Diff line
@@ -85,51 +85,7 @@ function _buffer(
        };
    }

    if (typeof lengthOrField === "string") {
        if (converter) {
            return {
                size: 0,
                preSerialize: (value, runtimeStruct) => {
                    runtimeStruct[lengthOrField] = converter.back(value).length;
                },
                serialize: (value, { buffer, index }) => {
                    buffer.set(converter.back(value), index);
                },
                deserialize: bipedal(function* (
                    then,
                    { reader, runtimeStruct },
                ) {
                    const length = runtimeStruct[lengthOrField] as number;
                    if (length === 0) {
                        return converter.convert(EmptyUint8Array);
                    }

                    const value = yield* then(reader.readExactly(length));
                    return converter.convert(value);
                }),
            };
        }

        return {
            size: 0,
            preSerialize: (value, runtimeStruct) => {
                runtimeStruct[lengthOrField] = (value as Uint8Array).length;
            },
            serialize: (value, { buffer, index }) => {
                buffer.set(value as Uint8Array, index);
            },
            deserialize: ({ reader, runtimeStruct }) => {
                const length = runtimeStruct[lengthOrField] as number;
                if (length === 0) {
                    return EmptyUint8Array;
                }

                return reader.readExactly(length);
            },
        };
    }

    if ("serialize" in lengthOrField) {
    if (typeof lengthOrField === "object" && "serialize" in lengthOrField) {
        if (converter) {
            return {
                size: 0,
@@ -185,6 +141,56 @@ function _buffer(
        };
    }

    if (typeof lengthOrField === "string") {
        if (converter) {
            return {
                size: 0,
                preSerialize: (value, runtimeStruct) => {
                    runtimeStruct[lengthOrField] = converter.back(value).length;
                },
                dynamicSize: (value) => {
                    return converter.back(value).length;
                },
                serialize: (value, { buffer, index }) => {
                    buffer.set(converter.back(value), index);
                },
                deserialize: bipedal(function* (
                    then,
                    { reader, runtimeStruct },
                ) {
                    const length = runtimeStruct[lengthOrField] as number;
                    if (length === 0) {
                        return converter.convert(EmptyUint8Array);
                    }

                    const value = yield* then(reader.readExactly(length));
                    return converter.convert(value);
                }),
            };
        }

        return {
            size: 0,
            preSerialize: (value, runtimeStruct) => {
                runtimeStruct[lengthOrField] = (value as Uint8Array).length;
            },
            dynamicSize: (value) => {
                return (value as Uint8Array).length;
            },
            serialize: (value, { buffer, index }) => {
                buffer.set(value as Uint8Array, index);
            },
            deserialize: ({ reader, runtimeStruct }) => {
                const length = runtimeStruct[lengthOrField] as number;
                if (length === 0) {
                    return EmptyUint8Array;
                }

                return reader.readExactly(length);
            },
        };
    }

    if (converter) {
        return {
            size: 0,
@@ -192,6 +198,9 @@ function _buffer(
                const length = converter.back(value).length;
                runtimeStruct[lengthOrField.field] = lengthOrField.back(length);
            },
            dynamicSize: (value) => {
                return converter.back(value).length;
            },
            serialize: (value, { buffer, index }) => {
                buffer.set(converter.back(value), index);
            },
@@ -215,6 +224,9 @@ function _buffer(
                (value as Uint8Array).length,
            );
        },
        dynamicSize: (value) => {
            return (value as Uint8Array).length;
        },
        serialize: (value, { buffer, index }) => {
            buffer.set(value as Uint8Array, index);
        },