"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GetServiceInterfaces = void 0;
exports.getOwnServiceInterfaces = getOwnServiceInterfaces;
exports.getServiceInterfaces = getServiceInterfaces;
const deepEqual_1 = require("./deepEqual");
const getServiceInterface_1 = require("./getServiceInterface");
const Watchable_1 = require("./Watchable");
const makeManyInterfaceFilled = async ({ effects, packageId, callback, }) => {
    const serviceInterfaceValues = await effects.listServiceInterfaces({
        packageId,
        callback,
    });
    const serviceInterfacesFilled = await Promise.all(Object.values(serviceInterfaceValues).map(async (serviceInterfaceValue) => {
        const hostId = serviceInterfaceValue.addressInfo.hostId;
        const host = await effects.getHostInfo({
            packageId,
            hostId,
            callback,
        });
        if (!host) {
            throw new Error(`host ${hostId} not found!`);
        }
        return {
            ...serviceInterfaceValue,
            host,
            addressInfo: (0, getServiceInterface_1.filledAddress)(host, serviceInterfaceValue.addressInfo),
        };
    }));
    return serviceInterfacesFilled;
};
class GetServiceInterfaces extends Watchable_1.Watchable {
    constructor(effects, opts, options) {
        super(effects, options);
        this.opts = opts;
        this.label = 'GetServiceInterfaces';
    }
    fetch(callback) {
        return makeManyInterfaceFilled({
            effects: this.effects,
            packageId: this.opts.packageId,
            callback,
        });
    }
}
exports.GetServiceInterfaces = GetServiceInterfaces;
function getOwnServiceInterfaces(effects, map, eq) {
    return new GetServiceInterfaces(effects, {}, {
        map: map ?? ((a) => a),
        eq: eq ?? ((a, b) => (0, deepEqual_1.deepEqual)(a, b)),
    });
}
function getServiceInterfaces(effects, opts, map, eq) {
    return new GetServiceInterfaces(effects, opts, {
        map: map ?? ((a) => a),
        eq: eq ?? ((a, b) => (0, deepEqual_1.deepEqual)(a, b)),
    });
}
//# sourceMappingURL=getServiceInterfaces.js.map