{"version":3,"file":"webengine.cjs","sources":["../node_modules/submap/dist/submap.es.js","../src/lib.ts"],"sourcesContent":["var m = Object.defineProperty;\nvar M = (t, s, e) => s in t ? m(t, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : t[s] = e;\nvar g = (t, s, e) => (M(t, typeof s != \"symbol\" ? s + \"\" : s, e), e), W = (t, s, e) => {\n  if (!s.has(t))\n    throw TypeError(\"Cannot \" + e);\n};\nvar u = (t, s, e) => (W(t, s, \"read from private field\"), e ? e.call(t) : s.get(t)), E = (t, s, e) => {\n  if (s.has(t))\n    throw TypeError(\"Cannot add the same private member more than once\");\n  s instanceof WeakSet ? s.add(t) : s.set(t, e);\n}, h = (t, s, e, i) => (W(t, s, \"write to private field\"), i ? i.call(t, e) : s.set(t, e), e);\nclass C {\n  constructor() {\n    g(this, \"subscribers\");\n    g(this, \"subtopics\");\n    g(this, \"subtopics_by_regex\");\n    g(this, \"subtopics_any\");\n    g(this, \"sub_any\");\n    this.subscribers = /* @__PURE__ */ new Set(), this.subtopics = /* @__PURE__ */ new Map(), this.subtopics_by_regex = [], this.sub_any = /* @__PURE__ */ new Set();\n  }\n  isEmpty() {\n    return this.subscribers.size === 0 && this.subtopics.size === 0 && this.subtopics_by_regex.length === 0 && this.subtopics_any === void 0 && this.sub_any.size === 0;\n  }\n}\nvar l, _, f, p, y;\nclass I {\n  constructor() {\n    g(this, \"subscriptions\");\n    g(this, \"subscribed_topics\");\n    E(this, l, void 0);\n    E(this, _, void 0);\n    E(this, f, void 0);\n    E(this, p, void 0);\n    E(this, y, void 0);\n    this.subscriptions = new C(), this.subscribed_topics = /* @__PURE__ */ new Map(), h(this, l, 0), h(this, _, \"/\"), h(this, p, /* @__PURE__ */ new Set([\"?\"])), h(this, y, /* @__PURE__ */ new Set([\"*\"]));\n  }\n  separator(s) {\n    return h(this, _, s), this;\n  }\n  regexPrefix(s) {\n    return h(this, f, s), this;\n  }\n  matchAny(s) {\n    return Array.isArray(s) ? h(this, p, new Set(s)) : h(this, p, /* @__PURE__ */ new Set([s])), this;\n  }\n  wildcard(s) {\n    return Array.isArray(s) ? h(this, y, new Set(s)) : h(this, y, /* @__PURE__ */ new Set([s])), this;\n  }\n  listClients() {\n    return Array.from(this.subscriptions.subscribers);\n  }\n  listTopics(s) {\n    return Array.from(this.subscribed_topics.get(s) || []);\n  }\n  isEmpty() {\n    return this.subscribed_topics.size === 0;\n  }\n  registerClient(s) {\n    return this.subscribed_topics.has(s) ? !1 : (this.subscribed_topics.set(s, /* @__PURE__ */ new Set()), !0);\n  }\n  unregisterClient(s) {\n    const e = this.subscribed_topics.get(s);\n    if (e === void 0)\n      return !1;\n    for (const i of e)\n      d(\n        this.subscriptions,\n        i.split(u(this, _)),\n        0,\n        s,\n        u(this, y),\n        u(this, p),\n        u(this, f)\n      ), h(this, l, u(this, l) - 1);\n    return this.subscribed_topics.delete(s), !0;\n  }\n  subscribe(s, e) {\n    const i = this.subscribed_topics.get(e);\n    return i === void 0 ? !1 : (i.has(s) || (R(\n      this.subscriptions,\n      s.split(u(this, _)),\n      0,\n      e,\n      u(this, y),\n      u(this, p),\n      u(this, f)\n    ), i.add(s), h(this, l, u(this, l) + 1)), !0);\n  }\n  unsubscribe(s, e) {\n    const i = this.subscribed_topics.get(e);\n    return i === void 0 ? !1 : (i.has(s) && (d(\n      this.subscriptions,\n      s.split(u(this, _)),\n      0,\n      e,\n      u(this, y),\n      u(this, p),\n      u(this, f)\n    ), i.delete(s), h(this, l, u(this, l) - 1)), !0);\n  }\n  unsubscribeAll(s) {\n    const e = this.subscribed_topics.get(s);\n    if (e === void 0)\n      return !1;\n    for (const i of e)\n      d(\n        this.subscriptions,\n        i.split(u(this, _)),\n        0,\n        s,\n        u(this, y),\n        u(this, p),\n        u(this, f)\n      );\n    return h(this, l, u(this, l) - e.size), e.clear(), !0;\n  }\n  getSubscribers(s) {\n    const e = /* @__PURE__ */ new Set();\n    return z(\n      this.subscriptions,\n      s.split(u(this, _)),\n      0,\n      u(this, f),\n      e\n    ), e;\n  }\n  isSubscribed(s) {\n    return v(\n      this.subscriptions,\n      s.split(u(this, _)),\n      0,\n      u(this, f)\n    );\n  }\n  subscriptionCount() {\n    return u(this, l);\n  }\n  clientCount() {\n    return this.subscribed_topics.size;\n  }\n}\nl = new WeakMap(), _ = new WeakMap(), f = new WeakMap(), p = new WeakMap(), y = new WeakMap();\nfunction R(t, s, e, i, b, o, c) {\n  if (e < s.length) {\n    const r = s[e];\n    if (b.has(r))\n      t.sub_any.add(i);\n    else if (o.has(r))\n      t.subtopics_any || (t.subtopics_any = new C()), R(\n        t.subtopics_any,\n        s,\n        e + 1,\n        i,\n        b,\n        o,\n        c\n      );\n    else if (c && r.startsWith(c)) {\n      const n = r.slice(c.length);\n      try {\n        const S = new RegExp(n);\n        let a = t.subtopics_by_regex.find(\n          (w) => w.regex.source === S.source\n        );\n        a || (a = {\n          regex: S,\n          sub: new C()\n        }, t.subtopics_by_regex.push(a)), R(\n          a.sub,\n          s,\n          e + 1,\n          i,\n          b,\n          o,\n          c\n        );\n      } catch {\n      }\n    } else\n      t.subtopics.has(r) || t.subtopics.set(r, new C()), R(\n        t.subtopics.get(r),\n        s,\n        e + 1,\n        i,\n        b,\n        o,\n        c\n      );\n  } else\n    t.subscribers.add(i);\n}\nfunction d(t, s, e, i, b, o, c) {\n  if (e < s.length) {\n    const r = s[e];\n    if (b.has(r))\n      t.sub_any.delete(i);\n    else if (o.has(r))\n      t.subtopics_any && (d(\n        t.subtopics_any,\n        s,\n        e + 1,\n        i,\n        b,\n        o,\n        c\n      ), t.subtopics_any.isEmpty() && (t.subtopics_any = void 0));\n    else if (c && r.startsWith(c)) {\n      const n = r.slice(c.length);\n      try {\n        const S = new RegExp(n), a = t.subtopics_by_regex.findIndex(\n          (w) => w.regex.source === S.source\n        );\n        if (a !== -1) {\n          const w = t.subtopics_by_regex[a].sub;\n          d(\n            w,\n            s,\n            e + 1,\n            i,\n            b,\n            o,\n            c\n          ), w.isEmpty() && t.subtopics_by_regex.splice(a, 1);\n        }\n      } catch {\n      }\n    } else {\n      const n = t.subtopics.get(r);\n      n && (d(\n        n,\n        s,\n        e + 1,\n        i,\n        b,\n        o,\n        c\n      ), n.isEmpty() && t.subtopics.delete(r));\n    }\n  } else\n    t.subscribers.delete(i);\n}\nfunction z(t, s, e, i, b) {\n  if (e < s.length) {\n    const o = s[e];\n    for (const c of t.sub_any)\n      b.add(c);\n    if (i && o.startsWith(i)) {\n      const c = o.slice(i.length);\n      try {\n        const r = new RegExp(c);\n        for (const [n, S] of t.subtopics)\n          r.test(n) && z(S, s, e + 1, i, b);\n      } catch {\n      }\n    } else {\n      const c = t.subtopics.get(o);\n      c && z(c, s, e + 1, i, b);\n    }\n    for (const c of t.subtopics_by_regex)\n      c.regex.test(o) && z(c.sub, s, e + 1, i, b);\n    t.subtopics_any && z(\n      t.subtopics_any,\n      s,\n      e + 1,\n      i,\n      b\n    );\n  } else\n    for (const o of t.subscribers)\n      b.add(o);\n}\nfunction v(t, s, e, i) {\n  if (e < s.length) {\n    const b = s[e];\n    if (t.sub_any.size > 0)\n      return !0;\n    if (i && b.startsWith(i)) {\n      const o = b.slice(i.length);\n      try {\n        const c = new RegExp(o);\n        for (const [r, n] of t.subtopics)\n          if (c.test(r) && v(n, s, e + 1, i))\n            return !0;\n      } catch {\n      }\n    } else {\n      const o = t.subtopics.get(b);\n      if (o && v(o, s, e + 1, i))\n        return !0;\n    }\n    for (const o of t.subtopics_by_regex)\n      if (o.regex.test(b) && v(o.sub, s, e + 1, i))\n        return !0;\n    if (t.subtopics_any && v(\n      t.subtopics_any,\n      s,\n      e + 1,\n      i\n    ))\n      return !0;\n  } else if (t.subscribers.size > 0)\n    return !0;\n  return !1;\n}\nexport {\n  I as SubMap\n};\n//# sourceMappingURL=submap.es.js.map\n","const eva_webengine_version = \"0.9.15\";\n\nimport { Logger } from \"bmat/log\";\nimport { cookies } from \"bmat/dom\";\nimport { SubMap } from \"submap\";\n\nconst WILDCARDS = [\"*\", \"#\"];\nconst MATCH_ANY = [\"+\", \"?\"];\n\nconst isMask = (oid: string): boolean => {\n  for (let c of oid) {\n    if (WILDCARDS.includes(c) || MATCH_ANY.includes(c)) {\n      return true;\n    }\n  }\n  return false;\n};\n\nenum SerializationKind {\n  JSON = \"json\",\n  MsgPack = \"msgpack\"\n}\n\nenum EvaErrorKind {\n  NOT_FOUND = -32001,\n  ACCESS_DENIED = -32002,\n  SYSTEM_ERROR = -32003,\n  OTHER = -32004,\n  NOT_READY = -32005,\n  UNSUPPORTED = -32006,\n  CORE_ERROR = -32007,\n  TIMEOUT = -32008,\n  INVALID_DATA = -32009,\n  FUNC_FAILED = -32010,\n  ABORTED = -32011,\n  ALREADY_EXISTS = -32012,\n  BUSY = -32013,\n  METHOD_NOT_IMPLEMENTED = -32014,\n  TOKEN_RESTRICTED = -32015,\n  IO = -32016,\n  REGISTRY = -32017,\n  EVAHI_AUTH_REQUIRED = -32018,\n\n  ACCESS_DENIED_MORE_DATA_REQUIRED = -32022,\n\n  PARSE = -32700,\n  INVALID_REQUEST = -32600,\n  METHOD_NOT_FOUND = -32601,\n  INVALID_PARAMS = -32602,\n  INTERNAL_RPC = -32603,\n\n  BUS_CLIENT_NOT_REGISTERED = -32113,\n  BUS_DATA = -32114,\n  BUS_IO = -32115,\n  BUS_OTHER = -32116,\n  BUS_NOT_SUPPORTED = -32117,\n  BUS_BUSY = -32118,\n  BUS_NOT_DELIVERED = -32119,\n  BUS_TIMEOUT = -32120,\n  BUS_ACCESS = -32121\n}\n\nenum EventKind {\n  HeartbeatSuccess = \"heartbeat.success\",\n  HeartbeatError = \"heartbeat.error\",\n  LoginSuccess = \"login.success\",\n  LoginFailed = \"login.failed\",\n  LoginOTPRequired = \"login.otp_required\",\n  LoginOTPInvalid = \"login.otp_invalid\",\n  LoginOTPSetup = \"login.otp_setup\",\n  WsEvent = \"ws.event\",\n  ServerReload = \"server.reload\",\n  ServerRestart = \"server.restart\",\n  LogRecord = \"log.record\",\n  LogPostProcess = \"log.postprocess\",\n  WASMError = \"wasm.error\"\n}\n\nenum StateProp {\n  Status = \"status\",\n  Value = \"value\",\n  Any = \"any\"\n}\n\nconst GLOBAL_BLOCK_NAME = \".\";\n\nconst ERR_REQUIRE_LOGGED_IN = \"Not logged in\";\n\ninterface EvaConfig {\n  engine?: EvaEngineConfig;\n}\n\ninterface EvaEngineConfig {\n  api_uri?: string;\n  apikey?: string;\n  debug?: boolean | number;\n  login?: string;\n  password?: string;\n  set_auth_cookies?: boolean;\n  state_updates?: boolean | Array<string>;\n  wasm?: boolean | string;\n  ws_mode?: boolean;\n  log_params?: LogParams;\n  interval: { [key in IntervalKind]: number };\n}\n\ninterface OTPParams {\n  size?: number;\n  issuer?: string;\n  user?: string;\n  xtr?: string;\n}\n\ninterface HiQRParams {\n  size?: number;\n  url?: string;\n  user?: string;\n  password?: string;\n}\n\ninterface LogRecord {\n  dt: string;\n  h: string;\n  l: number;\n  lvl: string;\n  mod: string;\n  msg: string;\n  t: number;\n  th: string | null;\n}\n\ninterface WsCommand {\n  m: string;\n  p?: any;\n}\n\ninterface LoginPayload {\n  k?: string;\n  u?: string;\n  p?: string;\n  a?: string;\n  xopts?: object;\n}\n\ninterface SvcMessage {\n  kind: string;\n  svc: string;\n  message?: string;\n  value?: string;\n}\n\ninterface JsonRpcRequest {\n  jsonrpc: string;\n  method: string;\n  params?: object;\n  id: number;\n}\n\ninterface JsonRpcResponse {\n  jsonrpc: string;\n  result?: object;\n  error?: EvaError;\n  id: number;\n}\n\ninterface External {\n  fetch?: any;\n  WebSocket?: any;\n  QRious?: any;\n  msgpack?: any;\n}\n\ninterface ActionResult {\n  elapsed: number;\n  exitcode: number | null;\n  finished: boolean;\n  node: string;\n  oid: string;\n  params: any;\n  priority: number;\n  status: string;\n  svc: string;\n  time: any;\n  uuid: string;\n  out: null | string;\n  err: null | string;\n}\n\ninterface StatePayload {\n  full?: boolean;\n  i?: string | Array<string>;\n}\n\ninterface LvarIncrDecrResult {\n  result: number;\n}\n\ninterface LogParams {\n  level: number;\n  records: number;\n}\n\ninterface ItemState {\n  act?: number;\n  connected?: boolean;\n  enabled?: boolean;\n  ieid?: Array<number>;\n  meta?: object;\n  node?: string;\n  oid?: string;\n  status?: number | null;\n  t?: number;\n  value: any;\n}\n\ninterface Watcher {\n  func: (state: ItemState) => void;\n  prot: boolean;\n}\n\nenum IntervalKind {\n  AjaxReload = \"ajax_reload\",\n  AjaxLogReload = \"log_reload\",\n  ActionWatch = \"action_watch\",\n  Heartbeat = \"heartbeat\",\n  Reload = \"reload\",\n  Restart = \"restart\",\n  WSBufTTL = \"ws_buf_ttl\"\n}\n\nclass EvaError {\n  code: number;\n  message?: string;\n  data?: any;\n  constructor(code: number, message?: string, data?: any) {\n    this.code = code;\n    this.message = message;\n    this.data = data;\n  }\n}\n\nclass EvaBulkRequestPartHandler {\n  fn_ok?: (result: any) => void;\n  fn_err?: (result: any) => void;\n\n  constructor() {}\n  then(fn_ok: (result: any) => void) {\n    this.fn_ok = fn_ok;\n    return this;\n  }\n  catch(fn_err: (err: any) => void) {\n    this.fn_err = fn_err;\n    return this;\n  }\n}\n\nclass EvaBulkRequest {\n  requests: Map<number, EvaBulkRequestPartHandler>;\n  payload: Array<any>;\n  eva: Eva;\n\n  constructor(eva: Eva) {\n    this.requests = new Map<number, EvaBulkRequestPartHandler>();\n    this.payload = [];\n    this.eva = eva;\n  }\n  /**\n   * Prepare API function call for bulk calling\n   *\n   * Calls any available SFA API function\n   *\n   * @param p1 item OID (if required) or API call params\n   * @param p2 extra call params or empty object\n   * @param fn_ok function which is executed on successfull call\n   * @parma fn_err function which is executed on error\n   *\n   * @returns Part handler object\n   */\n  prepare(\n    method: string,\n    p1: string | object,\n    p2?: object\n  ): EvaBulkRequestPartHandler {\n    let params: any;\n    if (typeof p1 === \"string\" || Array.isArray(p1)) {\n      params = p2 || {};\n      params.i = p1;\n    } else {\n      params = p1;\n    }\n    let p = this.eva._prepare_call_params(params);\n    let payload: JsonRpcRequest = this.eva._prepare_api_call(method, p);\n    let req = new EvaBulkRequestPartHandler();\n    this.requests.set(payload.id, req);\n    this.payload.push(payload);\n    return req;\n  }\n  /**\n   * Perform bulk API call\n   */\n  call(): Promise<boolean> {\n    let api_uri = `${this.eva.api_uri}/jrpc`;\n    this.eva._debug(\"call_bulk\", `${api_uri}`);\n    return new Promise((resolve, reject) => {\n      if (this.eva.allow_logged_in_calls_only) {\n        if (!this.eva.logged_in) {\n          throw new EvaError(EvaErrorKind.ACCESS_DENIED, ERR_REQUIRE_LOGGED_IN);\n        }\n      }\n      if (this.payload.length == 0) {\n        resolve(true);\n        return;\n      }\n      this.eva.external\n        .fetch(api_uri, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\"\n          },\n          redirect: \"error\",\n          body: JSON.stringify(this.payload)\n        })\n        .then((response: any) => {\n          if (response.ok) {\n            response\n              .json()\n              .then((data: JsonRpcResponse) => {\n                this.eva._debug(\"call_bulk success\");\n                if (Array.isArray(data)) {\n                  data.forEach((d) => {\n                    if (\n                      typeof d.id === \"undefined\" ||\n                      (typeof d.result === \"undefined\" &&\n                        typeof d.error === \"undefined\")\n                    ) {\n                      reject({\n                        code: -32009,\n                        message: \"Invalid server response\",\n                        data: d\n                      });\n                    } else {\n                      let id = d.id;\n                      let req = this.requests.get(id);\n                      let fn_ok;\n                      let fn_err;\n                      if (req !== undefined) {\n                        fn_ok = req.fn_ok;\n                        fn_err = req.fn_err;\n                      }\n                      if (d.error !== undefined) {\n                        this.eva._debug(\n                          \"call_bulk req\",\n                          `${id} failed: ${d.error.code} (${d.error.message})`\n                        );\n                        if (fn_err) {\n                          fn_err({\n                            code: d.error.code,\n                            message: d.error.message,\n                            data: d\n                          });\n                        }\n                      } else {\n                        if (this.eva.debug == 2) {\n                          this.eva.log.info(\n                            `call_bulk API ${id} ${(req as any).func} response`,\n                            d.result\n                          );\n                        }\n                        if (fn_ok) {\n                          fn_ok(d.result);\n                        }\n                      }\n                    }\n                  });\n                  resolve(true);\n                } else {\n                  let code = EvaErrorKind.INVALID_DATA;\n                  let message = \"Invalid server response (not an array)\";\n                  this.eva._debug(\"call_bulk\", `failed: ${code} (${message})`);\n                  reject(new EvaError(code, message, data));\n                }\n              })\n              .catch((err: any) => {\n                let code = EvaErrorKind.INVALID_DATA;\n                let message = \"Invalid server response\";\n                this.eva._debug(\"call_bulk\", `failed: ${code} (${message})`);\n                reject(new EvaError(code, message, err));\n              });\n          } else {\n            let code = EvaErrorKind.CORE_ERROR;\n            let message = \"Server error\";\n            this.eva._debug(\"call_bulk\", `failed: ${code} (${message})`);\n            reject(new EvaError(code, message));\n          }\n        })\n        .catch((err: any) => {\n          let code = EvaErrorKind.CORE_ERROR;\n          let message = \"Server error\";\n          this.eva._debug(\"call_bulk\", `failed: ${code} (${message})`);\n          reject(new EvaError(code, message, err));\n        });\n    });\n  }\n}\n\nclass Eva_ACTION {\n  eva: Eva;\n\n  constructor(eva: Eva) {\n    this.eva = eva;\n  }\n  /**\n   * Call unit action with value=1\n   *\n   * @param oid {string} unit OID\n   * @param wait {boolean} wait until the action is completed (default: true)\n   */\n  async start(oid: string, wait = true): Promise<ActionResult> {\n    return this.exec(oid, { v: 1 }, wait);\n  }\n  /**\n   * Call unit action with value=0\n   *\n   * @param oid {string} unit OID\n   * @param wait {boolean} wait until the action is completed (default: true)\n   */\n  async stop(oid: string, wait = true): Promise<ActionResult> {\n    return this.exec(oid, { v: 0 }, wait);\n  }\n  /**\n   * Call unit action to toggle its value\n   *\n   * @param oid {string} unit OID\n   * @param wait {boolean} wait until the action is completed (default: true)\n   */\n  async toggle(oid: string, wait = true): Promise<ActionResult> {\n    return this._act(\"action.toggle\", oid, {}, wait);\n  }\n  /**\n   * Call unit action\n   *\n   * @param oid {string} unit OID\n   * @param params {object} action params\n   * @param wait {boolean} wait until the action is completed (default: true)\n   */\n  exec(oid: string, params: object, wait = true) {\n    return this._act(\"action\", oid, params, wait);\n  }\n  /**\n   * Terminate all unit actions\n   *\n   * @param oid {string} unit OID\n   */\n  async kill(oid: string) {\n    await this.eva.call(\"action.kill\", oid);\n  }\n  /**\n   * Terminate a unit action\n   *\n   * @param uuid {string} action uuid\n   */\n  async terminate(uuid: string) {\n    let method = \"action.terminate\";\n    await this.eva.call(method, { u: uuid });\n  }\n  /**\n   * Run lmacro\n   *\n   * @param oid {string} lmacro oid\n   * @param params {object} call params\n   * @param wait {boolean} wait until completed (default: true)\n   */\n  async run(oid: string, params?: object, wait = true): Promise<ActionResult> {\n    return this._act(\"run\", oid, params, wait);\n  }\n  _act(\n    method: string,\n    oid: string,\n    params?: object,\n    wait = false\n  ): Promise<ActionResult> {\n    return new Promise((resolve, reject) => {\n      this.eva\n        .call(method, oid, params)\n        .then((data: ActionResult) => {\n          if (wait === false) {\n            resolve(data);\n          } else {\n            this.eva.watch_action(data.uuid, (res: ActionResult | EvaError) => {\n              if ((res as ActionResult).uuid !== undefined) {\n                if ((res as ActionResult).finished) {\n                  resolve(res as ActionResult);\n                }\n              } else {\n                reject(res);\n              }\n            });\n          }\n        })\n        .catch((err) => {\n          reject(err);\n        });\n    });\n  }\n}\n\nclass Eva_LVAR {\n  eva: Eva;\n\n  constructor(eva: Eva) {\n    this.eva = eva;\n  }\n  /**\n   * Reset lvar (set status to 1)\n   *\n   * @param oid {string} lvar oid\n   */\n  async reset(oid: string) {\n    await this.eva.call(\"lvar.reset\", oid);\n  }\n  /**\n   * Clear lvar (set status to 0)\n   *\n   * @param oid {string} lvar oid\n   */\n  async clear(oid: string) {\n    await this.eva.call(\"lvar.clear\", oid);\n  }\n  /**\n   * Toggle lvar status\n   *\n   * @param oid {string} lvar oid\n   */\n  async toggle(oid: string) {\n    await this.eva.call(\"lvar.toggle\", oid);\n  }\n  /**\n   * Increment lvar value\n   *\n   * @param oid {string} lvar oid\n   *\n   * @returns the new value\n   */\n  async incr(oid: string): Promise<number> {\n    let data = (await this.eva.call(\"lvar.incr\", oid)) as LvarIncrDecrResult;\n    return data.result;\n  }\n  /**\n   * Decrement lvar value\n   *\n   * @param oid {string} lvar oid\n   *\n   * @returns the new value\n   */\n  async decr(oid: string) {\n    let data = (await this.eva.call(\"lvar.decr\", oid)) as LvarIncrDecrResult;\n    return data.result;\n  }\n  /**\n   * Set lvar state\n   *\n   * @param oid {string} lvar oid\n   * @param status {numberr} lvar status\n   * @param value lvar value\n   */\n  async set(oid: string, status?: number, value?: any) {\n    let params: any = {};\n    if (status !== undefined) {\n      params.status = status;\n    }\n    if (value !== undefined) {\n      params.value = value;\n    }\n    if (Object.keys(params).length) {\n      await this.eva.call(\"lvar.set\", oid, params);\n    }\n  }\n  /**\n   * Set lvar status\n   *\n   * @param oid {string} lvar oid\n   * @param status {number} lvar status\n   */\n  async set_status(oid: string, status: number) {\n    await this.set(oid, status);\n  }\n  /**\n   * Set lvar value\n   *\n   * @param oid {string} lvar oid\n   * @param value lvar value\n   */\n  async set_value(oid: string, value: any) {\n    await this.set(oid, (value = value));\n  }\n\n  /**\n   * Get lvar expiration time left\n   *\n   * @param lvar_oid {string} lvar OID\n   *\n   * @returns seconds to expiration, -1 if expired, -2 if stopped\n   */\n  expires(lvar_oid: string): number | null | undefined {\n    // get item state\n    let state = this.eva.state(lvar_oid) as ItemState;\n    // if no such item\n    if (state === undefined || state.t === undefined) return undefined;\n    // if item has no expiration or expiration is set to zero\n    if (\n      !state.meta ||\n      (state.meta as any).expires === undefined ||\n      (state.meta as any).expires == 0\n    ) {\n      return null;\n    }\n    // if timer is disabled (stopped), return -2\n    if (state.status == 0) return -2;\n    // if timer is expired, return -1\n    if (state.status == -1) return -1;\n    let t =\n      (state.meta as any).expires -\n      new Date().getTime() / 1000 +\n      this.eva.tsdiff +\n      state.t;\n    if (t < 0) t = 0;\n    return t;\n  }\n}\n\n/**\n * Binary stream parameters\n */\ninterface EvaStreamParameters {\n  /**\n   * OID the data is streamed from\n   */\n  oid: string;\n  /**\n   * Name of the stream, used for identification, unique\n   */\n  name: string;\n  /**\n   * On start callback\n   */\n  onStart?: () => void;\n  /**\n   * On data callback\n   */\n  onData?: (data: ArrayBuffer) => void;\n  /**\n   * On error callback\n   */\n  onError?: (err: EvaError) => void;\n  /**\n   * On end of stream callback, the stream is not closed and may receive more\n   * data, but the handler must be prepared certain stream parameters may\n   * change\n   */\n  onEOS?: () => void;\n}\n\nclass _EvaStream {\n  oid: string;\n  eva: Eva;\n  name: string;\n  ws: WebSocket | null;\n  onStart: () => void;\n  onData: (data: ArrayBuffer) => void;\n  onError: (err: EvaError) => void;\n  onEOS: () => void;\n  constructor(oid: string, name: string, eva: Eva) {\n    this.oid = oid;\n    this.name = name;\n    this.eva = eva;\n    this.ws = null;\n    this.onStart = () => {};\n    this.onData = (_data: ArrayBuffer) => {};\n    this.onError = (err: EvaError) => {\n      this.eva.log.error(`Stream ${this.name} error`, err);\n    };\n    this.onEOS = () => {};\n  }\n  _restart() {\n    this._stop();\n    this._start();\n  }\n  _start() {\n    if (!this.eva.ws_mode) {\n      this.onError(\n        new EvaError(\n          EvaErrorKind.UNSUPPORTED,\n          \"WebSocket mode is disabled in EVA ICS WebEngine\"\n        )\n      );\n      return;\n    }\n    if (!this.eva.api_token) {\n      this.onError(new EvaError(EvaErrorKind.ACCESS_DENIED, \"Not logged in\"));\n      return;\n    }\n    let ws_uri = this.eva._get_ws_uri();\n    ws_uri += `k=${this.eva.api_token}`;\n    const ws = new this.eva.external.WebSocket(ws_uri);\n    ws.binaryType = \"arraybuffer\";\n    ws.onerror = (evt: Event) => {\n      this.onError(\n        new EvaError(EvaErrorKind.FUNC_FAILED, `WebSocket error: ${evt.type}`)\n      );\n      this._stop();\n    };\n    ws.onmessage = (evt: MessageEvent<any>) => {\n      if (typeof evt.data === \"string\") {\n        let data = JSON.parse(evt.data);\n        if (data.s !== \"stream\") {\n          return;\n        }\n        switch (data.d) {\n          case \"start\":\n            this.onStart();\n            break;\n          case \"eos\":\n            this.onEOS();\n            break;\n          case \"forbidden\":\n            this.onError(\n              new EvaError(\n                EvaErrorKind.ACCESS_DENIED,\n                `Stream ${this.name} access denied (${this.oid})`\n              )\n            );\n            this._stop();\n            break;\n          default:\n            break;\n        }\n      } else {\n        this.onData(evt.data);\n      }\n    };\n    ws.onclose = () => {\n      this._stop();\n    };\n    ws.addEventListener(\"open\", () => {\n      let payload = { m: \"stream.start\", p: { i: this.oid } };\n      ws.send(JSON.stringify(payload));\n      ws.send(\"\");\n    });\n    this.ws = ws;\n  }\n  _stop() {\n    const ws = this.ws;\n    if (ws) {\n      try {\n        ws.onclose = null;\n        ws.onmessage = () => {};\n        ws.onerror = () => {};\n        ws.close();\n      } catch (err) {\n        // web socket may be still open, will close later\n        setTimeout(() => {\n          try {\n            ws?.close();\n          } catch (err) {}\n        }, 100);\n      }\n    }\n  }\n}\n\nclass _EvaStateBlock {\n  state_updates: boolean | Array<string>;\n  eva: Eva;\n  name: string;\n  _ajax_reloader: any;\n  constructor(\n    name: string,\n    state_updates: boolean | Array<string>,\n    engine: Eva\n  ) {\n    this.name = name;\n    this.state_updates = state_updates;\n    this.eva = engine;\n  }\n  _start() {\n    if (this.eva.ws_mode) {\n      this.eva._start_ws(this.state_updates, this.name);\n    }\n    this.eva._load_states(this.state_updates, this.name).then(() => {\n      if (this.eva.ws_mode) {\n        const reload = this.eva._intervals.get(IntervalKind.Reload) as number;\n        if (reload) {\n          this._ajax_reloader = setInterval(() => {\n            if (!this.eva.logged_in) {\n              this._stop();\n              return;\n            }\n            this.eva._load_states(this.state_updates, this.name);\n          }, reload * 1000);\n        }\n      } else {\n        this._ajax_reloader = setInterval(\n          () => {\n            this.eva._load_states(this.state_updates, this.name);\n          },\n          this.eva._intervals.get(IntervalKind.AjaxReload) as number\n        );\n      }\n    });\n  }\n  _restart() {\n    this._stop();\n    this._start();\n  }\n  _stop() {\n    if (this._ajax_reloader) {\n      clearInterval(this._ajax_reloader);\n    }\n    let ws = this.eva.ws.get(this.name);\n    if (ws) {\n      this.eva.ws.delete(this.name);\n      try {\n        ws.onclose = null;\n        ws.onerror = function () {};\n        ws.close();\n      } catch (err) {\n        // web socket may be still open, will close later\n        setTimeout(() => {\n          try {\n            ws?.close();\n          } catch (err) {}\n        }, 100);\n      }\n    }\n  }\n}\n\nenum TokenMode {\n  Normal = \"normal\",\n  ReadOnly = \"readonly\"\n}\n\nenum SessionAuthKind {\n  Token = \"token\",\n  Key = \"key\",\n  // returned for \"login\" method only, after switched to \"token\"\n  Login = \"login\",\n  No = \"unauthorized\"\n}\n\ninterface SessionACI {\n  acl: string;\n  auth: SessionAuthKind;\n  auth_svc: string;\n  token_mode: TokenMode;\n  u: string;\n}\n\ninterface ACLProp {\n  items: Array<string>;\n  pvt: Array<string>;\n  rpvt: Array<string>;\n}\n\nenum ACLOp {\n  Log = \"log\",\n  Developer = \"developer\",\n  Moderator = \"moderator\",\n  Supervisor = \"supervisor\"\n}\n\ninterface SessionACL {\n  admin?: boolean;\n  deny_read: ACLProp;\n  deny_write: ACLProp;\n  from: Array<string>;\n  id: string;\n  meta: { [key: string]: Array<any> };\n  ops: Array<ACLOp>;\n  read: ACLProp;\n  write: ACLProp;\n}\n\ninterface ServerInfo {\n  aci: SessionACI;\n  acl: SessionACL;\n  build: number;\n  ok: boolean;\n  hmi_svc_id: string;\n  num_cpus: number;\n  product_code: string;\n  product_name: string;\n  system_name: string;\n  time: number;\n  uptime: number;\n  version: string;\n}\n\nenum LoginState {\n  Active = \"active\",\n  Starting = \"starting\",\n  Stopping = \"stopping\",\n  Inactive = \"inactive\",\n  Failed = \"failed\",\n  OTPRequired = \"otp.required\",\n  OTPInvalid = \"otp.invalid\",\n  OTPSetup = \"otp.setup\"\n}\n\ninterface SessionState {\n  login: LoginState;\n  error: EvaError | null;\n  otp: string | null;\n}\n\n/**\n * The default session state\n */\nconst defaultSessionState = (): SessionState => {\n  return {\n    login: LoginState.Inactive,\n    error: null,\n    otp: null\n  };\n};\n\ntype EventHandler = (topic: string, event: any) => void;\n\nenum EventTopic {\n  ItemState = \"ST\",\n  Server = \"SERVER\",\n  Supervisor = \"SUPERVISOR\",\n  WeSession = \"WE/SESSION\",\n  WeItemState = \"WE/ST\"\n}\n\n// Topics\n//\n// ST/OID (as path)\n// SERVER = server info\n// SERVER/# server events (e.g. SERVER/RELOAD)\n// SUPERVISOR/# supervisor events\n// WE/SESSION = SessionState\n// WE/ST (state updates)\n// WE/ST/BLOCK (state updates on init, null on delete)\n// WE/ST/BLOCK/OID (internal block state)\n\nclass Eva {\n  action: Eva_ACTION;\n  lvar: Eva_LVAR;\n  api_uri: string;\n  ws_uri: string;\n  #apikey: string;\n  api_token: string;\n  //api_version: number | null;\n  authorized_user: string | null;\n  clear_unavailable: boolean;\n  debug: boolean | number;\n  allow_logged_in_calls_only: boolean;\n  external: External;\n  evajw: any;\n  in_evaHI: boolean;\n  log_params: LogParams;\n  log: Logger;\n  logged_in: boolean;\n  login: string;\n  login_xopts: object | null;\n  log_level_names: Map<number, string>;\n  #password: string;\n  set_auth_cookies: boolean;\n  state_updates: boolean | Array<string>;\n  tsdiff: number;\n  version: string;\n  wasm: boolean | string;\n  ws_mode: boolean;\n  server_info: ServerInfo | null;\n  ignore_password_set_on_next_login: boolean;\n  _event_map: SubMap<EventHandler> | null;\n  _api_call_id: number;\n  _handlers: Map<EventKind, (...args: any[]) => void | boolean>;\n  _intervals: Map<IntervalKind, number>;\n  _ws_handler_registered: boolean;\n  _heartbeat_reloader: any;\n  _ajax_reloader: any;\n  _log_reloader: any;\n  _scheduled_restarter: any;\n  _states: Map<string, Map<string, ItemState>>;\n  _blocks: Map<string, _EvaStateBlock>;\n  _streams: Map<string, _EvaStream>;\n  _last_ping: Map<string, number | null>;\n  _last_pong: Map<string, number | null>;\n  ws: Map<string, WebSocket>;\n  _action_states: Map<string, ActionResult>;\n  _action_watch_functions: Map<\n    String,\n    Array<(result: ActionResult | EvaError) => void>\n  >;\n  _log_subscribed: boolean;\n  _log_started: boolean;\n  _log_first_load: boolean;\n  _log_loaded: boolean;\n  _update_state_functions: Map<string, Array<Watcher>>;\n  _update_state_mask_functions: Map<string, Array<Watcher>>;\n  _lr2p: Array<LogRecord>;\n\n  constructor() {\n    this.version = eva_webengine_version;\n    this.log = new Logger();\n    this.login = \"\";\n    this.#password = \"\";\n    this.login_xopts = null;\n    this.#apikey = \"\";\n    this.api_uri = \"\";\n    this.ws_uri = \"/ws\";\n    this.set_auth_cookies = true;\n    this.api_token = \"\";\n    this.authorized_user = null;\n    this.logged_in = false;\n    this.ignore_password_set_on_next_login = false;\n    this.debug = false;\n    this.allow_logged_in_calls_only = false;\n    this.state_updates = true;\n    this.wasm = false;\n    this.clear_unavailable = false;\n    this._ws_handler_registered = false;\n    this.ws_mode = true;\n    this.ws = new Map();\n    //this.api_version = null;\n    this._api_call_id = 0;\n    this.tsdiff = 0;\n    this._last_ping = new Map();\n    this._last_ping.set(GLOBAL_BLOCK_NAME, null);\n    this._last_pong = new Map();\n    this._last_pong.set(GLOBAL_BLOCK_NAME, null);\n    this._streams = new Map();\n    this._log_subscribed = false;\n    this._log_started = false;\n    this._log_first_load = false;\n    this._log_loaded = false;\n    this._lr2p = [];\n    this._event_map = null;\n    this.in_evaHI =\n      typeof navigator !== \"undefined\" &&\n      typeof navigator.userAgent === \"string\" &&\n      navigator.userAgent.startsWith(\"evaHI \");\n    this.log_params = {\n      level: 20,\n      records: 200\n    };\n    this._update_state_functions = new Map();\n    this._update_state_mask_functions = new Map();\n    this._handlers = new Map();\n    this._handlers.set(EventKind.HeartbeatError, this.restart);\n    this._handlers.set(EventKind.WASMError, (e) => {\n      this.log.error(e);\n      this._critical(\"WASM load error\", true, true);\n    });\n    this._states = new Map();\n    this._states.set(GLOBAL_BLOCK_NAME, new Map());\n    this._blocks = new Map();\n    this._intervals = new Map([\n      [IntervalKind.AjaxReload, 2],\n      [IntervalKind.AjaxLogReload, 2],\n      [IntervalKind.ActionWatch, 0.5],\n      [IntervalKind.Heartbeat, 5],\n      [IntervalKind.Reload, 5],\n      [IntervalKind.Restart, 1],\n      [IntervalKind.WSBufTTL, 0]\n    ]);\n    this.log_level_names = new Map([\n      [10, \"DEBUG\"],\n      [20, \"INFO\"],\n      [30, \"WARNING\"],\n      [40, \"ERROR\"],\n      [50, \"CRITICAL\"]\n    ]);\n    this._heartbeat_reloader = null;\n    this._ajax_reloader = null;\n    this._log_reloader = null;\n    this._scheduled_restarter = null;\n    this._action_watch_functions = new Map();\n    this._action_states = new Map();\n    this._clear();\n    this._clear_watchers();\n    this.action = new Eva_ACTION(this);\n    this.lvar = new Eva_LVAR(this);\n    this.evajw = null;\n    this.external = {};\n    this.server_info = null;\n    if (typeof window !== \"undefined\") {\n      if (typeof window.fetch !== \"undefined\") {\n        this.external.fetch = window.fetch.bind(window);\n      }\n    } else if (typeof fetch !== \"undefined\") {\n      this.external.fetch = fetch;\n    } else {\n      this.external.fetch = null;\n    }\n    if (typeof WebSocket !== \"undefined\") {\n      this.external.WebSocket = WebSocket;\n    } else {\n      this.external.WebSocket = null;\n    }\n    if (\n      typeof window !== \"undefined\" &&\n      typeof (window as any).QRious !== \"undefined\"\n    ) {\n      this.external.QRious = (window as any).QRious;\n    } else {\n      this.external.QRious = null;\n    }\n  }\n\n  // wasm override\n  /**\n   * Enables pub/sub event map. Usually not required to be called manually, as\n   * called automatically as soon as there is a subscription performed.\n   */\n  enable_event_map() {\n    if (this._event_map === null) {\n      this._event_map = (new SubMap() as SubMap<EventHandler>)\n        .matchAny(MATCH_ANY)\n        .wildcard(WILDCARDS)\n        .regexPrefix(\"r~\")\n        .separator(\"/\");\n    }\n  }\n\n  // wasm override\n  /**\n   * Subscribe to an event topic\n   *\n   * @param topic {string} event topic\n   * @param fn {EventHandler} event handler\n   *\n   * @returns true if subscription was successful\n   */\n  subscribe_event_topic(topic: string, fn: EventHandler): boolean {\n    this.enable_event_map();\n    this._event_map!.registerClient(fn);\n    this._event_map!.subscribe(topic, fn);\n    return true;\n  }\n\n  // wasm override\n  /**\n   * Subscribe to multiple event topics\n   *\n   * @param topics {Array<string>} event topics\n   * @param fn {EventHandler} event handler\n   * @returns true if subscription was successful\n   */\n  subscribe_event_topics(topics: Array<string>, fn: EventHandler): boolean {\n    this.enable_event_map();\n    this._event_map!.registerClient(fn);\n    for (let topic of topics) {\n      this._event_map!.subscribe(topic, fn);\n    }\n    return true;\n  }\n\n  // wasm override\n  /**\n   * Unsubscribe from an event topic\n   *\n   * @param topic {string} event topic\n   * @param fn {EventHandler} event handler\n   */\n  unsubscribe_event_topic(topic: string, fn: EventHandler) {\n    this._event_map?.unsubscribe(topic, fn);\n  }\n\n  // wasm override\n  /**\n   * Unsubscribe from multiple event topics\n   *\n   * @param topics {Array<string>} event topics\n   * @param fn {EventHandler} event handler\n   */\n  unsubscribe_event_topics(topics: Array<string>, fn: EventHandler) {\n    for (let topic of topics) {\n      this._event_map?.unsubscribe(topic, fn);\n    }\n  }\n\n  // wasm override\n  /**\n   * Unsubscribe from all event topics\n   *\n   * @param fn {EventHandler} event handler\n   */\n  unsubscribe_all_event_topics(fn: EventHandler) {\n    this._event_map?.unsubscribeAll(fn);\n    this._event_map?.unregisterClient(fn);\n  }\n\n  // WASM override\n  _push_event_topic(topic: string, data: any) {\n    if (this._event_map) {\n      const clients = this._event_map.getSubscribers(topic);\n      for (const client of clients) {\n        client(topic, data);\n      }\n    }\n  }\n\n  /**\n   * Set engine login credentials\n   *\n   * @param login {string|null} login\n   * @param password {string|null} password\n   */\n  set_login_password(login?: string | null, password?: string | null) {\n    this.login = login || \"\";\n    this.#password = password || \"\";\n    this.#apikey = \"\";\n  }\n\n  /**\n   * Set/clear engine API key\n   *\n   * @param apikey {string | null} API key\n   */\n  set_api_key(apikey?: string | null) {\n    this.#apikey = apikey || \"\";\n    this.login = \"\";\n    this.#password = \"\";\n  }\n\n  /**\n   * Is engine password set\n   *\n   * @returns true if password is set\n   */\n  is_password_set() {\n    return this.#password !== \"\";\n  }\n\n  /**\n   * Is engine authentication set\n   *\n   * @returns true if auth is set\n   */\n  is_auth_set(): boolean {\n    return this.#apikey !== \"\" || (this.login !== \"\" && this.#password !== \"\");\n  }\n\n  /**\n   * Clear engine authenication credentials\n   */\n  clear_auth() {\n    this.login = \"\";\n    this.#password = \"\";\n    this.#apikey = \"\";\n  }\n\n  /**\n   * Start a binary stream\n   *\n   * @param params {EvaStreamParameters} stream parameters\n   */\n  start_stream(params: EvaStreamParameters) {\n    const old_stream = this._streams.get(params.oid);\n    if (old_stream) {\n      old_stream._stop();\n    }\n    const stream = new _EvaStream(params.oid, params.name, this);\n    if (params.onStart) {\n      stream.onStart = params.onStart;\n    }\n    if (params.onData) {\n      stream.onData = params.onData;\n    }\n    if (params.onError) {\n      stream.onError = params.onError;\n    }\n    if (params.onEOS) {\n      stream.onEOS = params.onEOS;\n    }\n    this._streams.set(params.name, stream);\n    stream._start();\n  }\n\n  /**\n   * Stop a binary stream\n   *\n   * @param name {string} stream name\n   */\n  stop_stream(name: string) {\n    let stream = this._streams.get(name);\n    if (stream) {\n      stream._stop();\n      this._streams.delete(name);\n    }\n  }\n\n  /**\n   * Register a state block\n   *\n   * @param name {string} block name\n   * @param state_updates {boolean | Array<string>} state updates\n   */\n  register_state_block(name: string, state_updates: boolean | Array<string>) {\n    if (name == GLOBAL_BLOCK_NAME) {\n      throw new EvaError(\n        EvaErrorKind.INVALID_PARAMS,\n        `WebEngine state block name ${GLOBAL_BLOCK_NAME} is reserved`\n      );\n    }\n    check_state_updates(state_updates);\n    let old_block = this._blocks.get(name);\n    if (old_block) {\n      console.error(\n        `WebEngine state block ${name} has been already registered, removing the old instance`\n      );\n      old_block._stop();\n    }\n    let block = new _EvaStateBlock(name, state_updates, this);\n    if (this.logged_in) {\n      block._start();\n    }\n    this._blocks.set(name, block);\n    this._init_block(name);\n    this._push_event_topic(`${EventTopic.WeItemState}/${name}`, state_updates);\n  }\n\n  /**\n   * Unregister a state block\n   *\n   * @param name {string} block name\n   */\n  unregister_state_block(name: string) {\n    let block = this._blocks.get(name);\n    if (block) {\n      block._stop();\n      this._delete_block(name);\n      this._blocks.delete(name);\n      this._push_event_topic(`${EventTopic.WeItemState}/${name}`, null);\n    }\n  }\n\n  /**\n   * Unregister all state blocks\n   */\n  unregister_all_state_blocks() {\n    for (let [name, block] of this._blocks) {\n      block._stop();\n      this._delete_block(name);\n      this._push_event_topic(`${EventTopic.WeItemState}/${name}`, null);\n    }\n    this._blocks.clear();\n  }\n\n  bulk_request(): EvaBulkRequest {\n    return new EvaBulkRequest(this);\n  }\n\n  // WASM override\n  /**\n   * Get engine mode\n   \n   * @returns \"js\" or \"wasm\"\n   */\n  get_mode(): string {\n    return \"js\";\n  }\n\n  /**\n   * Start the engine\n   *\n   * After calling the function authenticates user, opens a WebSocket (in\n   * case of WS mode) or schedule AJAXs refresh interval.\n   */\n  start() {\n    this._cancel_scheduled_restart();\n    this._debug(\"EVA ICS WebEngine\", `version: ${this.version}`);\n    if (typeof fetch === \"undefined\") {\n      this.log.error(\n        '\"fetch\" function is unavailable. Upgrade your web browser or ' +\n          \"connect polyfill\"\n      );\n      return;\n    }\n    if (this.logged_in) {\n      this._debug(\"start\", \"already logged in\");\n      return;\n    }\n    if (this.wasm && !this.evajw) {\n      this._start_evajw();\n    } else {\n      this._start_engine();\n    }\n  }\n  _start_engine() {\n    this._push_event_topic(EventTopic.WeSession, {\n      login: LoginState.Starting,\n      error: null,\n      otp: null\n    });\n    this._clear_last_pings();\n    let q: LoginPayload = {};\n    if (this.#apikey) {\n      q = { k: this.#apikey };\n      if (this.login_xopts) {\n        q.xopts = this.login_xopts;\n      }\n      this._debug(\"start\", \"logging in with API key\");\n    } else if (this.api_token) {\n      q = { a: this.api_token };\n      this._debug(\"start\", \"logging in with existing auth token\");\n    } else if (this.#password && !this.ignore_password_set_on_next_login) {\n      q = { u: this.login, p: this.#password };\n      if (this.api_token) {\n        q.a = this.api_token;\n      }\n      if (this.login_xopts) {\n        q.xopts = this.login_xopts;\n      }\n      this._debug(\"start\", \"logging in with password\");\n    } else if (this.set_auth_cookies) {\n      let token = cookies.read(\"auth\");\n      if (token) {\n        q = { a: token };\n        this._debug(\"start\", \"logging in with cookie-cached auth token\");\n      }\n    }\n    if (Object.keys(q).length === 0) {\n      this._debug(\"start\", \"logging in without credentials\");\n    }\n    let user: string;\n    this.ignore_password_set_on_next_login = false;\n    this._api_call(\"login\", q)\n      .then((data) => {\n        this.api_token = data.token;\n        user = data.user;\n        this._set_token_cookie();\n        //if (!this.api_version) {\n        //if (data.api_version) {\n        //this.api_version = data.api_version;\n        //} else {\n        //this.api_version = 4;\n        //}\n        //}\n        //if (this.evajw) {\n        //this.evajw.set_api_version(data.api_version || 4);\n        //}\n        return Promise.all([\n          this._load_states(this.state_updates, GLOBAL_BLOCK_NAME),\n          this._heartbeat(true),\n          this._start_ws(this.state_updates, GLOBAL_BLOCK_NAME)\n        ]);\n      })\n      .then(() => {\n        if (!this.ws_mode) {\n          if (this._ajax_reloader) {\n            clearInterval(this._ajax_reloader);\n          }\n          this._ajax_reloader = setInterval(\n            () => {\n              this._load_states(this.state_updates, GLOBAL_BLOCK_NAME).catch(\n                () => {}\n              );\n            },\n            (this._intervals.get(IntervalKind.AjaxReload) as number) * 1000\n          );\n        } else {\n          if (this._ajax_reloader) {\n            clearInterval(this._ajax_reloader);\n          }\n          let reload = this._intervals.get(IntervalKind.Reload) as number;\n          if (reload) {\n            this._ajax_reloader = setInterval(() => {\n              this._load_states(this.state_updates, GLOBAL_BLOCK_NAME).catch(\n                () => {}\n              );\n            }, reload * 1000);\n          }\n        }\n        if (this._heartbeat_reloader) {\n          clearInterval(this._heartbeat_reloader);\n        }\n        this._heartbeat_reloader = setInterval(\n          () => {\n            this._heartbeat(false).catch(() => {});\n          },\n          (this._intervals.get(IntervalKind.Heartbeat) as number) * 1000\n        );\n        this._debug(\"start\", `login successful, user: ${user}`);\n        this.logged_in = true;\n        this.authorized_user = user;\n        this._invoke_handler(EventKind.LoginSuccess);\n        this._push_event_topic(EventTopic.WeSession, {\n          login: LoginState.Active,\n          error: null,\n          otp: null\n        });\n        for (let [_, block] of this._blocks) {\n          block._restart();\n        }\n      })\n      .catch((err) => {\n        this._debug(\"start\", err);\n        this.logged_in = false;\n        if (err?.code === undefined) {\n          err = new EvaError(EvaErrorKind.OTHER, \"Unknown error\");\n        }\n        this._debug(\"start\", `login failed: ${err.code} (${err.message})`);\n        this._stop_engine();\n        if (\n          err.code != EvaErrorKind.CORE_ERROR ||\n          err.message != \"Server error\"\n        ) {\n          this.erase_token_cookie();\n        }\n        this.error_handler(err, \"login\");\n      });\n    return true;\n  }\n\n  /**\n   * Get system name\n   *\n   * @returns the system name or null if the engine is not logged in\n   */\n  system_name() {\n    if (this.server_info) {\n      return this.server_info.system_name;\n    } else {\n      return null;\n    }\n  }\n  /**\n   * Sleep the number of seconds\n   *\n   * @param sec {number} seconds to sleep\n   */\n  async sleep(sec: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, sec * 1000));\n  }\n\n  /**\n   * Start log processing\n   *\n   * Starts log processing. The engine must be already logged in.\n   *\n   * @param log_level {number} log processing level (optional)\n   */\n  log_start(log_level?: number) {\n    this._log_started = true;\n    if (log_level !== undefined) {\n      this.log_params.level = log_level;\n    }\n    if (!this.ws_mode || this._log_first_load) {\n      this._log_loaded = false;\n      this._load_log_entries(true);\n      if (!this.ws_mode) {\n        this._log_reloader = setInterval(\n          () => {\n            this._load_log_entries(false);\n          },\n          (this._intervals.get(IntervalKind.AjaxLogReload) as number) * 1000\n        );\n      }\n    }\n  }\n\n  /**\n   * Set state updates without restart required\n   *\n   * @param state_updates {boolean} true/false or a string array\n   * @param clear_existing {boolean} clear existing states\n   *\n   */\n  async set_state_updates(\n    state_updates: Array<string> | boolean,\n    clear_existing?: boolean\n  ) {\n    check_state_updates(state_updates);\n    this.state_updates = state_updates;\n    this._push_event_topic(EventTopic.WeItemState, state_updates);\n    let ws = this.ws.get(GLOBAL_BLOCK_NAME);\n    if (ws && ws.readyState === 1) {\n      let st: WsCommand = { m: \"unsubscribe.state\" };\n      ws.send(JSON.stringify(st));\n      ws.send(\"\");\n      if (this.state_updates) {\n        let st: WsCommand = { m: \"subscribe.state\" };\n        let masks;\n        if (this.state_updates == true) {\n          masks = [\"#\"];\n        } else {\n          masks = this.state_updates;\n        }\n        st.p = masks;\n        ws.send(JSON.stringify(st));\n        ws.send(\"\");\n      }\n    }\n    if (clear_existing) {\n      this._clear_states(GLOBAL_BLOCK_NAME);\n    }\n    await this._load_states(this.state_updates, GLOBAL_BLOCK_NAME);\n  }\n\n  /**\n   * Change log processing level\n   *\n   * @param log_level {number} log processing level\n   */\n  set_log_level(log_level: number) {\n    this.log_params.level = log_level;\n    this._set_ws_log_level(log_level);\n    this._load_log_entries(true);\n  }\n\n  /**\n   * Restart the engine\n   *\n   * e.g. used on heartbeat error or if subscription parameters are changed\n   */\n  restart() {\n    this._cancel_scheduled_restart();\n    this._debug(\"restart\", \"performing restart\");\n    this.stop(true, true)\n      .then(() => {\n        this._schedule_restart();\n      })\n      .catch(() => {\n        this._schedule_restart();\n      });\n  }\n\n  /**\n   * Erase auth token cookie\n   *\n   * It is recommended to call this function when login form is displayed to\n   * prevent old token caching\n   */\n  erase_token_cookie() {\n    this.api_token = \"\";\n    this.authorized_user = null;\n    this._set_token_cookie();\n  }\n\n  /**\n   * Load JSON configuration\n   *\n   * @param config_path {string} config path (default: config.json)\n   *\n   * @returns Promise object\n   */\n  load_config(config_path?: string): Promise<EvaConfig> {\n    return new Promise((resolve, reject) => {\n      const cpath = config_path || \"config.json\";\n      this.log.debug(\"Eva::load_config\", `loading configuration from ${cpath}`);\n      this.external\n        .fetch(cpath)\n        .then((res: any) => res.json())\n        .then((config: EvaConfig) => {\n          this.apply_config(config);\n          resolve(config);\n        })\n        .catch((err: any) => reject(err));\n    });\n  }\n\n  /**\n   * Apply configuration from an object\n   *\n   * @param config {object} configuration object\n   */\n  apply_config(config: EvaConfig) {\n    const ec = config.engine;\n    if (ec) {\n      if (ec.api_uri) this.api_uri = ec.api_uri;\n      if (ec.apikey) this.#apikey = ec.apikey;\n      if (ec.debug !== undefined) this.debug = ec.debug;\n      if (ec.login) this.login = ec.login;\n      if (ec.password) this.#password = ec.password;\n      if (ec.set_auth_cookies !== undefined)\n        this.set_auth_cookies = ec.set_auth_cookies;\n      if (ec.state_updates !== undefined) {\n        this.state_updates = ec.state_updates;\n        this._push_event_topic(EventTopic.WeItemState, this.state_updates);\n      }\n      if (ec.wasm !== undefined) this.wasm = ec.wasm;\n      if (ec.ws_mode !== undefined) this.ws_mode = ec.ws_mode;\n      if (ec.log_params) this.log_params = ec.log_params;\n      if (ec.interval) {\n        Object.keys(ec.interval).forEach((k) => {\n          const key = k as IntervalKind;\n          this.set_interval(key, ec.interval[key]);\n        });\n      }\n    }\n  }\n\n  /**\n   * Calls any available API function\n   *\n   * @param {Object} options - The options for the API call.\n   * @param {string} options.method - The API method to call.\n   * @param {object|string|string[]} [options.params] - Parameters to pass to the API method.\n   * @param {SerializationKind} [options.serialization_kind] - Optional serialization kind for the request.\n   * @returns {Promise<any>} - A promise that resolves with the result of the API call.\n   */\n  async api_call({\n    method,\n    params,\n    serialization_kind\n  }: {\n    method: string;\n    params?: object | string | Array<string>;\n    serialization_kind?: SerializationKind;\n  }): Promise<any> {\n    return this.call(method, params, undefined, serialization_kind);\n  }\n\n  /**\n   * Call API function\n   *\n   * Calls any available API function (old version, may be deprecated soon)\n   *\n   * @param method {string} API method\n   * @param p1 {object} call parameters. if specified as a string/object, transformed to i=val\n   * @param p2 {object} additional call parameters if p1 is a string\n   *\n   * @returns Promise object\n   */\n  async call(\n    method: string,\n    p1?: object | string | Array<string>,\n    p2?: object,\n    serialization_kind?: SerializationKind\n  ): Promise<any> {\n    if (this.allow_logged_in_calls_only) {\n      if (!this.logged_in) {\n        throw new EvaError(EvaErrorKind.ACCESS_DENIED, ERR_REQUIRE_LOGGED_IN);\n      }\n    }\n    let params;\n    if (typeof p1 === \"string\" || Array.isArray(p1)) {\n      params = (p2 as any) || {};\n      params.i = p1;\n    } else {\n      params = p1;\n    }\n    let p = this._prepare_call_params(params);\n    return this._api_call(method, p, serialization_kind);\n  }\n\n  /**\n   * Ask server to set the token read-only (e.g. after idle)\n   *\n   * (EVA ICS 3.3.2+)\n   *\n   * the current mode can be obtained from $eva.server_info.aci.token_mode\n   */\n  set_readonly(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      this.call(\"session.set_readonly\")\n        .then(() => {\n          if (this.server_info)\n            this.server_info.aci.token_mode = TokenMode.ReadOnly;\n          this._push_event_topic(EventTopic.Server, this.server_info);\n          resolve();\n        })\n        .catch((err: any) => {\n          reject(err);\n        });\n    });\n  }\n\n  /**\n   * Ask server to return the token to normal mode\n   *\n   * (EVA ICS 3.3.2+)\n   *\n   * @param u {string} login\n   * @param p {string} password\n   * @param xopts {object} extra options (e.g. OTP)\n   */\n  set_normal(user?: string, password?: string, xopts?: object) {\n    let q: LoginPayload = {};\n    if (typeof password === \"undefined\" || password === null) {\n      q = { k: user };\n    } else {\n      q = { u: user, p: password };\n    }\n    q.a = this.api_token;\n    if (xopts !== undefined) {\n      q.xopts = xopts;\n    }\n    this._api_call(\"login\", q)\n      .then(() => {\n        if (this.server_info)\n          this.server_info.aci.token_mode = TokenMode.Normal;\n        this._invoke_handler(EventKind.LoginSuccess);\n      })\n      .catch((err: EvaError) => {\n        this.error_handler(err, \"set_normal\");\n      });\n    return true;\n  }\n\n  error_handler(err: EvaError, method: string) {\n    if (err.code == EvaErrorKind.ACCESS_DENIED_MORE_DATA_REQUIRED) {\n      let msg = this.parse_svc_message(err.message) as any;\n      msg.method = method;\n      if (msg && msg.kind == \"OTP\") {\n        switch (msg.message) {\n          case \"REQ\":\n            this._invoke_handler(EventKind.LoginOTPRequired, msg);\n            this._push_event_topic(EventTopic.WeSession, {\n              login: LoginState.OTPRequired,\n              error: null,\n              otp: msg\n            });\n            return;\n          case \"INVALID\":\n            this._invoke_handler(EventKind.LoginOTPInvalid, msg);\n            this._push_event_topic(EventTopic.WeSession, {\n              login: LoginState.OTPInvalid,\n              error: null,\n              otp: msg\n            });\n            return;\n          case \"SETUP\":\n            this._invoke_handler(EventKind.LoginOTPSetup, msg);\n            this._push_event_topic(EventTopic.WeSession, {\n              login: LoginState.OTPSetup,\n              error: null,\n              otp: msg\n            });\n            return;\n        }\n      }\n    }\n    this._invoke_handler(EventKind.LoginFailed, err);\n    if (method == \"login\") {\n      err.data = undefined;\n      this._push_event_topic(EventTopic.WeSession, {\n        login: LoginState.Failed,\n        error: err,\n        otp: null\n      });\n    }\n  }\n\n  /**\n   * Set event handler function\n   *\n   * A single kind of event can have a single handler only\n   *\n   * @param event {EventKind} engine event kind\n   * @param func {function} function called on event\n   */\n  on(event: EventKind | string, func: (...args: any[]) => void | boolean) {\n    this._handlers.set(event as EventKind, func);\n    this._debug(\"on\", `setting handler for ${event}`);\n    if (event == EventKind.WsEvent) {\n      this._ws_handler_registered = true;\n    }\n  }\n\n  /**\n   * Set intervals\n   *\n   * @param interval_id {IntervalKind} interval kind\n   * @param value {number} interval value (in seconds)\n   */\n  set_interval(interval_id: IntervalKind, value: number) {\n    this._intervals.set(interval_id, value);\n  }\n\n  /*\n   * Converts local date to server date\n   *\n   * @param date {Date} local date\n   *\n   * @returns {Date} server date\n   */\n  date_local_to_server(date: Date): Date {\n    return new Date(date.getTime() - this.tsdiff * 1000);\n  }\n\n  /*\n   * Converts server date to local date\n   *\n   * @param date {Date}\n   *\n   * @returns {Date}\n   */\n  date_server_to_local(date: Date): Date {\n    return new Date(date.getTime() + this.tsdiff * 1000);\n  }\n\n  /**\n   * Watch item state updates\n   *\n   * Registers the function to be called in case of state change event (or at\n   * first state load).\n   *\n   * If state is already loaded, function will be called immediately. One item\n   * (or item mask, set with \"*\" or a traditional OID mask) can have multiple\n   * watchers.\n   *\n   * @param oid {string} item oid (e.g. sensor:env/temp1, sensor:env/\\*, sensor:+/temp1)\n   * @param func {function} function to be called\n   * @param ignore_initial {boolean} skip initial state callback\n   * @param prot {boolean} protected (not removed on global unwatch)\n   *\n   */\n  // WASM override\n  watch(\n    oid: string,\n    func: (state: ItemState) => void,\n    ignore_initial = false,\n    prot = false\n  ) {\n    if (isMask(oid)) {\n      let map = this._update_state_mask_functions;\n      let fcs = map?.get(oid);\n      if (fcs === undefined) {\n        fcs = [];\n        map?.set(oid, fcs);\n      }\n      fcs.push({ func, prot });\n      if (!ignore_initial) {\n        let v = this.state(oid);\n        if (Array.isArray(v)) {\n          v.map(func);\n        } else if (v !== undefined) {\n          func(v);\n        }\n      }\n    } else {\n      let map = this._update_state_functions;\n      let fcs = map?.get(oid);\n      if (fcs === undefined) {\n        fcs = [];\n        map?.set(oid, fcs);\n      }\n      fcs.push({ func, prot });\n      if (!ignore_initial) {\n        let state = this.state(oid) as ItemState;\n        if (state !== undefined) func(state);\n      }\n    }\n  }\n\n  /**\n   * Watch action state by uuid\n   *\n   * Registers the function to be called in case of action status change\n   * event (or at first state load).\n   *\n   * If status is already loaded, function will be called immediately.\n   * Otherwise status is polled from the server with \"action_watch\" interval\n   * (default: 500ms).\n   *\n   * There is no unwatch function as watching is stopped as soon as the\n   * action is completed (or server error is occurred)\n   *\n   * @param uuid {string} action uuid\n   * @param func {function} function to be called\n   *\n   */\n  watch_action(uuid: string, func: (result: ActionResult | EvaError) => void) {\n    let fcs = this._action_watch_functions.get(uuid);\n    if (fcs === undefined) {\n      fcs = [];\n      this._action_watch_functions.set(uuid, fcs);\n      fcs.push(func);\n      const watcher = () => {\n        this.call(\"action.result\", { u: uuid })\n          .then((result: ActionResult) => {\n            let st = this._action_states.get(uuid);\n            if (st === undefined || st.status != result.status) {\n              this._action_states.set(uuid, result);\n              let fcs = this._action_watch_functions.get(uuid);\n              if (fcs !== undefined) {\n                fcs.map((f) => f(result));\n              }\n            }\n            if (result.finished) {\n              this._action_watch_functions.delete(uuid);\n              this._action_states.delete(uuid);\n            } else {\n              setTimeout(\n                watcher,\n                (this._intervals.get(IntervalKind.ActionWatch) as number) * 1000\n              );\n            }\n          })\n          .catch((err: EvaError) => {\n            let fcs = this._action_watch_functions.get(uuid);\n            if (fcs) {\n              fcs.map((f) => f(err));\n            }\n            this._action_watch_functions.delete(uuid);\n            this._action_states.delete(uuid);\n          });\n      };\n      setTimeout(\n        watcher,\n        (this._intervals.get(IntervalKind.ActionWatch) as number) * 1000\n      );\n    } else {\n      fcs.push(func);\n      let state = this._action_states.get(uuid);\n      if (state !== undefined) {\n        func(state);\n      }\n    }\n  }\n\n  /**\n   * Stop watching item state updates\n   *\n   * If item oid or function is not specified, all watching functions are\n   * removed for a single oid (mask) or for all the items watched.\n   *\n   * @param oid {string} item OID or a mask\n   * @param func {function} function to be removed\n   */\n  unwatch(oid?: string, func?: (state: ItemState) => void) {\n    if (!oid) {\n      this._clear_watchers();\n    } else if (!isMask(oid)) {\n      if (func) {\n        this._unwatch_func(oid, func);\n      } else {\n        this._unwatch_all(oid);\n      }\n    } else {\n      if (func) {\n        this._unwatch_mask_func(oid, func);\n      } else {\n        this._unwatch_mask_all(oid);\n      }\n    }\n  }\n\n  // WASM override\n  _unwatch_func(oid: string, func?: (state: ItemState) => void) {\n    let map = this._update_state_functions;\n    let fcs = map?.get(oid);\n    if (fcs !== undefined) {\n      const filteredWatchers = fcs.filter((watcher) => watcher.func !== func);\n      if (filteredWatchers.length > 0) {\n        map?.set(oid, filteredWatchers);\n      } else {\n        map?.delete(oid);\n      }\n    }\n  }\n\n  // WASM override\n  _unwatch_all(oid: string) {\n    let map = this._update_state_functions;\n    let watchers = map?.get(oid);\n    if (watchers === undefined) return;\n    const filteredWatchers = watchers.filter((watcher) => watcher.prot);\n    if (filteredWatchers.length > 0) {\n      map?.set(oid, filteredWatchers);\n    } else {\n      map?.delete(oid);\n    }\n  }\n\n  // WASM override (not supported)\n  _unwatch_mask_func(oid: string, func: (state: ItemState) => void) {\n    let map = this._update_state_mask_functions;\n    let fcs = map?.get(oid);\n    if (fcs !== undefined) {\n      map?.set(\n        oid,\n        fcs.filter((el) => el.func !== func)\n      );\n    }\n  }\n\n  // WASM override\n  _unwatch_mask_all(oid: string) {\n    let map = this._update_state_mask_functions;\n    let watchers = map?.get(oid);\n    if (watchers === undefined) return;\n    const filteredWatchers = watchers.filter((watcher) => watcher.prot);\n    if (filteredWatchers.length > 0) {\n      map?.set(oid, filteredWatchers);\n    } else {\n      map?.delete(oid);\n    }\n  }\n\n  /**\n   * Get item status\n   *\n   * @param oid {string} item OID\n   *\n   * @returns item status(int) or undefined if no object found\n   */\n  // WASM override\n  status(oid: string): number | null | undefined {\n    let state = this.state(oid) as ItemState;\n    if (state === undefined || state === null) return undefined;\n    return state.status;\n  }\n\n  /**\n   * Get item value\n   *\n   * @param oid {string} item OID\n   *\n   * @returns item value or undefined if no item found\n   */\n  // WASM override\n  value(oid: string): any | undefined {\n    let state = this.state(oid) as ItemState;\n    if (state === undefined || state === null) return undefined;\n    if (Number(state.value) == state.value) {\n      return Number(state.value);\n    } else {\n      return state.value;\n    }\n  }\n\n  /**\n   * Get item state\n   *\n   * @param oid {string} item OID or OID mask\n   *\n   * @returns state object or undefined if no item found\n   */\n  state(oid: string): ItemState | Array<ItemState> | undefined {\n    enum StateSelectKind {\n      Single,\n      Mask\n    }\n    let state_select_kind = StateSelectKind.Single;\n    for (let c of oid) {\n      if (WILDCARDS.includes(c) || MATCH_ANY.includes(c)) {\n        state_select_kind = StateSelectKind.Mask;\n        break;\n      }\n    }\n    switch (state_select_kind) {\n      case StateSelectKind.Single:\n        return this._state(oid);\n      case StateSelectKind.Mask:\n        return this._states_by_mask(oid);\n    }\n  }\n\n  // WASM override\n  _state(oid: string) {\n    for (let [k, v] of this._states) {\n      if (k == GLOBAL_BLOCK_NAME) continue;\n      const state = v.get(oid);\n      if (state !== undefined) return state;\n    }\n    return this._states.get(GLOBAL_BLOCK_NAME)?.get(oid);\n  }\n\n  // WASM override\n  _states_by_mask(oid_mask: string): Array<ItemState> {\n    let result: Array<ItemState> = [];\n    let oids = new Set<string>();\n    for (let [k, st] of this._states) {\n      if (k == GLOBAL_BLOCK_NAME) continue;\n      st.forEach((v, oid) => {\n        if (this._oid_match(oid, oid_mask)) {\n          if (!oids.has(oid)) {\n            result.push(v);\n            oids.add(oid);\n          }\n        }\n      });\n    }\n    this._states.get(GLOBAL_BLOCK_NAME)?.forEach((v, oid) => {\n      if (this._oid_match(oid, oid_mask)) {\n        if (!oids.has(oid)) {\n          result.push(v);\n          oids.add(oid);\n        }\n      }\n    });\n    return result;\n  }\n\n  /**\n   * Stop the engine\n   *\n   * After calling the function closes open WebSocket if available, stops all\n   * workers then tries to close the server session\n   *\n   * @param keep_auth {boolean} keep authentication cookies and token\n   *\n   * @returns Promise object\n   */\n  async stop(keep_auth?: boolean, further_restart?: boolean): Promise<void> {\n    this._push_event_topic(EventTopic.WeSession, {\n      login: LoginState.Stopping,\n      error: null,\n      otp: null\n    });\n    const stop_ev = {\n      login: LoginState.Inactive,\n      error: null,\n      otp: null\n    };\n    return new Promise((resolve, reject) => {\n      this._stop_engine();\n      this.logged_in = false;\n      if (keep_auth) {\n        if (!further_restart) {\n          this._push_event_topic(EventTopic.WeSession, stop_ev);\n        }\n        resolve();\n      } else if (this.api_token) {\n        let token = this.api_token;\n        this.erase_token_cookie();\n        this._api_call(\"logout\", { a: token })\n          .then(() => {\n            this.api_token = \"\";\n            if (!further_restart) {\n              this._push_event_topic(EventTopic.WeSession, stop_ev);\n            }\n            resolve();\n          })\n          .catch((err) => {\n            if (!further_restart) {\n              this._push_event_topic(EventTopic.WeSession, stop_ev);\n            }\n            reject(err);\n          });\n      } else {\n        if (!further_restart) {\n          this._push_event_topic(EventTopic.WeSession, stop_ev);\n        }\n        resolve();\n      }\n    });\n  }\n\n  // ***** private functions *****\n  _inject_evajw(mod: any) {\n    if (mod) {\n      mod.init(undefined, this).then(() => {\n        mod.init_engine();\n        this.evajw = mod;\n        if (typeof window !== \"undefined\") {\n          (window as any).evajw = this.evajw;\n        }\n        let build = mod.get_build();\n        this.log.info(\"EVA ICS JavaScript WASM engine loaded. Build: \" + build);\n        try {\n          mod.check_license();\n        } catch (err) {\n          this.log.error(\"License check failed. WASM engine disabled\");\n          this.wasm = false;\n          this._start_engine();\n          return;\n        }\n        this._clear_watchers = mod.clear_watchers;\n        this._clear_states = mod.clear_states;\n        this._report_cleanup = mod.report_cleanup;\n        this.watch = mod.watch;\n        this.get_mode = mod.get_mode;\n        this._unwatch_func = mod.unwatch_func;\n        this._unwatch_all = mod.unwatch_all;\n        this._unwatch_mask_func = mod.unwatch_mask_func;\n        this._unwatch_mask_all = mod.unwatch_mask_all;\n        this.status = mod.status;\n        this.value = mod.value;\n        this._state = mod.state;\n        this._states_by_mask = mod.states_by_mask;\n        this._process_loaded_states = mod.process_loaded_states;\n        this._process_ws = mod.process_ws;\n        this._clear_state = mod.clear_state;\n        this._init_block_states = mod.init_block_states;\n        this.enable_event_map = mod.enable_event_map;\n        this.subscribe_event_topic = mod.subscribe_event_topic;\n        this.subscribe_event_topics = mod.subscribe_event_topics;\n        this.unsubscribe_event_topic = mod.unsubscribe_event_topic;\n        this.unsubscribe_all_event_topics = mod.unsubscribe_all_event_topics;\n        if (this._event_map) {\n          for (const [k, v] of this._event_map.subscribed_topics) {\n            this.subscribe_event_topics(Array.from(v), k);\n          }\n        }\n        this._push_event_topic = mod.push_event_topic;\n        for (const block of this._blocks.keys()) {\n          this._delete_block_states(block);\n          this._init_block_states(block);\n        }\n        this._delete_block_states = mod.delete_block_states;\n        // transfer registered watchers to WASM\n        function transfer_watchers(src: Map<string, Array<Watcher>>, mod: any) {\n          src.forEach((fcs, oid) => {\n            fcs.forEach((f) => {\n              mod.watch(oid, f.func, false, f.prot);\n            });\n          });\n        }\n        transfer_watchers(this._update_state_functions, mod);\n        transfer_watchers(this._update_state_mask_functions, mod);\n        return this._start_engine();\n      });\n    } else {\n      this.evajw = null;\n      return false;\n    }\n  }\n\n  _init_block(block: string) {\n    this._init_block_states(block);\n    this._last_ping.set(block, null);\n    this._last_pong.set(block, null);\n  }\n\n  /// WASM override\n  _init_block_states(block: string) {\n    this._states.set(block, new Map());\n  }\n\n  _delete_block(block: string) {\n    this._last_ping.delete(block);\n    this._last_pong.delete(block);\n    this._delete_block_states(block);\n  }\n\n  /// WASM override\n  _delete_block_states(block: string) {\n    this._report_cleanup(block);\n    this._states.delete(block);\n  }\n\n  _start_evajw() {\n    this.evajw = undefined;\n    const js_path = this.wasm === true ? \"./evajw/evajw.js\" : this.wasm;\n    eval(\n      `import(\"${js_path}?\" + new Date().getTime()).catch((e)=>{this._invoke_handler(\"wasm.error\", e);this._start_engine()}).then((m)=>{this._inject_evajw(m)})`\n    );\n  }\n\n  _is_ws_handler_registered() {\n    return this._ws_handler_registered;\n  }\n\n  // WASM override\n  _clear_watchers() {\n    this._update_state_functions.forEach((watchers, key) => {\n      const filteredWatchers = watchers.filter((watcher) => watcher.prot);\n      if (filteredWatchers.length > 0) {\n        this._update_state_functions.set(key, filteredWatchers);\n      } else {\n        this._update_state_functions.delete(key);\n      }\n    });\n    this._update_state_mask_functions.forEach((watchers, key) => {\n      const filteredWatchers = watchers.filter((watcher) => watcher.prot);\n      if (filteredWatchers.length > 0) {\n        this._update_state_mask_functions.set(key, filteredWatchers);\n      } else {\n        this._update_state_mask_functions.delete(key);\n      }\n    });\n  }\n\n  // WASM override\n  _report_cleanup(block: string) {\n    if (this._event_map === null) return;\n    for (const state of this._states.get(block)?.values() || []) {\n      if (!state.oid) continue;\n      // make sure the state is not in other blocks\n      let found = false;\n      for (const [k, v] of this._states) {\n        if (k == block) continue;\n        if (v.get(state.oid)) {\n          found = true;\n          break;\n        }\n      }\n      if (!found) {\n        const oid_path = state.oid.replace(\":\", \"/\");\n        const ev: ItemState = {\n          oid: state.oid,\n          status: null,\n          value: null\n        };\n        this._push_event_topic(\n          `${EventTopic.WeItemState}/${block}/${oid_path}`,\n          ev\n        );\n        this._push_event_topic(`${EventTopic.ItemState}/${oid_path}/`, ev);\n      }\n    }\n  }\n\n  // WASM override\n  _clear_states(block?: string) {\n    if (block !== undefined) {\n      this._report_cleanup(block);\n      this._states.get(block)?.clear();\n    } else {\n      for (let [name, v] of this._states) {\n        this._report_cleanup(name);\n        v.clear();\n      }\n    }\n  }\n\n  _clear_last_pings() {\n    this._last_ping.set(GLOBAL_BLOCK_NAME, null);\n    for (let [k, _] of this._blocks) {\n      this._last_ping.set(k, null);\n      this._last_pong.set(k, null);\n    }\n  }\n\n  _clear() {\n    this._clear_states();\n    this._clear_last_pings();\n    this.server_info = null;\n    this._push_event_topic(EventTopic.Server, this.server_info);\n    this.tsdiff = 0;\n    this._log_subscribed = false;\n    this._log_first_load = true;\n    this._log_loaded = false;\n    this._log_started = false;\n    this._lr2p = [];\n  }\n\n  _critical(message: any, write_on_screen = false, throw_err = true) {\n    if (write_on_screen) {\n      let body = document.getElementsByTagName(\"body\");\n      if (body) {\n        body[0].innerHTML = `<font color=\"red\" size=\"30\">${message}</font>`;\n      }\n    }\n    this.log.critical(message);\n    if (throw_err) {\n      throw new Error(`critical: ${message}`);\n    }\n  }\n\n  _prepare_api_call(method: string, params?: object): JsonRpcRequest {\n    if (this._api_call_id == 4294967295) {\n      this._api_call_id = 0;\n    }\n    this._api_call_id += 1;\n    let id = this._api_call_id;\n    if (this.debug == 2) {\n      this.log.debug(method, params);\n    }\n    return {\n      jsonrpc: \"2.0\",\n      method: method,\n      params: params,\n      id: id\n    };\n  }\n\n  async _api_call(\n    method: string,\n    params?: object,\n    serialization_kind?: SerializationKind\n  ): Promise<any> {\n    const req = this._prepare_api_call(method, params);\n    const id = req.id;\n    let api_uri = `${this.api_uri}/jrpc`;\n    if (this.debug) {\n      api_uri += `?${method}`;\n    }\n    this._debug(\"_api_call\", `${id}: ${api_uri}: ${method}`);\n    return new Promise((resolve, reject) => {\n      let content_type;\n      let body;\n      let ser_kind = serialization_kind || SerializationKind.JSON;\n      switch (ser_kind) {\n        case SerializationKind.MsgPack:\n          if (!this.external.msgpack) {\n            reject(\n              new EvaError(\n                EvaErrorKind.UNSUPPORTED,\n                \"MsgPack serialization is not supported - no methods set\"\n              )\n            );\n            return;\n          }\n          content_type = \"application/x-msgpack\";\n          body = this.external.msgpack.encode(req);\n          break;\n        case SerializationKind.JSON:\n          content_type = \"application/json\";\n          body = JSON.stringify(req);\n          break;\n        default:\n          reject(\n            new EvaError(\n              EvaErrorKind.UNSUPPORTED,\n              \"Unsupported serialization kind\"\n            )\n          );\n      }\n      this.external\n        .fetch(api_uri, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": content_type\n          },\n          redirect: \"error\",\n          body\n        })\n        .then((response: any) => {\n          if (response.ok) {\n            this._debug(method, `api call ${id} completed`);\n            this._deserializePromise(response, ser_kind)\n              .then((data: JsonRpcResponse) => {\n                if (\n                  data.id != id ||\n                  (data.result === undefined && data.error === undefined)\n                ) {\n                  reject(new EvaError(-32009, \"Invalid server response\", data));\n                } else if (data.error) {\n                  this._debug(\n                    method,\n                    `api call ${id} failed: ${data.error.code} (${data.error.message})`\n                  );\n                  reject(\n                    new EvaError(data.error.code, data.error.message, data)\n                  );\n                } else {\n                  if (this.debug == 2) {\n                    this.log.debug(`API ${id} ${method} response`, data.result);\n                  }\n                  resolve(data.result);\n                }\n              })\n              .catch((err: any) => {\n                let code = EvaErrorKind.INVALID_DATA;\n                let message = \"Invalid server response\";\n                this._debug(\n                  method,\n                  `api call ${id} failed: ${code} (${message})`\n                );\n                reject(new EvaError(code, message, err));\n              });\n          } else {\n            let code = EvaErrorKind.CORE_ERROR;\n            let message = \"Server error\";\n            this._debug(method, `api call ${id} failed: ${code} (${message})`);\n            reject(new EvaError(code, message));\n          }\n        })\n        .catch((err: any) => {\n          let code = EvaErrorKind.CORE_ERROR;\n          let message = \"Server error\";\n          this._debug(method, `api call ${id} failed: ${code} (${message})`);\n          reject(new EvaError(code, message, err));\n        });\n    });\n  }\n\n  async _heartbeat(on_login: boolean): Promise<void> {\n    //const ws = this.ws.get(null);\n    return new Promise((resolve, reject) => {\n      if (on_login) {\n        this._clear_last_pings();\n      }\n      if (this.ws_mode) {\n        if (!on_login) {\n          for (let [k, last_ping] of this._last_ping) {\n            if (last_ping) {\n              const last_pong = this._last_pong.get(k) || null;\n              if (\n                last_pong === null ||\n                last_ping - last_pong >\n                  (this._intervals.get(IntervalKind.Heartbeat) as number) * 2\n              ) {\n                this._debug(\n                  \"heartbeat\",\n                  `error: ws ping timeout, block ${k || GLOBAL_BLOCK_NAME}`\n                );\n                const err = new EvaError(\n                  EvaErrorKind.TIMEOUT,\n                  \"WS ping timeout\"\n                );\n                this._invoke_handler(EventKind.HeartbeatError, err);\n                reject(err);\n                return;\n              }\n            }\n          }\n        }\n        for (let [k, ws] of this.ws) {\n          if (ws && ws?.readyState >= 1) {\n            this._last_ping.set(k, Date.now() / 1000);\n            try {\n              this._debug(\n                `block ${k || GLOBAL_BLOCK_NAME} heartbeat`,\n                \"ws ping\"\n              );\n              let payload = { m: \"ping\" };\n              ws.send(JSON.stringify(payload));\n              ws.send(\"\");\n            } catch (err) {\n              this._debug(\"heartbeat\", \"error: unable to send ws ping\");\n              this._invoke_handler(EventKind.HeartbeatError, err);\n              reject();\n              return;\n            }\n          }\n        }\n      }\n      this.call(\"test\")\n        .then((data: ServerInfo) => {\n          this.server_info = data;\n          this._push_event_topic(EventTopic.Server, this.server_info);\n          this.tsdiff = new Date().getTime() / 1000 - data.time;\n          this._invoke_handler(EventKind.HeartbeatSuccess);\n          resolve();\n        })\n        .catch((err: EvaError) => {\n          this._debug(\"heartbeat\", \"error: unable to send test API call\");\n          if (err.code == EvaErrorKind.ACCESS_DENIED) {\n            this.erase_token_cookie();\n          }\n          this._invoke_handler(EventKind.HeartbeatError, err);\n        });\n      this._debug(\"heartbeat\", \"ok\");\n    });\n  }\n\n  _load_log_entries(postprocess: boolean) {\n    if (this.ws_mode) this._lr2p = [];\n    this.call(\"log.get\", {\n      l: this.log_params.level,\n      n: this.log_params.records\n    })\n      .then((data: Array<LogRecord>) => {\n        if (this.ws_mode && this._log_first_load) {\n          this._set_ws_log_level(this.log_params.level);\n        }\n        data.map((l) => this._invoke_handler(EventKind.LogRecord, l));\n        this._log_loaded = true;\n        this._lr2p.map((l) => this._invoke_handler(EventKind.LogRecord, l));\n        if (postprocess) {\n          this._invoke_handler(EventKind.LogPostProcess);\n        }\n        this._log_first_load = false;\n      })\n      .catch((err: EvaError) => {\n        this.log.error(`unable to load log entries: ${err.message}`);\n      });\n  }\n\n  _schedule_restart() {\n    this._scheduled_restarter = setTimeout(\n      () => {\n        this.start();\n      },\n      (this._intervals.get(IntervalKind.Restart) as number) * 1000\n    );\n  }\n\n  _cancel_scheduled_restart() {\n    if (this._scheduled_restarter) {\n      clearTimeout(this._scheduled_restarter);\n      this._scheduled_restarter = null;\n    }\n  }\n\n  _stop_engine() {\n    for (let [_, block] of this._blocks) {\n      block._stop();\n    }\n    for (let [_, stream] of this._streams) {\n      stream._stop();\n    }\n    this._clear();\n    if (this._heartbeat_reloader) {\n      clearInterval(this._heartbeat_reloader);\n      this._heartbeat_reloader = null;\n    }\n    if (this._ajax_reloader) {\n      clearInterval(this._ajax_reloader);\n      this._ajax_reloader = null;\n    }\n    if (this._log_reloader) {\n      clearInterval(this._log_reloader);\n      this._log_reloader = null;\n    }\n    let ws = this.ws.get(GLOBAL_BLOCK_NAME);\n    if (ws) {\n      try {\n        ws.onclose = null;\n        ws.onerror = function () {};\n        ws.close();\n      } catch (err) {\n        // web socket may be still open, will close later\n        setTimeout(() => {\n          try {\n            ws?.close();\n          } catch (err) {}\n        }, 100);\n      }\n    }\n  }\n\n  _prepare_call_params(params?: any): object {\n    let p = params || {};\n    if (this.api_token) {\n      p.k = this.api_token;\n    } else if (this.#apikey) {\n      p.k = this.#apikey;\n    }\n    return p;\n  }\n\n  _set_token_cookie() {\n    if (this.set_auth_cookies && typeof document !== \"undefined\") {\n      [\n        this.api_uri + \"/ui\",\n        this.api_uri + \"/pvt\",\n        this.api_uri + \"/rpvt\",\n        this.api_uri + \"/upload\"\n      ].map(\n        (uri) =>\n          (document.cookie = `auth=${this.api_token}; Path=${uri}; SameSite=Lax`),\n        this\n      );\n    }\n  }\n\n  // WASM override\n  _process_loaded_states(\n    data: Array<ItemState>,\n    clear_unavailable: boolean,\n    block: string\n  ) {\n    let received_oids: string[] = [];\n    if (clear_unavailable) {\n      data.map((s) => {\n        if (s.oid !== undefined) {\n          received_oids.push(s.oid);\n        }\n      });\n    }\n    data.map((s) => this._process_state(s, clear_unavailable, block));\n    if (clear_unavailable) {\n      let map = this._states.get(block);\n      map?.forEach((state, oid) => {\n        if (\n          state.status !== undefined &&\n          state.status !== null &&\n          !received_oids.includes(oid)\n        ) {\n          this._debug(`clearing unavailable item ${oid}`);\n          this._clear_state(oid, block);\n        }\n      });\n    }\n  }\n\n  async _load_states(\n    state_updates: boolean | Array<string>,\n    block: string\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      if (!state_updates) {\n        resolve();\n      } else {\n        let params: StatePayload = { full: true };\n        if (state_updates == true) {\n          params.i = \"#\";\n        } else {\n          params.i = state_updates;\n        }\n        this.call(\"item.state\", params)\n          .then((data: Array<ItemState>) => {\n            this._process_loaded_states(data, this.clear_unavailable, block);\n            resolve();\n          })\n          .catch((err: EvaError) => {\n            reject(err);\n          });\n      }\n    });\n  }\n\n  _get_ws_uri(): string {\n    let uri;\n    if (!this.api_uri) {\n      let loc = window.location;\n      if (loc.protocol === \"https:\") {\n        uri = \"wss:\";\n      } else {\n        uri = \"ws:\";\n      }\n      uri += \"//\" + loc.host;\n    } else {\n      uri = this.api_uri;\n      if (uri.startsWith(\"http://\")) {\n        uri = uri.replace(\"http://\", \"ws://\");\n      } else if (uri.startsWith(\"https://\")) {\n        uri = uri.replace(\"https://\", \"wss://\");\n      } else {\n        let loc = window.location;\n        if (loc.protocol === \"https:\") {\n          uri = \"wss:\";\n        } else {\n          uri = \"ws:\";\n        }\n        uri += \"//\" + loc.host + this.api_uri;\n      }\n    }\n    let ws_uri = `${uri}${this.ws_uri}?`;\n    return ws_uri;\n  }\n\n  async _start_ws(\n    state_updates: boolean | Array<string>,\n    block: string\n  ): Promise<void> {\n    check_state_updates(state_updates);\n    return new Promise((resolve) => {\n      if (this.ws_mode) {\n        let ws_uri = this._get_ws_uri();\n        if (block) {\n          ws_uri += `_block=${block}&`;\n        }\n        ws_uri += `k=${this.api_token}`;\n        let ws_buf_ttl = this._intervals.get(IntervalKind.WSBufTTL) as number;\n        if (ws_buf_ttl > 0) {\n          ws_uri += `&buf_ttl=${ws_buf_ttl}`;\n        }\n        const ws = new this.external.WebSocket(ws_uri);\n        this.ws.set(block, ws);\n        ws.onmessage = (evt: any) => {\n          this._process_ws(evt.data, block);\n        };\n        ws.addEventListener(\"open\", () => {\n          this._debug(\"_start_ws\", \"ws connected\");\n          let payload = { m: \"ping\" };\n          ws.send(JSON.stringify(payload));\n          ws.send(\"\");\n          if (state_updates) {\n            let st: WsCommand = {\n              m: \"subscribe.state\"\n            };\n            let masks;\n            if (state_updates == true) {\n              masks = [\"#\"];\n            } else {\n              masks = state_updates;\n            }\n            st.p = masks;\n            ws.send(JSON.stringify(st));\n            ws.send(\"\");\n          }\n          if (this._log_subscribed) {\n            this.set_log_level(this.log_params.level);\n          }\n        });\n      }\n      resolve();\n    });\n  }\n\n  _set_ws_log_level(level: number) {\n    this._log_subscribed = true;\n    try {\n      if (this.ws) {\n        let payload: WsCommand = { m: \"subscribe.log\", p: level };\n        (this.ws.get(GLOBAL_BLOCK_NAME) as any).send(JSON.stringify(payload));\n        (this.ws.get(GLOBAL_BLOCK_NAME) as any).send(\"\");\n      }\n    } catch (err) {\n      this._debug(\"log_level\", \"warning: unable to send ws packet\", err);\n    }\n  }\n\n  _process_ws_frame_pong(block: string) {\n    this._last_pong.set(block, Date.now() / 1000);\n  }\n\n  _process_ws_frame_log(data: Array<LogRecord> | LogRecord) {\n    if (Array.isArray(data)) {\n      data.map((record) => this._preprocess_log_record(record));\n    } else {\n      this._preprocess_log_record(data);\n    }\n    this._invoke_handler(EventKind.LogPostProcess);\n  }\n\n  // WASM override\n  _process_ws(payload: string, block: string) {\n    let data = JSON.parse(payload);\n    if (data.s == \"pong\") {\n      this._debug(\"ws\", \"pong\");\n      this._process_ws_frame_pong(block);\n      return;\n    }\n    if (block === GLOBAL_BLOCK_NAME) {\n      if (data.s == \"reload\") {\n        this._debug(\"ws\", \"reload\");\n        this._invoke_handler(EventKind.ServerReload);\n        this._push_event_topic(`${EventTopic.Server}/RELOAD`, true);\n        return;\n      }\n      if (data.s == \"server\") {\n        let ev = \"server.\" + data.d;\n        this._debug(\"ws\", ev);\n        this._invoke_handler(ev as EventKind);\n        this._push_event_topic(`${EventTopic.Server}/${data.d}`, true);\n        return;\n      }\n      if (data.s.substring(0, 11) == \"supervisor.\") {\n        this._debug(\"ws\", data.s);\n        this._invoke_handler(data.s, data.d);\n        this._push_event_topic(\n          `${EventTopic.Supervisor}/${data.s.substring(11)}`,\n          data.d\n        );\n        return;\n      }\n      if (this._invoke_handler(EventKind.WsEvent, data) === false) return;\n      if (data.s == \"log\") {\n        this._debug(\"ws\", \"log\");\n        this._process_ws_frame_log(data.d);\n        return;\n      }\n    }\n    if (data.s == \"state\") {\n      this._debug(\"ws\", \"state\");\n      if (Array.isArray(data.d)) {\n        data.d.map(\n          (state: ItemState) => this._process_state(state, true, block),\n          this\n        );\n      } else {\n        this._process_state(data.d, true, block);\n      }\n      return;\n    }\n  }\n\n  _preprocess_log_record(record: LogRecord) {\n    this._log_loaded\n      ? this._invoke_handler(EventKind.LogRecord, record)\n      : this._lr2p.push(record);\n  }\n\n  // WASM override\n  _clear_state(oid: string, block: string) {\n    this._states.get(block)?.delete(oid);\n    this._process_state(\n      {\n        oid: oid,\n        status: null,\n        value: null\n      },\n      false,\n      block\n    );\n  }\n\n  _process_state(state: ItemState, is_update = false, block: string) {\n    let map = this._states.get(block);\n    try {\n      if (state.oid === undefined) {\n        return;\n      }\n      let oid: string = state.oid;\n      let old_state = map?.get(oid);\n      if (!old_state && is_update) {\n        return;\n      }\n      if (\n        // no old state\n        old_state === undefined ||\n        // node\n        state.node != old_state.node ||\n        // use ieid\n        (state.ieid !== undefined &&\n          (old_state.ieid === undefined ||\n            state.ieid[0] == 0 ||\n            old_state.ieid[0] < state.ieid[0] ||\n            (old_state.ieid[0] == state.ieid[0] &&\n              old_state.ieid[1] < state.ieid[1])))\n      ) {\n        if (old_state && (is_update || state.ieid == undefined)) {\n          Object.keys(old_state).map(function (k) {\n            if (!(k in state)) {\n              // copy fields as-is\n              (state as any)[k] = (old_state as any)[k];\n            }\n          });\n        }\n        this._debug(\n          \"process_state\",\n          `${oid} s: ${state.status} v: \"${state.value}\"`,\n          `act: ${state.act} t: \"${state.t}\"`\n        );\n        map?.set(oid, state);\n        if (this._event_map !== null) {\n          const oid_path = oid.replace(\":\", \"/\");\n          this._push_event_topic(`${EventTopic.ItemState}/${oid_path}`, state);\n          this._push_event_topic(\n            `${EventTopic.WeItemState}/${block}/${oid_path}`,\n            state\n          );\n        }\n        let fcs = this._update_state_functions.get(oid);\n        if (fcs) {\n          fcs.map((f) => {\n            try {\n              f.func(state);\n            } catch (err) {\n              this.log.error(`state function processing for ${oid}:`, err);\n            }\n          });\n        }\n        this._update_state_mask_functions.forEach((fcs, k) => {\n          if (this._oid_match(oid, k)) {\n            fcs.map((f) => {\n              try {\n                f.func(state);\n              } catch (err) {\n                this.log.error(`state function processing for ${oid}:`, err);\n              }\n            });\n          }\n        });\n      }\n    } catch (err) {\n      this.log.error(\"State processing error, invalid object received\", err);\n    }\n  }\n\n  _invoke_handler(handler: EventKind, ...args: any[]): void | boolean {\n    let f = this._handlers.get(handler);\n    if (f) {\n      this._debug(\"invoke_handler\", \"invoking for \" + handler);\n      try {\n        return f.apply(this, args);\n      } catch (err) {\n        if (handler === EventKind.WASMError) {\n          throw err;\n        }\n        this.log.error(`handler for ${handler}:`, err);\n      }\n    }\n  }\n\n  _oid_match(oid: string, mask: string): boolean {\n    if (WILDCARDS.includes(mask)) {\n      return true;\n    }\n    let [kind, fullId] = oid.split(\":\");\n    if (!fullId) {\n      this.log.error(`Invalid OID: ${oid}`);\n      return false;\n    }\n    let [maskKind, maskFullId] = mask.split(\":\");\n    if (!maskFullId) {\n      this.log.error(`Invalid OID mask: ${mask}`);\n      return false;\n    }\n    if (!MATCH_ANY.includes(maskKind) && maskKind !== kind) {\n      return false;\n    }\n    let maskParts = maskFullId.split(\"/\");\n    for (let chunk of fullId.split(\"/\")) {\n      let maskChunk = maskParts.shift();\n      if (!maskChunk) {\n        return false;\n      }\n      if (WILDCARDS.includes(maskChunk)) {\n        return true;\n      }\n      if (!MATCH_ANY.includes(maskChunk) && maskChunk !== chunk) {\n        return false;\n      }\n    }\n    return maskParts.length === 0;\n  }\n\n  _debug(method: string, ...data: any[]) {\n    if (this.debug) {\n      this.log.debug.apply(this.log, [`Eva::${method}`].concat(data));\n    }\n  }\n\n  parse_svc_message(msg?: string): SvcMessage | null {\n    if (msg && msg.startsWith(\"|\")) {\n      let sp = msg.split(\"|\");\n      let kind = sp[1];\n      if (kind) {\n        let result: SvcMessage = { kind: kind, svc: sp[2] };\n        let svc_msg = sp[3];\n        if (svc_msg) {\n          let sp_msg = svc_msg.split(\"=\");\n          result.message = sp_msg[0];\n          result.value = sp_msg[1];\n        }\n        return result;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * OTP setup code\n   *\n   * @param ctx html <canvas /> element or id to generate QR code in\n   * @param secret {string} OTP secret\n   * @param params {OTPParams} additional parameters\n   *\n   * @returns QRious QR object if QR code is generated\n   */\n  otpQR(ctx: object | string, secret: string, params?: OTPParams) {\n    if (typeof document !== \"object\") {\n      this.log.error(\"document object not found\");\n      return;\n    }\n    if (!params) params = {};\n    let size = params.size || 200;\n    let issuer = params.issuer || `HMI ${document.location.hostname}`;\n    let user = params.user || this.login;\n    let value =\n      \"otpauth://totp/\" +\n      encodeURIComponent(user) +\n      `?secret=${secret}&issuer=` +\n      encodeURIComponent(issuer);\n    if (params.xtr) {\n      value += params.xtr;\n    }\n    return new this.external.QRious({\n      element: typeof ctx === \"object\" ? ctx : document.getElementById(ctx),\n      value: value,\n      size: size\n    });\n  }\n\n  _deserializePromise = (\n    response: any,\n    serialization_kind: SerializationKind\n  ): Promise<any> => {\n    switch (serialization_kind) {\n      case SerializationKind.MsgPack:\n        return new Promise((resolve, reject) => {\n          response.arrayBuffer().then((buffer: ArrayBuffer) => {\n            try {\n              const data = this.external.msgpack.decode(buffer);\n              resolve(data);\n            } catch (err) {\n              reject(\n                new EvaError(\n                  EvaErrorKind.INVALID_DATA,\n                  \"Invalid MsgPack response\",\n                  err\n                )\n              );\n            }\n          });\n        });\n      case SerializationKind.JSON:\n        return response.json();\n      default:\n        throw new EvaError(\n          EvaErrorKind.UNSUPPORTED,\n          \"Unknown serialization kind\"\n        );\n    }\n  };\n\n  /**\n   * QR code for EvaHI\n   *\n   * Generates QR code for :doc:`EvaHI</evahi>`-compatible apps (e.g. for Eva\n   * ICS Control Center mobile app for Android). Current engine session\n   * must be authorized using user login. If $eva.password is defined, QR\n   * code also contain password value. Requires qrious js library.\n   *\n   * @param ctx html <canvas /> element or id to generate QR code in\n   * @param params {HiQRParams} additional parameters\n   *\n   * @returns QRious QR object if QR code is generated\n   */\n  hiQR(ctx: object | string, params?: HiQRParams) {\n    if (typeof document !== \"object\") {\n      this.log.error(\"document object not found\");\n      return;\n    }\n    if (!params) params = {};\n    let url = params.url || document.location.href;\n    let user = params.user || this.authorized_user || \"\";\n    if (!url || !user || user.startsWith(\".\")) {\n      return;\n    }\n    let password = params.password;\n    if (password === undefined) {\n      password = this.#password;\n    }\n    let size = params.size || 200;\n    let link = document.createElement(\"a\");\n    link.href = url;\n    let protocol = link.protocol.substring(0, link.protocol.length - 1);\n    let host = link.hostname;\n    let port = link.port || (protocol == \"http\" ? \"80\" : \"443\");\n    let value = `scheme:${protocol}|address:${host}|port:${port}|user:${user}`;\n    if (password) {\n      value += `|password:${password}`;\n    }\n    return new this.external.QRious({\n      element: typeof ctx === \"object\" ? ctx : document.getElementById(ctx),\n      value: value,\n      size: size\n    });\n  }\n  /**\n   * Registers the global object window.$eva\n   */\n  register_globals() {\n    if (typeof window !== \"undefined\") {\n      (window as any).$eva = this;\n    } else {\n      throw new Error(\"the method can be started in web browsers only\");\n    }\n  }\n  /**\n   * Registers global objects + legacy globals\n   */\n  register_legacy_globals() {\n    this.register_globals();\n  }\n}\n\n//const throw_no_block = () => {\n//throw new EvaError(\n//EvaErrorKind.INVALID_PARAMS,\n//\"WebEngine block not defined\"\n//);\n//};\n\nconst check_state_updates = (state_updates: any) => {\n  if (\n    !Array.isArray(state_updates) &&\n    state_updates !== true &&\n    state_updates !== false\n  ) {\n    throw new EvaError(\n      EvaErrorKind.INVALID_PARAMS,\n      \"state_updates must be an array or boolean\"\n    );\n  }\n};\n\nconst NO_FREEZE_ID = \"eva-webengine-nofreeze\";\n\n/**\n * Disable tab freeze\n *\n * @param keep_visible {boolean} keep special elements visible\n */\nfunction disableTabFreeze(keep_visible?: boolean) {\n  const base64VideoSrc =\n    \"data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAAtptZGF0AAACrQYF//+p3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE1OSByMjk5MSAxNzcxYjU1IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxOSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEgbG9va2FoZWFkX3RocmVhZHM9MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2NvbXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAANZYiEAJ/+xkPApcjsHQAAAAxBmiFsSf/xWlGfYYAAAAMIbW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAAB9AAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAjJ0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAABAAAAAQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAfQAAAAAAABAAAAAAGqbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAABAAAAAgABVxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAABVW1pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAARVzdGJsAAAAlXN0c2QAAAAAAAAAAQAAAIVhdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAABAAEABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAAL2F2Y0MBZAAK/+EAFmdkAAqs2V6EAAADAAQAAAMACDxIllgBAAZo6+PLIsAAAAAYc3R0cwAAAAAAAAABAAAAAgAAQAAAAAAUc3RzcwAAAAAAAAABAAAAAQAAABxzdHNjAAAAAAAAAAEAAAABAAAAAgAAAAEAAAAcc3RzegAAAAAAAAAAAAAAAgAAAsIAAAAQAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAAAFptZXRhAAAAAAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0YQAAAAEAAAAATGF2ZjU4LjI5LjEwMA==\";\n  let video: HTMLVideoElement | null = document.getElementById(\n    NO_FREEZE_ID\n  ) as HTMLVideoElement;\n  if (!video) {\n    video = document.createElement(\"video\");\n    video.id = NO_FREEZE_ID;\n    document.body.appendChild(video);\n  } else {\n    console.warn(\"disableTabFreeze() function has been called multiple times\");\n  }\n  video.src = base64VideoSrc;\n  video.loop = true;\n  video.muted = true;\n  video.autoplay = true;\n  video.width = 2;\n  video.height = 1;\n  if (!keep_visible) {\n    video.width = 0;\n  }\n}\n\nexport {\n  Eva,\n  EvaError,\n  EvaErrorKind,\n  EvaStreamParameters,\n  SerializationKind,\n  TokenMode,\n  SessionAuthKind,\n  SessionACI,\n  ACLProp,\n  ACLOp,\n  SessionACL,\n  ServerInfo,\n  LoginState,\n  SessionState,\n  defaultSessionState,\n  EventHandler,\n  EventTopic,\n  EventKind,\n  IntervalKind,\n  ActionResult,\n  ItemState,\n  LogParams,\n  LogRecord,\n  OTPParams,\n  HiQRParams,\n  StateProp,\n  SvcMessage,\n  EvaConfig,\n  EvaEngineConfig,\n  Watcher,\n  disableTabFreeze\n};\n"],"names":["t","s","e","b","o","c","r","n","S","a","w","oid","SerializationKind","EvaErrorKind","EventKind","StateProp","IntervalKind","code","message","data","__publicField","fn_ok","fn_err","eva","method","p1","p2","params","p","payload","req","api_uri","resolve","reject","response","d","id","err","wait","uuid","res","status","value","lvar_oid","state","name","_data","ws_uri","ws","evt","state_updates","engine","reload","TokenMode","SessionAuthKind","ACLOp","LoginState","EventTopic","__privateAdd","_apikey","_password","serialization_kind","buffer","Logger","__privateSet","SubMap","topic","fn","topics","_a","_b","clients","client","login","password","apikey","__privateGet","old_stream","stream","old_block","block","q","token","cookies","user","_","sec","log_level","clear_existing","st","masks","config_path","cpath","config","ec","k","key","xopts","msg","event","func","interval_id","date","ignore_initial","prot","map","fcs","v","watcher","result","f","filteredWatchers","watchers","el","StateSelectKind","StateSelectKind2","state_select_kind","oid_mask","oids","keep_auth","further_restart","stop_ev","mod","build","transfer_watchers","src","found","oid_path","ev","write_on_screen","throw_err","body","content_type","ser_kind","on_login","last_ping","last_pong","postprocess","l","uri","clear_unavailable","received_oids","loc","ws_buf_ttl","level","record","is_update","old_state","handler","args","mask","kind","fullId","maskKind","maskFullId","maskParts","chunk","maskChunk","sp","svc_msg","sp_msg","ctx","secret","size","issuer","url","link","protocol","host","port","keep_visible","base64VideoSrc","video"],"mappings":"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","x_google_ignoreList":[0]}