node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
111 lines (110 loc) • 5.63 kB
JavaScript
"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _Storage_instances, _Storage_adapter, _Storage_DB, _Storage_initialized, _Storage_path, _Storage_nodeSlug;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PACKAGE_NAME = void 0;
const fs_1 = __importDefault(require("fs"));
const lowdb_1 = __importDefault(require("lowdb"));
const FileAsync_1 = __importDefault(require("lowdb/adapters/FileAsync"));
const globals_1 = require("../../globals");
exports.PACKAGE_NAME = 'node-red-contrib-home-assistant-websocket';
const FILENAME = `${exports.PACKAGE_NAME}.json`;
class Storage {
constructor({ path, adapter, } = {}) {
_Storage_instances.add(this);
_Storage_adapter.set(this, void 0);
_Storage_DB.set(this, void 0);
_Storage_initialized.set(this, false);
_Storage_path.set(this, void 0);
__classPrivateFieldSet(this, _Storage_adapter, adapter, "f");
__classPrivateFieldSet(this, _Storage_path, path, "f");
}
// check permissions off file path
checkPermissions(path) {
if (!path)
return true;
try {
fs_1.default.accessSync(path, fs_1.default.constants.R_OK | fs_1.default.constants.W_OK);
}
catch (err) {
throw new Error('Cannot read/write to storage file for Home Assistant nodes');
}
return true;
}
async init() {
var _a, _b;
if (__classPrivateFieldGet(this, _Storage_initialized, "f")) {
return;
}
__classPrivateFieldSet(this, _Storage_initialized, true, "f");
const path = (_a = __classPrivateFieldGet(this, _Storage_path, "f")) !== null && _a !== void 0 ? _a : globals_1.RED.settings.userDir;
const dbLocation = `${path}/${FILENAME}`;
if (this.checkPermissions(path)) {
const adapter = (_b = __classPrivateFieldGet(this, _Storage_adapter, "f")) !== null && _b !== void 0 ? _b : new FileAsync_1.default(dbLocation);
__classPrivateFieldSet(this, _Storage_DB, await (0, lowdb_1.default)(adapter), "f");
await __classPrivateFieldGet(this, _Storage_DB, "f").defaults({ nodes: {} }).write();
}
}
async saveNodeData(nodeId, key, value) {
if (!__classPrivateFieldGet(this, _Storage_DB, "f")) {
throw new Error('cannot save node data without a db');
}
const path = `nodes.${__classPrivateFieldGet(this, _Storage_instances, "m", _Storage_nodeSlug).call(this, nodeId)}.${key}`;
return __classPrivateFieldGet(this, _Storage_DB, "f").set(path, value).write();
}
getNodeData(nodeId, key) {
if (!__classPrivateFieldGet(this, _Storage_DB, "f")) {
throw new Error('cannot get node data without a db');
}
const nodes = __classPrivateFieldGet(this, _Storage_DB, "f").get('nodes').value();
const node = nodes[__classPrivateFieldGet(this, _Storage_instances, "m", _Storage_nodeSlug).call(this, nodeId)];
if (!node) {
return;
}
if (!key) {
return node;
}
return node[key];
}
async removeNodeData(nodeId) {
if (!__classPrivateFieldGet(this, _Storage_DB, "f")) {
throw new Error('cannot remove node data without a db');
}
await __classPrivateFieldGet(this, _Storage_DB, "f").unset(`nodes.${__classPrivateFieldGet(this, _Storage_instances, "m", _Storage_nodeSlug).call(this, nodeId)}`).write();
return true;
}
async saveIssues(ids) {
if (!__classPrivateFieldGet(this, _Storage_DB, "f")) {
throw new Error('cannot save node data without a db');
}
const path = `issues.hidden`;
return __classPrivateFieldGet(this, _Storage_DB, "f").set(path, ids).write();
}
getIssues() {
if (!__classPrivateFieldGet(this, _Storage_DB, "f")) {
throw new Error('cannot get node data without a db');
}
const issues = __classPrivateFieldGet(this, _Storage_DB, "f").get('issues.hidden').value();
if (!issues) {
return [];
}
return issues;
}
}
_Storage_adapter = new WeakMap(), _Storage_DB = new WeakMap(), _Storage_initialized = new WeakMap(), _Storage_path = new WeakMap(), _Storage_instances = new WeakSet(), _Storage_nodeSlug = function _Storage_nodeSlug(nodeId) {
return nodeId.replace(/\./g, '_');
};
exports.default = new Storage();