setPing(ms = 0) {
    const oReq = new XMLHttpRequest();
    oReq.addEventListener("load", () => {
      const headers = oReq.getAllResponseHeaders().split("\r\n");
      const elapsedTime = Number(/* @__PURE__ */ new Date()) - Number(oReq.responseURL.split("=")[1]);
      this.set("ping", {
        success: !!(oReq.status === 201 || oReq.status === 204),
        // true if one of the listed codes else false
        status: oReq.status,
        headers,
        url: oReq.responseURL,
        elapsedTime
      });
    });
    if (__privateGet(this, _pingInterval)) {
      clearInterval(__privateGet(this, _pingInterval));
      __privateSet(this, _pingInterval, void 0);
    }
    oReq.open("GET", "".concat(this.httpNodeRoot, "/uibuilder/ping?t=").concat(Number(/* @__PURE__ */ new Date())));
    oReq.send();
    if (ms > 0) {
      __privateSet(this, _pingInterval, setInterval(() => {
        oReq.open("GET", "".concat(this.httpNodeRoot, "/uibuilder/ping?t=").concat(Number(/* @__PURE__ */ new Date())));
        oReq.send();
      }, ms));
    }
  }
HTTP Ping/Keep-alive - makes a call back to uibuilder's ExpressJS server and receives a 204 response
Can be used to keep sessions alive.
@example
  uibuilder.setPing(2000) // repeat every 2 sec. Re-issue with ping(0) to turn off repeat.
  uibuilder.onChange('ping', function(data) {
     console.log('pinger', data)
  })
@param {number} ms Repeat interval in ms