balena-sdk
Version:
The Balena JavaScript SDK
82 lines (81 loc) • 3.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCurrentServiceDetails = exports.getCurrentServiceDetailsPineExpand = void 0;
// Pine expand options necessary for getting raw service data for a device
exports.getCurrentServiceDetailsPineExpand = {
image_install: {
$select: ['id', 'download_progress', 'status', 'install_date'],
$filter: {
status: {
$ne: 'deleted',
},
},
$expand: {
installs__image: {
$select: ['id'],
$expand: {
is_a_build_of__service: {
$select: ['id', 'service_name'],
},
},
},
is_provided_by__release: {
$select: ['id', 'commit', 'raw_version'],
},
},
},
};
function getSingleInstallSummary(rawData) {
const image = rawData.installs__image[0];
const service = image.is_a_build_of__service[0];
const release = rawData.is_provided_by__release[0];
const releaseInfo = {
commit: release === null || release === void 0 ? void 0 : release.commit,
raw_version: release === null || release === void 0 ? void 0 : release.raw_version,
release_id: release === null || release === void 0 ? void 0 : release.id,
};
const result = Object.assign(Object.assign(Object.assign({}, rawData), { service_id: service.id,
// add this extra property to make grouping the services easier
service_name: service.service_name, image_id: image.id }), releaseInfo);
if ('installs__image' in result) {
delete result.installs__image;
}
if ('is_provided_by__release' in result) {
delete result.is_provided_by__release;
}
return result;
}
const generateCurrentServiceDetails = (rawDevice) => {
const installs = rawDevice.image_install.map(getSingleInstallSummary);
// Essentially a groupBy(installs, 'service_name')
// but try making it a bit faster for the sake of large fleets.
// Uses Object.create(null) so that there are no inherited properties
// which could match service names
const currentServicesGroupedByName = Object.create(null);
for (const containerWithServiceName of installs) {
const { service_name } = containerWithServiceName;
let serviceContainerGroup;
if (currentServicesGroupedByName[service_name] == null) {
serviceContainerGroup = [];
currentServicesGroupedByName[service_name] = serviceContainerGroup;
}
else {
serviceContainerGroup = currentServicesGroupedByName[service_name];
}
const container = containerWithServiceName;
// remove the extra property that we added for the grouping
delete container.service_name;
serviceContainerGroup.push(container);
}
for (const serviceName in currentServicesGroupedByName) {
if (currentServicesGroupedByName[serviceName]) {
currentServicesGroupedByName[serviceName].sort((a, b) => {
return b.install_date.localeCompare(a.install_date);
});
}
}
const device = rawDevice;
device.current_services = currentServicesGroupedByName;
return device;
};
exports.generateCurrentServiceDetails = generateCurrentServiceDetails;