@ha4us/script.adapter
Version:
Scripting Adapter for the ha4us
218 lines • 8.01 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @module Scripting Environment
*
*/
const path = require("path");
const fs = require("fs");
const luxon_1 = require("luxon");
const us_scheduler_1 = require("us-scheduler");
const core_1 = require("@ha4us/core");
const rxjs = require("rxjs");
const rxjsoperators = require("rxjs/operators");
const got = require("got");
const cheerio = require("cheerio");
const winston = require("winston");
const luxon_2 = require("luxon");
class Sandbox {
constructor(_script) {
this._script = _script;
this.stop$ = new rxjs.Subject();
this.onlyRetained = core_1.Ha4usOperators.onlyRetained;
this.noRetained = core_1.Ha4usOperators.noRetained;
this.pick = core_1.Ha4usOperators.pick;
this.pickEach = core_1.Ha4usOperators.pickEach;
this.render = core_1.render;
this.compileTemplate = core_1.compile;
this.randomString = core_1.randomString;
this._modules = { path, fs, rxjs, 'rxjs/operators': rxjsoperators };
this.http = {
parse: (url, query) => {
return got
.get(url, { query })
.then(response => cheerio.load(response.body));
},
get: (url, query) => {
return got.get(url, { query }).then(response => response.body);
},
};
this.console = {
log: (message, ...args) => {
this._script.log('debug', message, args);
// this._script.domain.bind(this._log.debug)(...args)
},
debug: (message, ...args) => {
this._script.log('debug', message, args);
// this._script.domain.bind(this._log.debug)(...args)
},
info: (message, ...args) => {
this._script.log('info', message, args);
// this._script.domain.bind(this._log.debug)(...args)
},
warn: (message, ...args) => {
this._script.log('warn', message, args);
// this._script.domain.bind(this._log.debug)(...args)
},
error: (message, ...args) => {
this._script.log('error', message, args);
// this._script.domain.bind(this._log.debug)(...args)
},
};
this.log = this.console;
this._log = this._setupLogger();
luxon_2.Settings.defaultLocale = 'de';
this._$states = _script.opts.$states;
this._$objects = _script.opts.$objects;
this._$yaml = _script.opts.$yaml;
this.$media = _script.opts.$media;
this._scheduler = new us_scheduler_1.Scheduler({
latitude: _script.opts.$args.lat,
longitude: _script.opts.$args.long,
skipPast: true,
});
}
get sandbox() {
const resultingSandbox = {};
Object.getOwnPropertyNames(Object.getPrototypeOf(this))
.filter(key => key !== 'sandbox' && key !== 'constructor' && key.charAt(0) !== '_')
.forEach(prop => (resultingSandbox[prop] = this[prop].bind(this)));
Object.getOwnPropertyNames(this)
.filter(key => key.charAt(0) !== '_')
.forEach(prop => (resultingSandbox[prop] = this[prop]));
resultingSandbox.__dirname = this._script.path;
resultingSandbox.DateTime = luxon_1.DateTime;
return resultingSandbox;
}
_setupLogger() {
const logPath = path.resolve(this._script.path, this._script.name.replace('/', '_') + '.log');
/*const myFormat = format.printf(info => {
return `${info.timestamp} ${info.level}: ${info.message}`
})*/
return new winston.Logger({
transports: [
/* new winston.transports.Console({
json: false,
level: 'debug',
colorize: false,
prettyPrint: true,
stderrLevels: ['error', 'warn'],
timestamp: true,
}),*/
new winston.transports.File({
filename: logPath,
json: false,
level: 'debug',
colorize: false,
prettyPrint: true,
stderrLevels: ['error', 'warn'],
timestamp: true,
}),
],
});
/* winston.configure({
transports: [
new transports.File({
}),
],
})*/
}
require(md) {
this._log.debug('requiring', md);
if (this._modules.hasOwnProperty(md)) {
return this._modules[md];
}
let tmp;
if (md.match(/^\.\//) || md.match(/^\.\.\//)) {
tmp = './' + path.relative(__dirname, path.join(this._script.path, md));
}
else {
tmp = md;
this._log.debug('Looking in', path.join(this._script.path, 'node_modules', md, 'package.json'));
if (fs.existsSync(path.join(this._script.path, 'node_modules', md, 'package.json'))) {
// must be in node_modules of scriptDir
tmp = path.resolve(path.join(this._script.path, 'node_modules', md));
this._log.debug('Requiring from node_modules in scriptdir', md);
}
}
this._log.debug('Finally requiring', path.resolve(tmp));
this._modules[md] = require(tmp);
return this._modules[md];
}
observe(topic, ...params) {
this._script.enterDomain();
return this._script.opts.$states
.observe(topic, ...params)
.pipe(rxjsoperators.takeUntil(this.stop$));
}
combine(...pattern) {
return this._script.opts.$states
.observeLatest(...pattern)
.pipe(rxjsoperators.takeUntil(this.stop$));
}
set(topic, value) {
return this._$states.set(topic, value);
}
get(topic) {
return this._$states.get(topic);
}
status(topic, value, retained = true) {
return this._$states.status(core_1.MqttUtil.join(this._script.name, topic), value, retained);
}
emit(topic, value, retained = true) {
return this._$states.status(core_1.MqttUtil.join(this._script.name, topic), value, retained);
}
schedule(...times) {
this._script.enterDomain();
return this._scheduler
.schedule(...times)
.pipe(rxjsoperators.takeUntil(this.stop$));
}
cron(cronPattern) {
return us_scheduler_1.cron(cronPattern, luxon_1.DateTime.local()).pipe(rxjsoperators.takeUntil(this.stop$));
}
doIn(duration, data) {
this._script.enterDomain();
return this._scheduler
.in(duration, data)
.pipe(rxjsoperators.takeUntil(this.stop$));
}
doAt(date) {
this._script.enterDomain();
return this._scheduler.at(date).pipe(rxjsoperators.takeUntil(this.stop$));
}
load(file) {
return this._$yaml.load(file, this._script.path);
}
save(data, file) {
return this._$yaml.save(data, file, {
filePath: this._script.path,
});
}
createObject(topic, data) {
return this._$objects
.create([data, {}], {
root: core_1.MqttUtil.join('$', this._script.topic, topic),
mode: 'update',
})
.toPromise();
}
$onDestroy(destroyFunc) {
this._onDestroy = destroyFunc;
}
random(maxOrMin, max) {
if (!max) {
max = maxOrMin;
maxOrMin = 0;
}
return Math.floor(Math.random() * (max - maxOrMin + 1)) + maxOrMin;
}
downloadImage(url, fileOptions) {
return this.$media.postUrl(url, fileOptions).then(data => data.urn);
}
event(msg, opt) {
// this.$event
}
}
exports.Sandbox = Sandbox;
//# sourceMappingURL=sandbox.class.js.map