@iotile/iotile-cloud
Version:
A typescript library for interfacing with the IOTile Cloud API
254 lines • 10.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var models_1 = require("../models");
var model_delta_1 = require("../base/model-delta");
var cloud_utils_1 = require("./cloud-utils");
var iotile_common_1 = require("@iotile/iotile-common");
var merge = require('lodash.merge');
var ProjectOverlay = /** @class */ (function () {
function ProjectOverlay(deltas) {
if (deltas === void 0) { deltas = []; }
this.deltaMap = { stream: {}, device: {} };
this.deserializerMap = {};
for (var _i = 0, deltas_1 = deltas; _i < deltas_1.length; _i++) {
var delta = deltas_1[_i];
this.addDelta(delta);
}
this.loadDeserializers();
}
ProjectOverlay.prototype.isEmpty = function () {
var streamKeys = Object.keys(this.deltaMap.stream);
var deviceKeys = Object.keys(this.deltaMap.device);
return (streamKeys.length === 0 && deviceKeys.length === 0);
};
ProjectOverlay.prototype.toList = function () {
var deltas = [];
for (var slug in this.deltaMap.device) {
for (var id in this.deltaMap.device[slug]) {
deltas.push(this.deltaMap.device[slug][id]);
}
}
for (var slug in this.deltaMap.stream) {
for (var id in this.deltaMap.stream[slug]) {
deltas.push(this.deltaMap.stream[slug][id]);
}
}
return deltas;
};
ProjectOverlay.prototype.merge = function (overlay) {
this.addDeltas(overlay.toList());
};
ProjectOverlay.prototype.affectedStreamModels = function () {
return Object.keys(this.deltaMap.stream);
};
ProjectOverlay.prototype.affectedDeviceModels = function () {
return Object.keys(this.deltaMap.device);
};
ProjectOverlay.prototype.patchForDevice = function (device) {
if (!(device.slug in this.deltaMap.device)) {
return {};
}
var patch = {};
for (var deltaSlug in this.deltaMap.device[device.slug]) {
var delta = this.deltaMap.device[device.slug][deltaSlug];
if (delta.check(device) === model_delta_1.DeltaStatus.Conflicted) {
throw new cloud_utils_1.DataConflictError("The same setting has also been modified in the cloud, please resync before trying to update.", "Conflict in slug: " + delta.slug + " guid: " + delta.id);
}
merge(patch, delta.getPatch(device));
}
return patch;
};
ProjectOverlay.prototype.patchForStream = function (stream) {
if (stream.slug) {
if (!(stream.slug in this.deltaMap.stream)) {
return {};
}
var patch = {};
for (var deltaSlug in this.deltaMap.stream[stream.slug]) {
var delta = this.deltaMap.stream[stream.slug][deltaSlug];
if (delta.check(stream) === model_delta_1.DeltaStatus.Conflicted) {
throw new cloud_utils_1.DataConflictError("The same setting has also been modified in the cloud, please resync before trying to update.", "Conflict in slug: " + delta.slug + " guid: " + delta.id);
}
merge(patch, delta.getPatch(stream));
}
return patch;
}
else {
throw new iotile_common_1.UnknownKeyError("Cannot patch stream with unknown slug");
}
};
/*
* Return true if a device is directly modified or if one of its streams is modified
*/
ProjectOverlay.prototype.deviceModified = function (deviceSlug) {
if (deviceSlug in this.deltaMap.device) {
return true;
}
for (var streamSlug in this.deltaMap.stream) {
var delta = this.deltaMap.stream[streamSlug];
if (cloud_utils_1.streamInDevice(streamSlug, deviceSlug)) {
return true;
}
}
return false;
};
ProjectOverlay.prototype.deviceHasDelta = function (deviceSlug, deltaName) {
if (!(deviceSlug in this.deltaMap.device)) {
return false;
}
return deltaName in this.deltaMap.device[deviceSlug];
};
ProjectOverlay.prototype.variableModified = function (variableLid) {
for (var slug in this.deltaMap.stream) {
if (iotile_common_1.endsWith(slug, variableLid)) {
return true;
}
}
return false;
};
ProjectOverlay.prototype.loadDeserializers = function () {
this.deserializerMap = {};
//Stream Deserializers
this.deserializerMap[models_1.StreamOutputUnitsDelta.ClassName] = models_1.StreamOutputUnitsDelta.Deserialize;
this.deserializerMap[models_1.StreamInputUnitsDelta.ClassName] = models_1.StreamInputUnitsDelta.Deserialize;
this.deserializerMap[models_1.StreamLabelDelta.ClassName] = models_1.StreamLabelDelta.Deserialize;
this.deserializerMap[models_1.StreamMDODelta.ClassName] = models_1.StreamMDODelta.Deserialize;
//Device Deserializers
this.deserializerMap[models_1.DeviceLabelDelta.ClassName] = models_1.DeviceLabelDelta.Deserialize;
this.deserializerMap[models_1.DeviceLocationDelta.ClassName] = models_1.DeviceLocationDelta.Deserialize;
this.deserializerMap[models_1.DeviceDrifterDelta.ClassName] = models_1.DeviceDrifterDelta.Deserialize;
};
ProjectOverlay.prototype.prune = function (project) {
for (var slug in this.deltaMap.stream) {
var deltas = this.deltaMap.stream[slug];
var stream = project.getStream(slug, true);
//If the stream doesn't exist, all deltas are obsolete
if (stream == null) {
delete this.deltaMap.stream[slug];
continue;
}
for (var guid in deltas) {
var delta = deltas[guid];
if (delta.check(stream) !== model_delta_1.DeltaStatus.Applies) {
delete deltas[guid];
}
}
//If we have removed all of the stream deltas, also remove the stream
if (Object.keys(deltas).length == 0) {
delete this.deltaMap.stream[slug];
}
}
for (var slug in this.deltaMap.device) {
var deltas = this.deltaMap.device[slug];
var device = project.getDevice(slug, true);
//If the device doesn't exist, all deltas are obsolete
if (device == null) {
delete this.deltaMap.device[slug];
continue;
}
for (var guid in deltas) {
var delta = deltas[guid];
if (delta.check(device) !== model_delta_1.DeltaStatus.Applies) {
delete deltas[guid];
}
}
//If we have removed all of the device deltas, also remove the device
if (Object.keys(deltas).length == 0) {
delete this.deltaMap.device[slug];
}
}
};
ProjectOverlay.prototype.applyDevice = function (device, markModified) {
var deltas = this.deltaMap.device[device.slug];
if (deltas == null) {
return;
}
for (var guid in deltas) {
var delta = deltas[guid];
if (delta.check(device) === model_delta_1.DeltaStatus.Applies) {
delta.apply(device);
if (markModified) {
device.isModified = true;
}
}
}
};
ProjectOverlay.prototype.applyStream = function (stream, markModified) {
if (stream.slug) {
var deltas = this.deltaMap.stream[stream.slug];
if (deltas == null) {
return;
}
for (var guid in deltas) {
var delta = deltas[guid];
if (delta.check(stream) === model_delta_1.DeltaStatus.Applies) {
delta.apply(stream);
if (markModified) {
stream.isModified = true;
}
}
}
}
};
ProjectOverlay.prototype.addDelta = function (delta) {
var subMap = this.deltaMap.device;
var slug = delta.slug;
if (delta instanceof models_1.StreamDelta) {
subMap = this.deltaMap.stream;
}
if (!(slug in subMap)) {
subMap[slug] = {};
}
subMap[slug][delta.classname] = delta;
};
ProjectOverlay.prototype.addDeltas = function (deltas) {
for (var _i = 0, deltas_2 = deltas; _i < deltas_2.length; _i++) {
var delta = deltas_2[_i];
this.addDelta(delta);
}
};
ProjectOverlay.prototype.serialize = function () {
var obj = {};
for (var slug in this.deltaMap.stream) {
var streamDeltas = this.deltaMap.stream[slug];
obj[slug] = {};
for (var id in streamDeltas) {
obj[slug][id] = streamDeltas[id].serialize();
}
}
for (var slug in this.deltaMap.device) {
var deviceDeltas = this.deltaMap.device[slug];
obj[slug] = {};
for (var id in deviceDeltas) {
obj[slug][id] = deviceDeltas[id].serialize();
}
}
return obj;
};
ProjectOverlay.prototype.deserialize = function (obj, log) {
for (var slug in obj) {
var deltas = obj[slug];
for (var className in deltas) {
var serializedDelta = deltas[className];
var guid = serializedDelta.guid;
var slug_1 = serializedDelta.slug;
if (!(className in this.deserializerMap)) {
if (log) {
log.warn("[ProjectOverlay] Skipping unknown delta type in overlay, type: " + className + ' slug: ' + slug_1);
}
continue;
}
var delta = this.deserializerMap[className](guid, slug_1, serializedDelta.args);
this.addDelta(delta);
}
}
};
ProjectOverlay.Deserialize = function (obj, log) {
var overlay = new ProjectOverlay();
overlay.deserialize(obj, log);
return overlay;
};
return ProjectOverlay;
}());
exports.ProjectOverlay = ProjectOverlay;
//# sourceMappingURL=project-overlay.js.map