diff --git a/.github/workflows/test-and-release.yml b/.github/workflows/test-and-release.yml index 814b86b..dae435f 100644 --- a/.github/workflows/test-and-release.yml +++ b/.github/workflows/test-and-release.yml @@ -97,10 +97,10 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Use Node.js 18.x + - name: Use Node.js 20.x uses: actions/setup-node@v4 with: - node-version: 18.x + node-version: 20.x - name: Extract the version and commit body from the tag id: extract_release diff --git a/dist/lib/SimpleAPI.d.ts b/dist/lib/SimpleAPI.d.ts new file mode 100644 index 0000000..27461e1 --- /dev/null +++ b/dist/lib/SimpleAPI.d.ts @@ -0,0 +1,95 @@ +import type { Server as HttpServer } from 'node:http'; +import type { Server as HttpsServer } from 'node:https'; +import { Express, type Request, type Response } from 'express'; +export type Server = HttpServer | HttpsServer; +declare const commandsPermissions: { + [operation: string]: { + type: 'state' | 'object' | ''; + operation: 'read' | 'write' | 'list' | ''; + }; +}; +type CommandName = keyof typeof commandsPermissions; +/** + * SimpleAPI class + * + * From settings used only secure, auth and crossDomain + * + * @class + * @param webSettings settings of the web server, like
{secure: settings.secure, port: settings.port}
+ * @param adapter web adapter object + * @param instanceSettings instance object with common and native + * @param app express application + * @return object instance + */ +export declare class SimpleAPI { + private readonly adapter; + private readonly settings; + private readonly config; + private readonly namespace; + private readonly app?; + private readonly cachedNames; + private readonly cachedIds; + private readonly restApiDelayed; + constructor(_server: Server, webSettings: { + secure: boolean; + port: number | string; + defaultUser?: string; + auth?: boolean; + language?: ioBroker.Languages; + }, adapter: ioBroker.Adapter, instanceSettings: ioBroker.InstanceObject, app?: Express); + isAuthenticated(query: { + user?: string; + pass?: string; + }): Promise; + stateChange(id: string, state: ioBroker.State | null | undefined): void; + objectChange(id: string, _obj: ioBroker.Object | null | undefined): void; + static parseQuery(input: string | undefined, query: { + user?: string; + pass?: string; + prettyPrint?: boolean; + json?: boolean; + noStringify?: boolean; + wait?: number; + ack: boolean; + }, values: Record): void; + setStates(values: Record, query: { + user?: string; + pass?: string; + prettyPrint?: boolean; + json?: boolean; + noStringify?: boolean; + wait?: number; + ack: boolean; + }): Promise<{ + id?: string; + val?: boolean | string | number; + error?: string; + }[]>; + restApiPost(req: Request, res: Response, command: CommandName, oId: string[], values: Record, query: { + user?: string; + pass?: string; + prettyPrint?: boolean; + json?: boolean; + noStringify?: boolean; + wait?: number; + ack: boolean; + }): Promise; + findState(idOrName: string, user: `system.user.${string}`): Promise<{ + id: string; + name: string; + }>; + getState(idOrName: string, user: `system.user.${string}`): Promise<{ + state: ioBroker.State | null | undefined; + id: string; + }>; + doResponse(res: Response, type: 'json' | 'plain', content?: any, pretty?: boolean): void; + doErrorResponse(res: Response, type: 'json' | 'plain', status: 401 | 403 | 404 | 422 | 500, error?: string): void; + checkPermissions(user: `system.user.${string}`, command: CommandName): Promise; + setValue(id: string, value: ioBroker.StateValue, res: Response, wait: number, query: { + ack: boolean; + user?: string; + prettyPrint?: boolean; + }, responseType: 'json' | 'plain'): Promise; + restApi(req: Request, res: Response, overwriteUrl?: string): Promise; +} +export {}; diff --git a/dist/lib/SimpleAPI.js b/dist/lib/SimpleAPI.js new file mode 100644 index 0000000..7c44606 --- /dev/null +++ b/dist/lib/SimpleAPI.js @@ -0,0 +1,1169 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SimpleAPI = void 0; +// copied from here: https://github.com/component/escape-html/blob/master/index.js +const matchHtmlRegExp = /["'&<>]/; +function escapeHtml(string) { + const str = `${string}`; + const match = matchHtmlRegExp.exec(str); + if (!match) { + return str; + } + let escape; + let html = ''; + let index; + let lastIndex = 0; + for (index = match.index; index < str.length; index++) { + switch (str.charCodeAt(index)) { + case 34: // " + escape = '"'; + break; + case 38: // & + escape = '&'; + break; + case 39: // ' + escape = '''; + break; + case 60: // < + escape = '<'; + break; + case 62: // > + escape = '>'; + break; + default: + continue; + } + if (lastIndex !== index) { + html += str.substring(lastIndex, index); + } + lastIndex = index + 1; + html += escape; + } + return lastIndex !== index ? html + str.substring(lastIndex, index) : html; +} +const ERROR_PERMISSION = 'permissionError'; +const ERROR_UNKNOWN_COMMAND = 'unknownCommand'; +// static information +const commandsPermissions = { + getPlainValue: { type: 'state', operation: 'read' }, + get: { type: 'state', operation: 'read' }, + getBulk: { type: 'state', operation: 'read' }, + set: { type: 'state', operation: 'write' }, + toggle: { type: 'state', operation: 'write' }, + setBulk: { type: 'state', operation: 'write' }, + setValueFromBody: { type: 'state', operation: 'write' }, + getObjects: { type: 'object', operation: 'list' }, + objects: { type: 'object', operation: 'list' }, + states: { type: 'state', operation: 'list' }, + getStates: { type: 'state', operation: 'list' }, + search: { type: 'state', operation: 'list' }, + query: { type: 'state', operation: 'read' }, + annotations: { type: '', operation: '' }, + help: { type: '', operation: '' }, +}; +/** + * SimpleAPI class + * + * From settings used only secure, auth and crossDomain + * + * @class + * @param webSettings settings of the web server, like
{secure: settings.secure, port: settings.port}
+ * @param adapter web adapter object + * @param instanceSettings instance object with common and native + * @param app express application + * @return object instance + */ +class SimpleAPI { + adapter; + settings; + config; + namespace; + app; + cachedNames = new Map(); + cachedIds = new Map(); + restApiDelayed = []; + constructor(_server, webSettings, adapter, instanceSettings, app) { + this.app = app; + this.adapter = adapter; + this.settings = webSettings; + this.config = instanceSettings + ? instanceSettings.native + : {}; + this.namespace = instanceSettings ? instanceSettings._id.substring('system.adapter.'.length) : 'simple-api'; + this.adapter.log.info(`${this.settings.secure ? 'Secure ' : ''}simpleAPI server listening on port ${this.settings.port}`); + this.config.defaultUser = webSettings.defaultUser || this.config.defaultUser || 'system.user.admin'; + if (!this.config.defaultUser.match(/^system\.user\./)) { + this.config.defaultUser = `system.user.${this.config.defaultUser}`; + } + this.config.onlyAllowWhenUserIsOwner = !!this.config.onlyAllowWhenUserIsOwner; + this.adapter.log.info(`Allow states only when user is owner: ${this.config.onlyAllowWhenUserIsOwner}`); + if (this.app) { + this.adapter.log.info(`Install extension on /${this.namespace}/`); + this.app.use(`/${this.namespace}/`, (req, res) => { + this.restApi(req, res); + }); + // let it be accessible under old address too + for (const c in commandsPermissions) { + ((command) => { + this.adapter.log.info(`Install extension on /${command}/`); + this.app.use(`/${command}/`, (req, res) => { + void this.restApi(req, res, `/${command}${req.url}`); + }); + })(c); + } + } + // Subscribe on object changes to manage cache + this.adapter.subscribeForeignObjects('*'); + } + async isAuthenticated(query) { + if (!query.user || !query.pass) { + this.adapter.log.warn('No password or username!'); + return false; + } + const res = await this.adapter.checkPasswordAsync(query.user, query.pass); + if (res) { + this.adapter.log.debug(`Logged in: ${query.user}`); + } + else { + this.adapter.log.warn(`Invalid password or user name: ${query.user}`); + } + return res; + } + stateChange(id, state) { + if (state?.ack) { + for (let i = this.restApiDelayed.length - 1; i >= 0; i--) { + if (this.restApiDelayed[i].id === id) { + if (this.restApiDelayed[i].timer) { + this.restApiDelayed[i].timer = undefined; + this.adapter.clearTimeout(this.restApiDelayed[i].timer); + this.restApiDelayed[i].resolve(this.restApiDelayed[i].index); + } + this.restApiDelayed.splice(i, 1); + } + } + } + } + objectChange(id, _obj) { + // Clear from cache, will be reinitialized on next usage + if (this.cachedIds.has(id)) { + const name = this.cachedIds.get(id)?.name; + if (name) { + this.cachedIds.delete(id); + this.cachedNames.delete(name); + } + } + } + static parseQuery(input, query, values) { + const parts = (input || '').split('&'); + for (const part of parts) { + const [name, value] = part.split('='); + try { + if (name === 'user') { + query.user = decodeURIComponent(value.trim()); + } + else if (name === 'pass') { + query.pass = decodeURIComponent(value); + } + else if (name === 'prettyPrint') { + query.prettyPrint = !value ? true : decodeURIComponent(value.trim()) === 'true'; + } + else if (name === 'json') { + query.json = !value ? true : decodeURIComponent(value.trim()) === 'true'; + } + else if (name === 'noStringify') { + query.noStringify = !value ? true : decodeURIComponent(value.trim()) === 'true'; + } + else if (name === 'wait') { + query.wait = !value ? 2000 : parseInt(decodeURIComponent(value.trim()), 10) || 0; + } + else if (name === 'ack') { + const val = decodeURIComponent(value.trim()); + query.ack = val === 'true' || val === '1'; + } + else { + values[name] = + value === undefined ? null : decodeURIComponent(`${value.trim()}`.replace(/\+/g, '%20')); + } + } + catch { + values[name] = value; + } + } + if (query.ack === undefined) { + query.ack = false; + } + } + async setStates(values, query) { + let response = []; + const names = Object.keys(values); + for (let i = 0; i < names.length; i++) { + const stateId = names[i]; + this.adapter.log.debug(`${i}: "${stateId}"`); + try { + const { id, name } = await this.findState(stateId, query.user); + if (!id) { + response[i] = { error: `datapoint "${stateId}" not found` }; + } + else { + let value; + if (values[stateId] === 'true') { + value = true; + } + else if (values[stateId] === 'false') { + value = false; + } + else { + const f = parseFloat(values[stateId]); + if (!isNaN(f) && values[stateId] === f.toString()) { + value = f; + } + else { + value = values[stateId]; + } + } + try { + await this.adapter.setForeignState(id, value, !!query.ack, { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + response[i] = { id, val: value }; + this.adapter.log.debug(`Add to Response: ${JSON.stringify(response[i])}`); + } + catch (err) { + throw err; + } + } + } + catch (err) { + // State isn't found or no permission + if (err.toString().includes(ERROR_PERMISSION)) { + throw err; + } + response[i] = { error: err.toString() }; + } + } + return response; + } + async restApiPost(req, res, command, oId, values, query) { + let body = ''; + req.on('data', (data) => { + body += data.toString(); + }); + await new Promise(resolve => req.on('end', resolve)); + switch (command) { + case 'setBulk': { + this.adapter.log.debug(`POST-${command}: body = ${body}`); + SimpleAPI.parseQuery(body, query, values); + this.adapter.log.debug(`POST-${command}: values = ${JSON.stringify(values)}`); + try { + const response = await this.setStates(values, query); + this.doResponse(res, 'json', response, query.prettyPrint); + } + catch (err) { + // State not found + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, 'json', 401, err.toString()); + } + else if (err.toString().includes('found')) { + this.doErrorResponse(res, 'json', 404, err.toString()); + } + else { + this.doErrorResponse(res, 'json', 500, err.toString()); + } + } + break; + } + case 'setValueFromBody': { + // all given variables will get the same value + Object.values(oId).forEach(id => { + values[id] = body; + }); + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, 'json', 422, 'no object/datapoint given'); + return; + } + try { + const response = await this.setStates(values, query); + this.doResponse(res, 'json', response, query.prettyPrint); + } + catch (err) { + // State not found + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, 'json', 403, err.toString()); + } + else if (err.toString().includes('found')) { + this.doErrorResponse(res, 'json', 404, err.toString()); + } + else { + this.doErrorResponse(res, 'json', 500, err.toString()); + } + } + break; + } + case 'search': + if (this.config.dataSource && this.config.allDatapoints) { + const result = await this.adapter.sendToAsync(this.config.dataSource, 'getEnabledDPs'); + this.doResponse(res, 'json', Object.keys(result), query.prettyPrint); + } + else { + try { + const target = JSON.parse(body).target || ''; + this.adapter.log.debug(`[SEARCH] target = ${target}`); + const list = await this.adapter.getForeignStatesAsync(values.pattern || `${target}*`, { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + oId = Object.keys(list); + this.doResponse(res, 'json', oId, query.prettyPrint); + } + catch (err) { + if (err.includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, 'json', 401, err); + } + else { + this.doErrorResponse(res, 'json', 500, err); + } + } + } + break; + case 'query': { + let bodyQuery; + try { + bodyQuery = JSON.parse(body); + let dateFrom = Date.now(); + let dateTo = Date.now(); + this.adapter.log.debug(`[QUERY] targets = ${JSON.stringify(bodyQuery.targets)}`); + this.adapter.log.debug(`[QUERY] range = ${JSON.stringify(bodyQuery.range)}`); + if (bodyQuery.range) { + dateFrom = Date.parse(bodyQuery.range.from); + dateTo = Date.parse(bodyQuery.range.to); + } + const options = { + start: dateFrom, + end: dateTo, + aggregate: values.aggregate || 'onchange', + }; + if (values.count) { + options.count = parseInt(values.count, 10); + } + if (values.step) { + options.step = parseInt(values.step, 10); + } + oId = []; + if (Array.isArray(bodyQuery.targets)) { + bodyQuery.targets.forEach(t => oId.push(t.target)); + } + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, 'json', 422, 'no datapoints given'); + break; + } + const list = []; + for (let b = 0; b < bodyQuery.targets.length; b++) { + const element = { + target: bodyQuery.targets[b].target, + datapoints: [], + }; + if (this.config.dataSource && + !(bodyQuery.targets[b].data && bodyQuery.targets[b].data.noHistory === true)) { + this.adapter.log.debug(`Read data from: ${this.config.dataSource}`); + const result = await this.adapter.getHistoryAsync(this.config.dataSource, bodyQuery.targets[b].target, options); + this.adapter.log.debug(`[QUERY] sendTo result = ${JSON.stringify(result)}`); + for (let i = 0; i < result.result.length; i++) { + element.datapoints.push([result.result[i].val, result.result[i].ts]); + } + list.push(element); + } + else { + this.adapter.log.debug('Read last state'); + try { + const { state, id } = await this.getState(bodyQuery.targets[b].target, query.user); + element.target = id; + if (state) { + element.datapoints = [[state.val, state.ts]]; + } + else { + element.datapoints = [[null, null]]; + } + list.push(element); + } + catch (err) { + if (err.toString().includes('not found')) { + list.push({ target: bodyQuery.targets[b].target, datapoints: [] }); + } + else { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, 'json', 401, err); + } + else { + this.doErrorResponse(res, 'json', 500, err); + } + return; + } + } + } + } + this.doResponse(res, 'json', list, query.prettyPrint); + } + catch (err) { + if (err.includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, 'json', 403, err); + } + else { + this.doErrorResponse(res, 'json', 500, `Cannot parse request: ${body}`); + } + } + break; + } + case 'annotations': + // iobroker does not support annotations + this.adapter.log.debug('[ANNOTATIONS]'); + this.doResponse(res, 'json', [], query.prettyPrint); + break; + default: + this.doErrorResponse(res, 'json', 422, `command "${command}" unknown`); + break; + } + } + async findState(idOrName, user) { + // By ID + let r = this.cachedIds.get(idOrName); + if (r) { + return r; + } + // By name + r = this.cachedNames.get(idOrName); + if (r) { + return r; + } + const result = + // @ts-expect-error fixed in js-controller + await this.adapter.findForeignObjectAsync(idOrName, null, { user, lang: this.settings.language }); + if (result.id) { + let name; + if (result.name && typeof result.name === 'object') { + name = result.name[this.settings.language || 'en'] || result.name.en; + } + else { + name = result.name || ''; + } + this.cachedIds.set(result.id, { id: result.id, name }); + if (idOrName !== result.id) { + // search was for a name, so also cache the name + this.cachedNames.set(name, { id: result.id, name }); + } + return { id: result.id, name }; + } + throw new Error(`datapoint "${idOrName}" not found`); + } + async getState(idOrName, user) { + const result = await this.findState(idOrName, user); + return { + state: await this.adapter.getForeignStateAsync(result.id, { + user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }), + id: result.id, + }; + } + doResponse(res, type, content, pretty) { + let response; + if (pretty && typeof content === 'object') { + type = 'plain'; + response = JSON.stringify(content, null, 2); + } + else { + response = JSON.stringify(content); + } + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + res.setHeader('Content-Type', type === 'json' ? 'application/json; charset=utf-8' : 'text/html; charset=utf-8'); + res.statusCode = 200; + res.end(response, 'utf8'); + } + doErrorResponse(res, type, status, error) { + let response; + response = escapeHtml(error || 'unknown'); + if (!response.startsWith('error: ')) { + response = `error: ${response}`; + } + if (type === 'json') { + response = JSON.stringify({ error: response }); + } + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + res.setHeader('Content-Type', type === 'json' ? 'application/json; charset=utf-8' : 'text/html; charset=utf-8'); + res.statusCode = status; + res.end(response, 'utf8'); + } + async checkPermissions(user, command) { + const acl = await this.adapter.calculatePermissionsAsync(user, commandsPermissions); + if (user !== 'system.user.admin') { + // type: file, object, state, other + // operation: create, read, write, list, delete, sendto, execute, sendto + if (commandsPermissions[command]) { + // If permission required + if (commandsPermissions[command].type) { + if (commandsPermissions[command].type === 'object') { + if (commandsPermissions[command].operation === 'list') { + return !!acl.object?.list; + } + if (commandsPermissions[command].operation === 'read') { + return !!acl.object?.read; + } + return !!acl.object?.write; + } + if (commandsPermissions[command].type === 'state') { + if (commandsPermissions[command].operation === 'list') { + return !!acl.state?.list; + } + if (commandsPermissions[command].operation === 'read') { + return !!acl.state?.read; + } + return !!acl.state?.write; + } + } + return true; + } + // unknown command + this.adapter.log.warn(`Unknown command from "${user}": ${command}`); + return false; + } + return true; + } + async setValue(id, value, res, wait, query, responseType) { + if (wait) { + await this.adapter.subscribeForeignStatesAsync(id); + } + try { + await this.adapter.setForeignState(id, value, query.ack, { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + } + catch (err) { + if (wait && !this.restApiDelayed.find(it => it.id === id)) { + this.adapter.unsubscribeForeignStates(id); + } + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + } + else { + this.doErrorResponse(res, responseType, 500, err); + } + return; + } + if (!wait) { + this.doResponse(res, responseType, { id, value, val: value }, query.prettyPrint); + } + else { + // Wait for ack=true + await new Promise((resolve, reject) => { + let timer; + const index = `${Date.now()}_${Math.round(Math.random() * 1000000)}`; + timer = this.adapter.setTimeout(() => { + timer = undefined; + reject(new Error(`timeout ${index}`)); + }, wait); + this.restApiDelayed.push({ id, resolve, timer, index, value }); + }) + .then((index) => { + // Delete the timer + for (let i = 0; i < this.restApiDelayed.length; i++) { + if (this.restApiDelayed[i].index === index) { + const id = this.restApiDelayed[i].id; + const value = this.restApiDelayed[i].value; + if (this.restApiDelayed[i].timer) { + this.adapter.clearTimeout(this.restApiDelayed[i].timer); + this.restApiDelayed[i].timer = undefined; + } + this.restApiDelayed.splice(i, 1); + this.doResponse(res, responseType, { id, value, val: value }, query.prettyPrint); + // Unsubscribe if no other request is waiting + if (!this.restApiDelayed.find(it => it.id === id)) { + this.adapter.unsubscribeForeignStates(id); + } + break; + } + } + }) + .catch((err) => { + const [error, index] = err.toString().split(' '); + for (let i = 0; i < this.restApiDelayed.length; i++) { + if (this.restApiDelayed[i].index === index) { + const id = this.restApiDelayed[i].id; + if (this.restApiDelayed[i].timer) { + this.adapter.clearTimeout(this.restApiDelayed[i].timer); + this.restApiDelayed[i].timer = undefined; + } + this.restApiDelayed.splice(i, 1); + if (!this.restApiDelayed.find(it => it.id === id)) { + this.adapter.unsubscribeForeignStates(id); + } + this.doErrorResponse(res, responseType, 500, error); + break; + } + } + }); + } + } + async restApi(req, res, overwriteUrl) { + let url = overwriteUrl || req.url || ''; + const values = {}; + const query = { ack: false }; + let oId = []; + try { + url = decodeURI(url); + } + catch (e) { + this.adapter.log.warn(`Malformed URL encoding for ${url}: ${e}`); + } + const pos = url.indexOf('?'); + if (pos !== -1) { + url = url.substring(0, pos); + SimpleAPI.parseQuery(url.substring(pos + 1), query, values); + } + const [, _command, varsName] = url.split('/'); + const command = _command; + const responseType = command === 'getPlainValue' ? 'plain' : 'json'; + // Analyse system.adapter.socketio.0.uptime,system.adapter.history.0.memRss?value=78&wait=300 + if (varsName) { + oId = varsName.split(','); + for (let j = oId.length - 1; j >= 0; j--) { + try { + oId[j] = decodeURIComponent(oId[j]); + } + catch (e) { + this.adapter.log.warn(`Malformed URL encoding for "${oId[j]}": ${e}`); + oId[j] = oId[j].trim().replace(/%23/g, '#'); // do old style minimal parsing + } + } + oId = oId.filter(id => id.trim()); + } + let user; + // If authentication check is required + if (this.settings.auth) { + query.user ||= req.user; + const isAuth = !!req.user || (await this.isAuthenticated(query)); + if (!isAuth) { + this.doErrorResponse(res, responseType, 401, `authentication failed. Please write "http${this.settings.secure ? 's' : ''}://${req.headers.host}?user=UserName&pass=Password"`); + return; + } + } + else { + query.user = req.user || this.config.defaultUser; + } + if (query.user && !query.user.startsWith('system.user.')) { + user = `system.user.${query.user}`; + } + else { + user = query.user; + } + if (!(await this.checkPermissions(user, command))) { + this.doErrorResponse(res, responseType, 401, `No permission for "${query.user}" to call ${command}`); + return; + } + if (req.method === 'POST') { + await this.restApiPost(req, res, command, oId, values, query); + return; + } + switch (command) { + case 'getPlainValue': { + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, responseType, 422, 'no datapoint given'); + break; + } + const response = []; + for (let i = 0; i < oId.length; i++) { + try { + const { state, id } = await this.getState(oId[i], user); + if (state) { + let val = state.val; + if (query.json) { + let obj; + try { + obj = JSON.parse(typeof val === 'string' ? val : JSON.stringify(val)); + } + catch { + // ignore + obj = val; + } + val = JSON.stringify(obj); + } + else { + if (query.noStringify) { + val = + state.val === null + ? 'null' + : state.val === undefined + ? 'undefined' + : state.val.toString(); + } + else { + val = JSON.stringify(state.val); + } + } + response[i] = val; + } + else { + response[i] = `error: cannot read state "${oId[i]}"`; + } + } + catch (err) { + if (err.toString().includes('not found')) { + response[i] = `error: datapoint "${oId[i]}" not found`; + } + else { + this.adapter.log.error(`Cannot get state: ${err}`); + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + } + else { + this.doErrorResponse(res, responseType, 500, err); + } + return; + } + } + } + this.doResponse(res, responseType, response.join('\n'), query.prettyPrint); + break; + } + case 'get': { + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, responseType, 422, 'no object/datapoint given'); + break; + } + const response = []; + for (let k = 0; k < oId.length; k++) { + this.adapter.log.debug(`work for ID ${oId[k]}`); + try { + const { state, id } = await this.getState(oId[k], query.user); + if (!id) { + response[k] = { error: `datapoint "${oId[k]}" not found` }; + } + else { + const obj = this.adapter.getForeignObjectAsync(id); + response[k] = { ...obj, ...state }; + } + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + return; + } + response[k] = { error: `datapoint "${oId[k]}" not found` }; + } + } + this.doResponse(res, responseType, response.length === 1 ? response[0] : response, query.prettyPrint); + break; + } + case 'getBulk': { + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, responseType, 422, 'no datapoints given'); + break; + } + const response = []; + for (let b = 0; b < oId.length; b++) { + try { + const { id, state } = await this.getState(oId[b], query.user); + response[b] = { id, val: state?.val, ts: state?.ts, ack: state?.ack }; + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + return; + } + response[b] = { id: oId[b], val: undefined, ts: undefined, ack: undefined }; + } + } + this.doResponse(res, responseType, response, query.prettyPrint); + break; + } + case 'set': { + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, responseType, 422, 'object/datapoint not given'); + return; + } + if (values.value === undefined && values.val === undefined) { + this.doErrorResponse(res, responseType, 422, `error: no value found for "${oId[0]}". Use /set/id?value=1 or /set/id?value=1&wait=1000`); + return; + } + try { + const { id } = await this.findState(oId[0], query.user); + if (!id) { + this.doErrorResponse(res, responseType, 404, `error: datapoint "${oId[0]}" not found`); + return; + } + const type = values.type; + let value; + if (values.val === undefined) { + value = values.value; + } + else { + value = values.val; + } + // Ack=true cannot be awaited + const wait = !query.ack ? query.wait || 0 : 0; + // If type is not defined or not known + if (!type || + (type !== 'boolean' && + type !== 'number' && + type !== 'string' && + type !== 'json' && + type !== 'object' && + type !== 'array')) { + // Maybe this is JSON + if (values.val && (values.val[0] === '[' || values.val[0] === '{')) { + try { + values.val = JSON.parse(values.val); + } + catch (e) { + // keep it as string + } + } + if (value === 'true') { + value = true; + } + else if (value === 'false') { + value = false; + } + else if (!isNaN(parseFloat(value))) { + value = parseFloat(value); + } + } + else { + // type is known + if (type === 'boolean') { + value = value === 'true' || value === '1'; + } + else if (type === 'number') { + value = parseFloat(value); + } + else if (type === 'json' || type === 'array' || type === 'object') { + try { + value = JSON.parse(value); + } + catch (e) { + this.doErrorResponse(res, responseType, 500, e); + return; + } + } + // string must not be formatted + } + await this.setValue(id, value, res, wait, query, responseType); + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + } + else { + this.doErrorResponse(res, responseType, 404, err); + } + } + break; + } + case 'toggle': + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, responseType, 422, 'state not given'); + return; + } + try { + const { id } = await this.findState(oId[0], query.user); + if (id) { + const wait = query.wait || 0; + // Read a type of object + const obj = await this.adapter.getForeignObjectAsync(id, { + user: query.user, + }); + if (obj) { + const state = await this.adapter.getForeignStateAsync(id, { + user: query.user, + }); + if (state) { + let value = state.val; + if (obj.common.type === 'boolean' || (!obj.common.type && typeof value === 'boolean')) { + if (value === 'true') { + value = true; + } + else if (value === 'false') { + value = false; + } + value = !value; + } + else if (obj.common.type === 'number' || + (!obj.common.type && typeof value === 'number')) { + value = parseFloat(value); + if (obj.common.max !== undefined) { + obj.common.min = obj.common.min === undefined ? 0 : obj.common.min; + if (value > obj.common.max) { + value = obj.common.max; + } + else if (value < obj.common.min) { + value = obj.common.min; + } + // Invert + value = obj.common.max + obj.common.min - value; + } + else { + // the default number is from 0 to 100 + if (value > 100) { + value = 100; + } + if (value < 0) { + value = 0; + } + value = 100 - value; + } + } + else { + if (value === 'true' || value === true) { + value = false; + } + else if (value === 'on') { + value = 'off'; + } + else if (value === 'off') { + value = 'on'; + } + else if (value === 'OFF') { + value = 'ON'; + } + else if (value === 'ON') { + value = 'OFF'; + } + else if (value === 'false' || value === false) { + value = true; + } + else if (parseFloat(value).toString() === value?.toString()) { + value = parseFloat(value).toString() ? 0 : 1; + } + else { + this.doErrorResponse(res, responseType, 422, 'state is neither number nor boolean'); + return; + } + } + await this.setValue(id, value, res, wait, query, responseType); + return; + } + this.doErrorResponse(res, responseType, 404, `error: state "${oId[0]}" does not exist or null`); + return; + } + } + this.doErrorResponse(res, responseType, 404, `error: datapoint "${oId[0]}" not found`); + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + } + else { + this.doErrorResponse(res, responseType, 404, err); + } + } + break; + // /setBulk?BidCos-RF.FEQ1234567:1.LEVEL=0.7&Licht-Küche/LEVEL=0.7&Anwesenheit=0&950=1 + case 'setBulk': { + const response = []; + this.adapter.log.debug(`Values: ${JSON.stringify(values)}`); + const names = Object.keys(values); + for (let n = 0; n < names.length; n++) { + try { + const { id, name } = await this.findState(names[n], query.user); + if (!id) { + response[n] = { error: `error: datapoint "${names[n]}" not found` }; + continue; + } + this.adapter.log.debug(`GET-${command} for id=${id}, oid=${names[n]}, value=${values[names[n]]}`); + let value = values[names[n]]; + if (value === 'true') { + value = true; + } + else if (value === 'false') { + value = false; + } + else { + const f = parseFloat(value); + if (!isNaN(f) && value === f.toString()) { + value = f; + } + } + try { + await this.adapter.setForeignState(id, value, query.ack, { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + response[n] = { id: id, val: value, value }; + this.adapter.log.debug(`Add to Response-Get: ${JSON.stringify(response[n])}`); + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + return; + } + else { + response[n] = { error: err.toString() }; + } + } + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doErrorResponse(res, responseType, 403, err); + return; + } + else { + response[n] = { error: err.toString() }; + } + } + } + this.doResponse(res, responseType, response, query.prettyPrint); + break; + } + case 'getObjects': + case 'objects': { + try { + const list = await this.adapter.getForeignObjectsAsync(values.pattern || varsName || '*', values.type || null, { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + this.doResponse(res, responseType, list, query.prettyPrint); + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doResponse(res, responseType, 403, err.toString()); + } + else { + this.doResponse(res, responseType, 500, err.toString()); + } + } + break; + } + case 'getStates': + case 'states': { + try { + const list = await this.adapter.getForeignStatesAsync(values.pattern || varsName || '*', { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + this.doResponse(res, responseType, list, query.prettyPrint); + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doResponse(res, responseType, 403, err.toString()); + } + else { + this.doResponse(res, responseType, 500, err.toString()); + } + } + break; + } + case 'search': + try { + if (this.config.dataSource && this.config.allDatapoints !== true) { + const result = await this.adapter.sendToAsync(this.config.dataSource, 'getEnabledDPs'); + this.doResponse(res, responseType, Object.keys(result || {}), query.prettyPrint); + } + else { + this.adapter.log.debug(`[SEARCH] target = ${varsName}`); + const list = await this.adapter.getForeignStatesAsync(values.pattern || varsName || '*', { + user: query.user, + limitToOwnerRights: this.config.onlyAllowWhenUserIsOwner, + }); + this.doResponse(res, responseType, Object.keys(list), query.prettyPrint); + } + } + catch (err) { + if (err.toString().includes(ERROR_PERMISSION)) { + this.doResponse(res, responseType, 403, err.toString()); + } + else { + this.doResponse(res, responseType, 500, err.toString()); + } + } + break; + case 'query': { + this.adapter.log.debug(JSON.stringify(values)); + let dateFrom = Date.now(); + let dateTo = Date.now(); + if (values.dateFrom) { + dateFrom = Date.parse(values.dateFrom); + } + if (values.dateTo) { + dateTo = Date.parse(values.dateTo); + } + const options = { + start: dateFrom, + end: dateTo, + aggregate: values.aggregate || 'onchange', + }; + if (values.count) { + options.count = parseInt(values.count, 10); + } + if (values.step) { + options.step = parseInt(values.step, 10); + } + if (!oId.length || !oId[0]) { + this.doErrorResponse(res, responseType, 422, 'no datapoints given'); + return; + } + const response = []; + for (let b = 0; b < oId.length; b++) { + const element = { + target: oId[b], + datapoints: [], + }; + if (this.config.dataSource && !(values.noHistory && values.noHistory === 'true')) { + this.adapter.log.debug(`Read data from: ${this.config.dataSource}`); + const result = await this.adapter.getHistoryAsync(this.config.dataSource, oId[b], options); + this.adapter.log.debug(`[QUERY] sendTo result = ${JSON.stringify(result)}`); + for (let i = 0; i < result.result.length; i++) { + element.datapoints.push([result.result[i].val, result.result[i].ts]); + } + response[b] = element; + } + else { + this.adapter.log.debug('Read last state'); + const { state } = await this.getState(oId[b], query.user); + if (state) { + element.datapoints = [[state.val, state.ts]]; + } + else { + element.datapoints = [[null, null]]; + } + } + } + this.doResponse(res, responseType, response, query.prettyPrint); + break; + } + case 'annotations': + // ioBroker does not support annotations + this.adapter.log.debug('[ANNOTATIONS]'); + this.doResponse(res, responseType, [], query.prettyPrint); + break; + case 'help': + // is default behaviour too + default: + const _obj = command === 'help' ? {} : { error: `command ${command} unknown` }; + let request = `http${this.settings.secure ? 's' : ''}://${req.headers.host}`; + if (this.app) { + request += `/${this.namespace}/`; + } + let auth = ''; + if (this.settings.auth) { + auth = 'user=UserName&pass=Password'; + } + _obj.getPlainValue = `${request}/getPlainValue/stateID${auth ? `?${auth}` : ''}`; + _obj.get = `${request}/get/stateID/?prettyPrint${auth ? `&${auth}` : ''}`; + _obj.getBulk = `${request}/getBulk/stateID1,stateID2/?prettyPrint${auth ? `&${auth}` : ''}`; + _obj.set = `${request}/set/stateID?value=1&prettyPrint${auth ? `&${auth}` : ''}`; + _obj.toggle = `${request}/toggle/stateID&prettyPrint${auth ? `&${auth}` : ''}`; + _obj.setBulk = `${request}/setBulk?stateID1=0.7&stateID2=0&prettyPrint${auth ? `&${auth}` : ''}`; + _obj.setValueFromBody = `${request}/setValueFromBody?stateID1${auth ? `&${auth}` : ''}`; + _obj.objects = `${request}/objects?pattern=system.adapter.admin.0*&prettyPrint${auth ? `&${auth}` : ''}`; + _obj.states = `${request}/states?pattern=system.adapter.admin.0*&prettyPrint${auth ? `&${auth}` : ''}`; + _obj.search = `${request}/search?pattern=system.adapter.admin.0*&prettyPrint${auth ? `&${auth}` : ''}`; + _obj.query = `${request}/query/stateID1,stateID2/?dateFrom=2019-06-06T12:00:00.000Z&dateTo=2019-06-06T12:00:00.000Z&noHistory=false&aggregate=minmax&count=3000&prettyPrint${auth ? `&${auth}` : ''}`; + this.doResponse(res, responseType, _obj, true); + break; + } + } +} +exports.SimpleAPI = SimpleAPI; +//# sourceMappingURL=SimpleAPI.js.map \ No newline at end of file diff --git a/dist/lib/SimpleAPI.js.map b/dist/lib/SimpleAPI.js.map new file mode 100644 index 0000000..a010da3 --- /dev/null +++ b/dist/lib/SimpleAPI.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SimpleAPI.js","sourceRoot":"","sources":["../../src/lib/SimpleAPI.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/main.d.ts b/dist/main.d.ts new file mode 100644 index 0000000..0b86aa2 --- /dev/null +++ b/dist/main.d.ts @@ -0,0 +1,13 @@ +import { type Request, type Response } from 'express'; +import { Adapter, type AdapterOptions } from '@iobroker/adapter-core'; +import { SimpleApiAdapterConfig } from './types'; +export declare class SimpleApiAdapter extends Adapter { + config: SimpleApiAdapterConfig; + private webServer; + private certificates; + constructor(options?: Partial); + onUnload(callback: () => void): void; + main(): Promise; + requestProcessor: (req: Request, res: Response) => void; + initWebServer(): Promise; +} diff --git a/dist/main.js b/dist/main.js new file mode 100644 index 0000000..105a526 --- /dev/null +++ b/dist/main.js @@ -0,0 +1,197 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SimpleApiAdapter = void 0; +const node_fs_1 = require("node:fs"); +const adapter_core_1 = require("@iobroker/adapter-core"); +const SimpleAPI_1 = require("./lib/SimpleAPI"); +const webserver_1 = require("@iobroker/webserver"); +class SimpleApiAdapter extends adapter_core_1.Adapter { + webServer = { + server: null, + api: null, + }; + certificates; + constructor(options = {}) { + super({ + ...options, + name: 'simple-api', + unload: callback => this.onUnload(callback), + stateChange: (id, state) => { + this.webServer?.api?.stateChange(id, state); + }, + ready: () => this.main(), + objectChange: (id, obj) => { + this.webServer?.api?.objectChange(id, obj); + }, + }); + this.config = this.config; + } + onUnload(callback) { + try { + if (this.webServer.server) { + this.log.info(`terminating http${this.config.secure ? 's' : ''} server on port ${this.config.port}`); + this.webServer.server.close(); + this.webServer.server = null; + } + } + catch { + // ignore + } + if (callback) { + callback(); + } + } + async main() { + this.config = this.config; + if (this.config.webInstance) { + console.log('Adapter runs as a part of web service'); + this.log.warn('Adapter runs as a part of web service'); + return this.setForeignState(`system.adapter.${this.namespace}.alive`, false, true, () => setTimeout(() => (this.terminate ? this.terminate() : process.exit()), 1000)); + } + if (this.config.secure) { + // Load certificates + await new Promise(resolve => this.getCertificates(undefined, undefined, undefined, (err, certificates, leConfig) => { + this.certificates = certificates; + resolve(); + })); + } + await this.initWebServer(); + } + requestProcessor = (req, res) => { + if ((req.url || '').includes('favicon.ico')) { + let stat; + try { + if ((0, node_fs_1.existsSync)(`${__dirname}/../img/favicon.ico`)) { + stat = (0, node_fs_1.statSync)(`${__dirname}/../img/favicon.ico`); + } + } + catch { + // no special handling + } + if (stat) { + res.writeHead(200, { + 'Content-Type': 'image/x-icon', + 'Content-Length': stat.size, + }); + const readStream = (0, node_fs_1.createReadStream)(`${__dirname}/../img/favicon.ico`); + // We replaced all the event handlers with a simple call to readStream.pipe() + readStream.pipe(res); + } + else { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.write('404 Not Found\n'); + res.end(); + } + } + else { + this.webServer.api?.restApi(req, res); + } + }; + async initWebServer() { + this.config.port = parseInt(this.config.port, 10); + if (this.config.port) { + if (this.config.secure && !this.certificates) { + return null; + } + try { + const webserver = new webserver_1.WebServer({ + app: this.requestProcessor, + adapter: this, + secure: this.config.secure, + }); + this.webServer.server = (await webserver.init()); + } + catch (err) { + this.log.error(`Cannot create webserver: ${err}`); + this.terminate + ? this.terminate(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION) + : process.exit(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION); + return; + } + if (!this.webServer.server) { + this.log.error(`Cannot create webserver`); + this.terminate + ? this.terminate(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION) + : process.exit(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION); + return; + } + this.webServer.server.__server = this.webServer; + } + else { + this.log.error('port missing'); + if (this.terminate) { + this.terminate(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION); + } + else { + process.exit(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION); + } + return; + } + if (this.webServer.server) { + let serverListening = false; + let serverPort = this.config.port; + this.webServer.server.on('error', e => { + if (e.toString().includes('EACCES') && serverPort <= 1024) { + this.log.error(`node.js process has no rights to start server on the port ${serverPort}.\n` + + `Do you know that on linux you need special permissions for ports under 1024?\n` + + `You can call in shell following scrip to allow it for node.js: "iobroker fix"`); + } + else { + this.log.error(`Cannot start server on ${this.config.bind || '0.0.0.0'}:${serverPort}: ${e}`); + } + if (!serverListening) { + this.terminate + ? this.terminate(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION) + : process.exit(adapter_core_1.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION); + } + }); + this.getPort(this.config.port, !this.config.bind || this.config.bind === '0.0.0.0' ? undefined : this.config.bind || undefined, port => { + if (port !== this.config.port) { + this.log.error(`port ${this.config.port} already in use`); + if (this.terminate) { + this.terminate(1); + } + else { + process.exit(1); + } + return; + } + serverPort = port; + if (this.webServer.server) { + // create web server + this.webServer.server.listen(port, !this.config.bind || this.config.bind === '0.0.0.0' + ? undefined + : this.config.bind || undefined, () => (serverListening = true)); + this.log.info(`http${this.config.secure ? 's' : ''} server listening on port ${port}`); + } + else { + this.log.error('server initialization failed'); + if (this.terminate) { + this.terminate(1); + } + else { + process.exit(1); + } + } + }); + } + this.webServer.api = new SimpleAPI_1.SimpleAPI(this.webServer.server, this.config, this, { + native: this.config, + _id: `system.adapter.${this.namespace}`, + common: this.common, + type: 'instance', + objects: [], + instanceObjects: [], + }); + } +} +exports.SimpleApiAdapter = SimpleApiAdapter; +if (require.main !== module) { + // Export the constructor in compact mode + module.exports = (options) => new SimpleApiAdapter(options); +} +else { + // otherwise start the instance directly + (() => new SimpleApiAdapter())(); +} +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/main.js.map b/dist/main.js.map new file mode 100644 index 0000000..7dda866 --- /dev/null +++ b/dist/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;AACA,qCAA6E;AAG7E,yDAAkF;AAClF,+CAAyD;AACzD,mDAAgD;AAQhD,MAAa,gBAAiB,SAAQ,sBAAO;IAEjC,SAAS,GAAiB;QAC9B,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;KACZ,CAAC;IACM,YAAY,CAAoC;IAExD,YAAmB,UAAmC,EAAE;QACpD,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3C,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;gBACvB,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YACxB,YAAY,EAAE,CAAC,EAAU,EAAE,GAAuC,EAAQ,EAAE;gBACxE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAgC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,QAAoB;QACzB,IAAI,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,mBAAmB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC;YACjC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,CAAC;QACf,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAgC,CAAC;QAEpD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,eAAe,CAAC,kBAAkB,IAAI,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CACpF,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAC/E,CAAC;QACN,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrB,oBAAoB;YACpB,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAC9B,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAQ,EAAE;gBACxF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;gBACjC,OAAO,EAAE,CAAC;YACd,CAAC,CAAC,CACL,CAAC;QACN,CAAC;QAED,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC;IAED,gBAAgB,GAAG,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;QACrD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC1C,IAAI,IAAuB,CAAC;YAC5B,IAAI,CAAC;gBACD,IAAI,IAAA,oBAAU,EAAC,GAAG,SAAS,qBAAqB,CAAC,EAAE,CAAC;oBAChD,IAAI,GAAG,IAAA,kBAAQ,EAAC,GAAG,SAAS,qBAAqB,CAAC,CAAC;gBACvD,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,sBAAsB;YAC1B,CAAC;YAED,IAAI,IAAI,EAAE,CAAC;gBACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACf,cAAc,EAAE,cAAc;oBAC9B,gBAAgB,EAAE,IAAI,CAAC,IAAI;iBAC9B,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAG,IAAA,0BAAgB,EAAC,GAAG,SAAS,qBAAqB,CAAC,CAAC;gBACvE,6EAA6E;gBAC7E,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC7B,GAAG,CAAC,GAAG,EAAE,CAAC;YACd,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,CAAC,aAAa;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAc,EAAE,EAAE,CAAC,CAAC;QAE5D,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,IAAI,CAAC;gBACD,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC;oBAC5B,GAAG,EAAE,IAAI,CAAC,gBAAmC;oBAC7C,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;iBAC7B,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAwC,CAAC;YAC5F,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,SAAS;oBACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAU,CAAC,6BAA6B,CAAC;oBAC1D,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAU,CAAC,6BAA6B,CAAC,CAAC;gBAC7D,OAAO;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC1C,IAAI,CAAC,SAAS;oBACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAU,CAAC,6BAA6B,CAAC;oBAC1D,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAU,CAAC,6BAA6B,CAAC,CAAC;gBAC7D,OAAO;YACX,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,yBAAU,CAAC,6BAA6B,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,yBAAU,CAAC,6BAA6B,CAAC,CAAC;YAC3D,CAAC;YACD,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACxB,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAElC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;gBAClC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;oBACxD,IAAI,CAAC,GAAG,CAAC,KAAK,CACV,6DAA6D,UAAU,KAAK;wBACxE,gFAAgF;wBAChF,+EAA+E,CACtF,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClG,CAAC;gBACD,IAAI,CAAC,eAAe,EAAE,CAAC;oBACnB,IAAI,CAAC,SAAS;wBACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,yBAAU,CAAC,6BAA6B,CAAC;wBAC1D,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAU,CAAC,6BAA6B,CAAC,CAAC;gBACjE,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CACR,IAAI,CAAC,MAAM,CAAC,IAAI,EAChB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,EAC/F,IAAI,CAAC,EAAE;gBACH,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC;oBAC1D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACjB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACtB,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpB,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,UAAU,GAAG,IAAI,CAAC;gBAElB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;oBACxB,oBAAoB;oBACpB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CACxB,IAAI,EACJ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;wBAC/C,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,EACnC,GAAG,EAAE,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,CACjC,CAAC;oBAEF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;gBAC3F,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBAC/C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACjB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACtB,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpB,CAAC;gBACL,CAAC;YACL,CAAC,CACJ,CAAC;QACN,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;YACzE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,kBAAkB,IAAI,CAAC,SAAS,EAAE;YACvC,MAAM,EAAE,IAAI,CAAC,MAAiC;YAC9C,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE;YACX,eAAe,EAAE,EAAE;SACtB,CAAC,CAAC;IACP,CAAC;CACJ;AA3MD,4CA2MC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,MAAM,CAAC,OAAO,GAAG,CAAC,OAA4C,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACrG,CAAC;KAAM,CAAC;IACJ,wCAAwC;IACxC,CAAC,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC,EAAE,CAAC;AACrC,CAAC"} \ No newline at end of file diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..f6ec9e4 --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,38 @@ +export interface SimpleApiAdapterConfig { + port: number | string; + auth: boolean; + secure: boolean; + bind: string; + certPublic: string; + certPrivate: string; + certChained: string; + defaultUser: string; // without 'system.user.' + onlyAllowWhenUserIsOwner: boolean; + webInstance: string; + leEnabled: boolean; + leUpdate: boolean; + leCheckPort: number | string; + dataSource: string; + allDatapoints: boolean; +} + +declare class ExtAPI { + public waitForReadyTime?: number; + + constructor( + webServer: Server, + settings: { secure: boolean; port: number | string; defaultUser?: string }, + adapter: ioBroker.Adapter, + config?: ioBroker.InstanceObject, + app?: Express, + io?: SocketIO, + ); + + welcomePage?(): LocalMultipleLinkEntry; + fileChange?(id: string, fileName: string, size: number | null): void; + stateChange?(id: string, state: ioBroker.State | null | undefined): void; + objectChange?(id: string, state: ioBroker.Object | null | undefined): void; + /** Give to the extension up to 5 seconds to be loaded */ + waitForReady?(onReady: () => void): void; + unload?(): Promise; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 44462ed..443316a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,5 +26,5 @@ "types": ["@iobroker/types", "node"] }, "include": ["src/**/*.ts", "src/*.d.ts"], - "exclude": ["dist/**", "node_modules/**", "eslint.config.mjs", "www/**/*"] + "exclude": ["dist/**", "node_modules/**", "eslint.config.mjs"] }