yoctolib-esm
Version:
Yoctopuce library for TypeScript/JavaScript, as an ECMAScript 2015 module
194 lines • 8.14 kB
JavaScript
/*********************************************************************
*
* $Id: yocto_api_html.ts 63723 2024-12-17 08:51:04Z seb $
*
* High-level programming interface, common to all modules
*
* - - - - - - - - - License information: - - - - - - - - -
*
* Copyright (C) 2011 and beyond by Yoctopuce Sarl, Switzerland.
*
* Yoctopuce Sarl (hereafter Licensor) grants to you a perpetual
* non-exclusive license to use, modify, copy and integrate http
* file into your software for the sole purpose of interfacing
* with Yoctopuce products.
*
* You may reproduce and distribute copies of this file in
* source or object form, as long as the sole purpose of this
* code is to interface with Yoctopuce products. You must retain
* this notice in the distributed source file.
*
* You should refer to Yoctopuce General Terms and Conditions
* for additional information regarding your rights and
* obligations.
*
* THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT
* WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
* WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO
* EVENT SHALL LICENSOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA,
* COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR
* SERVICES, ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
* LIMITED TO ANY DEFENSE THEREOF), ANY CLAIMS FOR INDEMNITY OR
* CONTRIBUTION, OR OTHER SIMILAR COSTS, WHETHER ASSERTED ON THE
* BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF
* WARRANTY, OR OTHERWISE.
*
*********************************************************************/
export * from "./yocto_api.js";
import { YAPI, YHttpEngine, YWebSocketEngine, YSystemEnv } from "./yocto_api.js";
/**
* System environment definition, for use in a browser
*/
export class YSystemEnvHtml extends YSystemEnv {
constructor() {
super(...arguments);
this.isNodeJS = false;
this.hasSSDP = false;
}
hookUnhandledRejection(handler) {
window.addEventListener('onunhandledrejection', (event) => {
let promiseRejectionEvent = event;
handler(promiseRejectionEvent.reason, promiseRejectionEvent.promise);
});
}
getWebSocketEngine(hub, runtime_urlInfo) {
return new YWebSocketHtmlEngine(hub, runtime_urlInfo);
}
getHttpEngine(hub, runtime_urlInfo, firstInfoJson) {
return new YHttpHtmlEngine(hub, runtime_urlInfo, firstInfoJson);
}
getWebSocketCallbackHub(hub, ws) {
return hub._yapi._throw(YAPI.NOT_SUPPORTED, 'WebSocket Callback mode is not available in this environment', null);
}
getHttpCallbackHub(hub, incomingMessage, serverResponse) {
return hub._yapi._throw(YAPI.NOT_SUPPORTED, 'HTTP Callback mode is not available in this environment', null);
}
getSSDPManager(obj_yapi) {
return obj_yapi._throw(YAPI.NOT_SUPPORTED, 'Hub discovery is not available in this environment', null);
}
loadfile(file) {
return new Promise((resolve, reject) => {
let reader = new FileReader();
reader.onerror = function (evt) {
// @ts-ignore
reject(evt.target.error);
};
reader.onload = function (evt) {
// @ts-ignore
resolve(new Uint8Array(evt.target.result));
};
reader.readAsArrayBuffer(file);
});
}
downloadfile(url, yapi) {
return new Promise((resolve, reject) => {
let httpRequest = new XMLHttpRequest();
httpRequest.open('GET', url, true);
httpRequest.overrideMimeType('text/plain; charset=x-user-defined');
httpRequest.onreadystatechange = (() => {
if (httpRequest.readyState == 4) {
if (httpRequest.status != 200 && httpRequest.status != 304) {
if (httpRequest.status) {
reject(new Error('HTTP error ' + httpRequest.status));
}
else {
reject(new Error('Unable to complete HTTP request, network down?'));
}
}
else {
resolve(YAPI.imm_str2bin(httpRequest.responseText));
}
}
});
httpRequest.send('');
});
}
async downloadRemoteCertificate(urlinfo) {
return "error: Not supported in browser";
}
}
const _HtmlSystemEnv = new YSystemEnvHtml();
YAPI.imm_setSystemEnv(_HtmlSystemEnv);
class YHttpHtmlEngine extends YHttpEngine {
constructor(hub, runtime_urlInfo, firstInfoJson) {
super(hub, runtime_urlInfo, firstInfoJson);
}
// Low-level function to create an HTTP client request (abstraction layer)
imm_makeRequest(method, relUrl, contentType, body, onProgress, onSuccess, onError) {
let xhr = new XMLHttpRequest();
let currPos = 0;
xhr.open(method, this._runtime_urlInfo.imm_getUrl(true, true, false) + relUrl, true, '', '');
// Send the request using text/plain POST, to avoid CORS checks
xhr.setRequestHeader('Content-Type', contentType);
xhr.overrideMimeType('text/plain; charset=x-user-defined');
xhr.onreadystatechange = () => {
if (xhr.readyState >= 3) {
let httpStatus = xhr.status >> 0;
if (xhr.readyState == 4 && httpStatus != 200 && httpStatus != 304) {
if (httpStatus == 401 || httpStatus == 204) {
// Authentication failure (204 == x-yauth)
this.infoJson.stamp = 0; // force to reload nonce/domain
onError(YAPI.UNAUTHORIZED, 'Unauthorized access (' + xhr.status + ')', false);
}
else if (httpStatus == 404) {
// No such file
onError(YAPI.FILE_NOT_FOUND, 'HTTP request return status 404 (not found)', false);
}
else if (this._hub.imm_isDisconnecting()) {
onError(YAPI.IO_ERROR, 'Hub is disconnecting', false);
}
else {
onError(YAPI.IO_ERROR, 'HTTP request failed with status ' + xhr.status, false);
}
return;
}
if (this._hub.imm_isDisconnecting()) {
if (this._hub._yapi._logLevel >= 4) {
this._hub._yapi.imm_log('Dropping request ' + relUrl + ' because hub is disconnecting');
}
return;
}
if (onProgress && xhr.responseText) {
let newlen = xhr.responseText.length;
if (newlen > currPos) {
onProgress(xhr.responseText.slice(currPos, newlen));
currPos = newlen;
}
}
if (onSuccess && xhr.readyState == 4) {
onSuccess(xhr.responseText);
}
}
};
xhr.onerror = () => {
onError(YAPI.IO_ERROR, 'HTTP request failed without status', false);
};
xhr.send(body);
return xhr;
}
// abort communication channel immediately
imm_abortRequest(clientRequest) {
clientRequest.abort();
}
}
class YWebSocketHtmlEngine extends YWebSocketEngine {
/** Open an outgoing websocket
*
* @param str_url {string}
**/
imm_webSocketOpen(str_url) {
let websock = new WebSocket(str_url);
websock.binaryType = 'arraybuffer';
this.websocket = websock;
}
/** Fills a buffer with random numbers
*
* @param arr {Uint8Array}
**/
imm_getRandomValues(arr) {
return window.crypto.getRandomValues(arr);
}
}
//# sourceMappingURL=yocto_api_html.js.map