@softchef/cdk-iot-device-management
Version:
IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.
213 lines (212 loc) • 9.19 kB
JavaScript
import { __assign, __read, __spreadArray, __values } from "tslib";
export var constructStack = function () {
var absoluteEntries = [];
var relativeEntries = [];
var entriesNameSet = new Set();
var sort = function (entries) {
return entries.sort(function (a, b) {
return stepWeights[b.step] - stepWeights[a.step] ||
priorityWeights[b.priority || "normal"] - priorityWeights[a.priority || "normal"];
});
};
var removeByName = function (toRemove) {
var isRemoved = false;
var filterCb = function (entry) {
if (entry.name && entry.name === toRemove) {
isRemoved = true;
entriesNameSet.delete(toRemove);
return false;
}
return true;
};
absoluteEntries = absoluteEntries.filter(filterCb);
relativeEntries = relativeEntries.filter(filterCb);
return isRemoved;
};
var removeByReference = function (toRemove) {
var isRemoved = false;
var filterCb = function (entry) {
if (entry.middleware === toRemove) {
isRemoved = true;
if (entry.name)
entriesNameSet.delete(entry.name);
return false;
}
return true;
};
absoluteEntries = absoluteEntries.filter(filterCb);
relativeEntries = relativeEntries.filter(filterCb);
return isRemoved;
};
var cloneTo = function (toStack) {
absoluteEntries.forEach(function (entry) {
toStack.add(entry.middleware, __assign({}, entry));
});
relativeEntries.forEach(function (entry) {
toStack.addRelativeTo(entry.middleware, __assign({}, entry));
});
return toStack;
};
var expandRelativeMiddlewareList = function (from) {
var expandedMiddlewareList = [];
from.before.forEach(function (entry) {
if (entry.before.length === 0 && entry.after.length === 0) {
expandedMiddlewareList.push(entry);
}
else {
expandedMiddlewareList.push.apply(expandedMiddlewareList, __spreadArray([], __read(expandRelativeMiddlewareList(entry))));
}
});
expandedMiddlewareList.push(from);
from.after.reverse().forEach(function (entry) {
if (entry.before.length === 0 && entry.after.length === 0) {
expandedMiddlewareList.push(entry);
}
else {
expandedMiddlewareList.push.apply(expandedMiddlewareList, __spreadArray([], __read(expandRelativeMiddlewareList(entry))));
}
});
return expandedMiddlewareList;
};
var getMiddlewareList = function () {
var normalizedAbsoluteEntries = [];
var normalizedRelativeEntries = [];
var normalizedEntriesNameMap = {};
absoluteEntries.forEach(function (entry) {
var normalizedEntry = __assign(__assign({}, entry), { before: [], after: [] });
if (normalizedEntry.name)
normalizedEntriesNameMap[normalizedEntry.name] = normalizedEntry;
normalizedAbsoluteEntries.push(normalizedEntry);
});
relativeEntries.forEach(function (entry) {
var normalizedEntry = __assign(__assign({}, entry), { before: [], after: [] });
if (normalizedEntry.name)
normalizedEntriesNameMap[normalizedEntry.name] = normalizedEntry;
normalizedRelativeEntries.push(normalizedEntry);
});
normalizedRelativeEntries.forEach(function (entry) {
if (entry.toMiddleware) {
var toMiddleware = normalizedEntriesNameMap[entry.toMiddleware];
if (toMiddleware === undefined) {
throw new Error(entry.toMiddleware + " is not found when adding " + (entry.name || "anonymous") + " middleware " + entry.relation + " " + entry.toMiddleware);
}
if (entry.relation === "after") {
toMiddleware.after.push(entry);
}
if (entry.relation === "before") {
toMiddleware.before.push(entry);
}
}
});
var mainChain = sort(normalizedAbsoluteEntries)
.map(expandRelativeMiddlewareList)
.reduce(function (wholeList, expendedMiddlewareList) {
wholeList.push.apply(wholeList, __spreadArray([], __read(expendedMiddlewareList)));
return wholeList;
}, []);
return mainChain.map(function (entry) { return entry.middleware; });
};
var stack = {
add: function (middleware, options) {
if (options === void 0) { options = {}; }
var name = options.name, override = options.override;
var entry = __assign({ step: "initialize", priority: "normal", middleware: middleware }, options);
if (name) {
if (entriesNameSet.has(name)) {
if (!override)
throw new Error("Duplicate middleware name '" + name + "'");
var toOverrideIndex = absoluteEntries.findIndex(function (entry) { return entry.name === name; });
var toOverride = absoluteEntries[toOverrideIndex];
if (toOverride.step !== entry.step || toOverride.priority !== entry.priority) {
throw new Error("\"" + name + "\" middleware with " + toOverride.priority + " priority in " + toOverride.step + " step cannot be " +
("overridden by same-name middleware with " + entry.priority + " priority in " + entry.step + " step."));
}
absoluteEntries.splice(toOverrideIndex, 1);
}
entriesNameSet.add(name);
}
absoluteEntries.push(entry);
},
addRelativeTo: function (middleware, options) {
var name = options.name, override = options.override;
var entry = __assign({ middleware: middleware }, options);
if (name) {
if (entriesNameSet.has(name)) {
if (!override)
throw new Error("Duplicate middleware name '" + name + "'");
var toOverrideIndex = relativeEntries.findIndex(function (entry) { return entry.name === name; });
var toOverride = relativeEntries[toOverrideIndex];
if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) {
throw new Error("\"" + name + "\" middleware " + toOverride.relation + " \"" + toOverride.toMiddleware + "\" middleware cannot be overridden " +
("by same-name middleware " + entry.relation + " \"" + entry.toMiddleware + "\" middleware."));
}
relativeEntries.splice(toOverrideIndex, 1);
}
entriesNameSet.add(name);
}
relativeEntries.push(entry);
},
clone: function () { return cloneTo(constructStack()); },
use: function (plugin) {
plugin.applyToStack(stack);
},
remove: function (toRemove) {
if (typeof toRemove === "string")
return removeByName(toRemove);
else
return removeByReference(toRemove);
},
removeByTag: function (toRemove) {
var isRemoved = false;
var filterCb = function (entry) {
var tags = entry.tags, name = entry.name;
if (tags && tags.includes(toRemove)) {
if (name)
entriesNameSet.delete(name);
isRemoved = true;
return false;
}
return true;
};
absoluteEntries = absoluteEntries.filter(filterCb);
relativeEntries = relativeEntries.filter(filterCb);
return isRemoved;
},
concat: function (from) {
var cloned = cloneTo(constructStack());
cloned.use(from);
return cloned;
},
applyToStack: cloneTo,
resolve: function (handler, context) {
var e_1, _a;
try {
for (var _b = __values(getMiddlewareList().reverse()), _c = _b.next(); !_c.done; _c = _b.next()) {
var middleware = _c.value;
handler = middleware(handler, context);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return handler;
},
};
return stack;
};
var stepWeights = {
initialize: 5,
serialize: 4,
build: 3,
finalizeRequest: 2,
deserialize: 1,
};
var priorityWeights = {
high: 3,
normal: 2,
low: 1,
};