🏡 index : quine-global/quine-anaconda-webui.git

/*
 * Copyright (C) 2022 Red Hat, Inc.
 * SPDX-License-Identifier: LGPL-2.1-or-later
 */
import cockpit from "cockpit";

import { setPayloadTypeAction } from "../actions/payload.js";

import { error } from "../helpers/log.js";
import { _callClient, _getProperty } from "./helpers.js";

import { PayloadDNFClient } from "./payload_dnf.js";

const OBJECT_PATH = "/org/fedoraproject/Anaconda/Modules/Payloads";
const INTERFACE_NAME = "org.fedoraproject.Anaconda.Modules.Payloads";

const PAYLOAD_BASE_INTERFACE = INTERFACE_NAME + ".Payload";

const callClient = (...args) => {
    return _callClient(PayloadsClient, OBJECT_PATH, INTERFACE_NAME, ...args);
};

const getProperty = (...args) => {
    return _getProperty(PayloadsClient, OBJECT_PATH, INTERFACE_NAME, ...args);
};

export class PayloadsClient {
    constructor (address, dispatch) {
        if (PayloadsClient.instance && (!address || PayloadsClient.instance.address === address)) {
            return PayloadsClient.instance;
        }

        PayloadsClient.instance?.client.close();

        PayloadsClient.instance = this;

        this.client = cockpit.dbus(
            INTERFACE_NAME,
            { address, bus: "none", superuser: "try" }
        );
        this.address = address;
        this.dispatch = dispatch;
    }

    init (args = {}) {
        this.client.addEventListener(
            "close", () => error("Payloads client closed")
        );

        this.initData(args);
    }

    stopEventMonitor () {
        PayloadDNFClient.instance?.stopEventMonitor();
    }

    async initData (args = {}) {
        const activePayload = await getActivePayload();

        const payloadType = await getPayloadType(activePayload);
        this.dispatch(setPayloadTypeAction(payloadType));

        // Check payload type and initialize DNF client if needed
        await this.initPayloadClient(activePayload, args);
    }

    async initPayloadClient (payload, args = {}) {
        // Initialize DNF client if payload type is DNF
        const payloadType = await getPayloadType(payload);
        if (payloadType === "DNF") {
            const dnfClient = new PayloadDNFClient(this.client, this.dispatch, payload);
            await dnfClient.init(args);
        }
    }
}

export const getPayloadType = async (payload) => {
    return _getProperty(
        PayloadsClient,
        payload,
        PAYLOAD_BASE_INTERFACE,
        "Type"
    );
};

/**
 *
 * @returns {Promise}           Resolves the total space required by the payload
 */
export const getRequiredSpace = () => {
    return callClient("CalculateRequiredSpace", []);
};

export const getActivePayload = () => {
    return getProperty("ActivePayload");
};