UNPKG

@iotile/iotile-cloud

Version:

A typescript library for interfacing with the IOTile Cloud API

254 lines 10.5 kB
"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