diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 913b51d..a201148 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,4 +8,6 @@ jobs: - name: Checkout uses: actions/checkout@v1 - name: Build - run: docker run -v ${PWD}:/opt/esp32-javascript -w /opt/esp32-javascript -t espressif/idf idf.py build + run: | + docker build -t esp32-javascript:latest -f tools/Dockerfile . + docker run -t esp32-javascript:latest bash -c '. ./tools/install-node.sh; idf.py build' diff --git a/.gitignore b/.gitignore index 7e5baba..4301c8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ build sdkconfig.old* -main/project.cpp \ No newline at end of file +main/project.cpp +node_modules + diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/README.md b/README.md index 7b92977..c5d1237 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ You can clean the project with Tested with esp-idf (master branch commit hash 2e14149b). ## API -[API documentation](api.md) +[API documentation](docs/README.md) ## License See source files. diff --git a/api.md b/api.md deleted file mode 100644 index 1a41bc6..0000000 --- a/api.md +++ /dev/null @@ -1,192 +0,0 @@ -# API - -This documentation is currently under construction. - -## Modules - -
-
wifi-events
-
-
socket-events
-
-
- - - -## wifi-events - -* [wifi-events](#module_wifi-events) - * _static_ - * [.connectWifi(ssid, password, callback)](#module_wifi-events.connectWifi) - * [.createSoftAp(ssid, password, callback)](#module_wifi-events.createSoftAp) - * [.getBssid()](#module_wifi-events.getBssid) ⇒ - * _inner_ - * [~wifiStatusCallback](#module_wifi-events..wifiStatusCallback) : function - - - -### wifi-events.connectWifi(ssid, password, callback) -Connect to AP with given ssid and password. - -**Kind**: static method of [wifi-events](#module_wifi-events) - -| Param | Type | Description | -| --- | --- | --- | -| ssid | | The ssid of the wifi network. | -| password | | The password of the wifi network. | -| callback | wifiStatusCallback | A cb which gets the connect status updates. | - - - -### wifi-events.createSoftAp(ssid, password, callback) -Create soft AP with given ssid and password. - -**Kind**: static method of [wifi-events](#module_wifi-events) - -| Param | Type | Description | -| --- | --- | --- | -| ssid | | The ssid of the wifi network. | -| password | | The password of the wifi network. | -| callback | wifiStatusCallback | A cb which gets the connect status updates. | - - - -### wifi-events.getBssid() ⇒ -Get the bssid of the current connected wifi AP as formatted as hex string. - -**Kind**: static method of [wifi-events](#module_wifi-events) -**Returns**: The bssid. - - -### wifi-events~wifiStatusCallback : function -Callback for wifi status. - -**Kind**: inner typedef of [wifi-events](#module_wifi-events) - -| Param | Description | -| --- | --- | -| status | The connection status. | - - - -## socket-events - -* [socket-events](#module_socket-events) - * _static_ - * [.sockets](#module_socket-events.sockets) : [Array.<Socket>](#module_socket-events..Socket) - * [.closeSocket(socketOrSockfd)](#module_socket-events.closeSocket) - * [.sockConnect(ssl, host, port, onConnect, onData, onError, onClose)](#module_socket-events.sockConnect) ⇒ [Socket](#module_socket-events..Socket) - * _inner_ - * [~Socket](#module_socket-events..Socket) - * [.sockfd](#module_socket-events..Socket+sockfd) : number - * [.onData](#module_socket-events..Socket+onData) : [onDataCB](#module_socket-events..onDataCB) - * [~onConnectCB](#module_socket-events..onConnectCB) ⇒ boolean - * [~onDataCB](#module_socket-events..onDataCB) : function - * [~onErrorCB](#module_socket-events..onErrorCB) : function - * [~onCloseCB](#module_socket-events..onCloseCB) : function - - - -### socket-events.sockets : [Array.<Socket>](#module_socket-events..Socket) -An array which holds all active sockets. - -**Kind**: static property of [socket-events](#module_socket-events) - - -### socket-events.closeSocket(socketOrSockfd) -Flushes buffered writes, shutdowns SSL (if it is a secure socket), -close the socket, performs the close callback function, removes -socket from [sockets](#module_socket-events.sockets). - -**Kind**: static method of [socket-events](#module_socket-events) - -| Param | Type | -| --- | --- | -| socketOrSockfd | [Socket](#module_socket-events..Socket) \| number | - - - -### socket-events.sockConnect(ssl, host, port, onConnect, onData, onError, onClose) ⇒ [Socket](#module_socket-events..Socket) -Connects to specified host and port. - -**Kind**: static method of [socket-events](#module_socket-events) -**Returns**: [Socket](#module_socket-events..Socket) - The socket. - -| Param | Type | Description | -| --- | --- | --- | -| ssl | boolean | If we want to connect via SSL. | -| host | string | The remote hostname. | -| port | number | The remote port. | -| onConnect | [onConnectCB](#module_socket-events..onConnectCB) | A callback which gets called on connect event. | -| onData | [onDataCB](#module_socket-events..onDataCB) | A callback which gets called on a data event. | -| onError | [onErrorCB](#module_socket-events..onErrorCB) | A callback which gets called on an error event. | -| onClose | [onCloseCB](#module_socket-events..onCloseCB) | A callback which gets called on a close event. | - - - -### socket-events~Socket -**Kind**: inner class of [socket-events](#module_socket-events) - -* [~Socket](#module_socket-events..Socket) - * [.sockfd](#module_socket-events..Socket+sockfd) : number - * [.onData](#module_socket-events..Socket+onData) : [onDataCB](#module_socket-events..onDataCB) - - - -#### socket.sockfd : number -The socket file descriptor. - -**Kind**: instance property of [Socket](#module_socket-events..Socket) - - -#### socket.onData : [onDataCB](#module_socket-events..onDataCB) -The onData callback. - -**Kind**: instance property of [Socket](#module_socket-events..Socket) - - -### socket-events~onConnectCB ⇒ boolean -Callback for connect event. - -**Kind**: inner typedef of [socket-events](#module_socket-events) -**Returns**: boolean - If the connection attempt should be retried. - -| Param | Type | Description | -| --- | --- | --- | -| socket | [Socket](#module_socket-events..Socket) | The socket. | - - - -### socket-events~onDataCB : function -Callback for data event. - -**Kind**: inner typedef of [socket-events](#module_socket-events) - -| Param | Type | Description | -| --- | --- | --- | -| data | string | Data that was received on the socket. | -| sockfd | number | The socket file descriptor. | -| length | number | The length of the data. | - - - -### socket-events~onErrorCB : function -Callback for error event. - -**Kind**: inner typedef of [socket-events](#module_socket-events) - -| Param | Type | Description | -| --- | --- | --- | -| sockfd | number | The socket file descriptor. | - - - -### socket-events~onCloseCB : function -Callback for close event. - -**Kind**: inner typedef of [socket-events](#module_socket-events) - -| Param | Type | Description | -| --- | --- | --- | -| sockfd | number | The socket file descriptor. | - diff --git a/components/esp32-javascript/modules/esp32-javascript/boot.js b/components/esp32-javascript/modules/esp32-javascript/boot.js index bb44cdd..70498b5 100644 --- a/components/esp32-javascript/modules/esp32-javascript/boot.js +++ b/components/esp32-javascript/modules/esp32-javascript/boot.js @@ -1,22 +1,19 @@ -var configServer = require('./configserver'); -var config = require('./config').config; -var wifi = require('wifi-events'); - +Object.defineProperty(exports, "__esModule", { value: true }); +var wifi = require("wifi-events"); +var configServer = require("./configserver"); +var config_1 = require("./config"); errorhandler = function (error) { console.error(error.stack || error); startSoftApMode(); }; - -if (typeof KEY_BUILTIN !== 'undefined') { +if (typeof KEY_BUILTIN !== "undefined") { pinMode(KEY_BUILTIN, INPUT); } -if (typeof LED_BUILTIN !== 'undefined') { +if (typeof LED_BUILTIN !== "undefined") { pinMode(LED_BUILTIN, OUTPUT); } - var configServerStarted = false; var programLoaded = false; - function blink() { var blinkState = 0; return setInterval(function () { @@ -24,12 +21,11 @@ function blink() { blinkState = blinkState === 0 ? 1 : 0; }, 333); } - function startSoftApMode() { console.info("Starting soft ap mode."); var blinkId = blink(); console.debug("Blinking initialized."); - wifi.createSoftAp('esp32', '', function (evt) { + wifi.createSoftAp("esp32", "", function (evt) { console.debug("Event received:" + evt); if (evt.status === 1) { console.info("SoftAP: Connected"); @@ -40,7 +36,7 @@ function startSoftApMode() { var timeout = 5; //stop soft ap wifi after minutes setTimeout(function () { - console.info('Stopping soft ap now after ' + timeout + ' minutes.'); + console.info("Stopping soft ap now after " + timeout + " minutes."); stopWifi(); clearInterval(blinkId); // start normal wifi connection attempts @@ -49,114 +45,124 @@ function startSoftApMode() { } else if (evt.status === 0) { console.info("SoftAP: Disconnected"); - } else { + } + else { console.debug("SoftAP: Status " + evt.status); } }); } - function parseDate(d) { var day = parseInt(d.substr(5, 2)); - var month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'].indexOf(d.substr(8, 3)); + var month = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ].indexOf(d.substr(8, 3)); var year = parseInt(d.substr(12, 4)); var hour = parseInt(d.substr(17, 2)); var minute = parseInt(d.substr(20, 2)); var second = parseInt(d.substr(23, 2)); - var date = new Date(Date.UTC(year, month, day, hour, minute, second, 0)); return date; } - function evalScript(content, headers) { - console.debug('==> Start evaluation:'); + console.debug("==> Start evaluation:"); digitalWrite(LED_BUILTIN, 0); - eval(content); + eval(content); // this uses headers implicitly (TODO CHECK) } - function connectToWifi() { digitalWrite(LED_BUILTIN, 1); - var retries = 0; - wifi.connectWifi(config.wlan.ssid, config.wlan.password, function (evt) { + wifi.connectWifi(config_1.config.wlan.ssid, config_1.config.wlan.password, function (evt) { if (evt.status === 0) { console.info("WIFI: DISCONNECTED"); if (!configServerStarted) { retries++; } if (!configServerStarted && retries === 5) { - if (config.ota.offline) { + if (config_1.config.ota.offline) { stopWifi(); var programLoadedPrev = programLoaded; programLoaded = true; if (!programLoadedPrev) { - evalScript(el_load('config.script')); + evalScript(el_load("config.script")); } - } else { + } + else { startSoftApMode(); } } - } else if (evt.status === 1) { + } + else if (evt.status === 1) { if (!programLoaded) { console.info("WIFI: CONNECTED"); if (!configServerStarted) { configServer.startConfigServer(); configServerStarted = true; } - retries = 0; - - if (config.ota.url) { + if (config_1.config.ota.url) { programLoaded = true; - console.info('Loading program from: ' + config.ota.url.href); - - var headers = null; - fetch(config.ota.url.href) + console.info("Loading program from: " + config_1.config.ota.url.href); + var headers; + fetch(config_1.config.ota.url.href) .then(function (r) { - headers = r.headers; - return r.text() - }) + headers = r.headers; + return r.text(); + }) .then(function (data) { - if (config.ota.offline) { - el_store('config.script', data); - console.info('==> Saved offline script length=' + data.length); - } else { - console.info('==> NOT saving offline script'); - } - - var dateString = headers.get('Date'); - if (dateString) { - var now = parseDate(dateString); - setDateTimeInMillis(now.getTime()); - setDateTimeZoneOffsetInHours(2); - console.debug('Setting date to ' + new Date()); - } - evalScript(data, headers); - }) + if (config_1.config.ota.offline) { + el_store("config.script", data); + console.info("==> Saved offline script length=" + data.length); + } + else { + console.info("==> NOT saving offline script"); + } + var dateString = headers.get("Date"); + if (dateString) { + var now = parseDate(dateString); + setDateTimeInMillis(now.getTime()); + setDateTimeZoneOffsetInHours(2); + console.debug("Setting date to " + new Date()); + } + evalScript(data, headers); + }) .catch(function (error) { - console.error(error); - startSoftApMode(); - }); - } else { - console.error('No OTA (Over-the-air) url specified.'); + console.error(error); + startSoftApMode(); + }); + } + else { + console.error("No OTA (Over-the-air) url specified."); startSoftApMode(); } } - } else if (evt.status === 2) { + } + else if (evt.status === 2) { console.info("WIFI: CONNECTING..."); } }); } - function main() { - if ((typeof KEY_BUILTIN !== 'undefined' && digitalRead(KEY_BUILTIN) == 0) || (typeof config.wlan.ssid === 'undefined')) { - console.info('Setup key pressed: Start soft ap...'); + if ((typeof KEY_BUILTIN !== "undefined" && digitalRead(KEY_BUILTIN) == 0) || + typeof config_1.config.wlan.ssid === "undefined") { + console.info("Setup key pressed: Start soft ap..."); startSoftApMode(); - } else { - console.info('Trying to connect to Wifi from JS:'); + } + else { + console.info("Trying to connect to Wifi from JS:"); connectToWifi(); } } - module.exports = { - main: main -} \ No newline at end of file + main: main, +}; diff --git a/components/esp32-javascript/modules/esp32-javascript/boot.ts b/components/esp32-javascript/modules/esp32-javascript/boot.ts new file mode 100644 index 0000000..b75d02b --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/boot.ts @@ -0,0 +1,177 @@ +import wifi = require("wifi-events"); +import configServer = require("./configserver"); +import { config } from "./config"; + +errorhandler = function (error) { + console.error(error.stack || error); + startSoftApMode(); +}; + +if (typeof KEY_BUILTIN !== "undefined") { + pinMode(KEY_BUILTIN, INPUT); +} +if (typeof LED_BUILTIN !== "undefined") { + pinMode(LED_BUILTIN, OUTPUT); +} + +var configServerStarted = false; +var programLoaded = false; + +function blink() { + var blinkState = 0; + return setInterval(function () { + digitalWrite(LED_BUILTIN, blinkState); + blinkState = blinkState === 0 ? 1 : 0; + }, 333); +} + +function startSoftApMode() { + console.info("Starting soft ap mode."); + var blinkId = blink(); + console.debug("Blinking initialized."); + wifi.createSoftAp("esp32", "", function (evt) { + console.debug("Event received:" + evt); + if (evt.status === 1) { + console.info("SoftAP: Connected"); + if (!configServerStarted) { + configServer.startConfigServer(); + configServerStarted = true; + } + var timeout = 5; + //stop soft ap wifi after minutes + setTimeout(function () { + console.info("Stopping soft ap now after " + timeout + " minutes."); + stopWifi(); + clearInterval(blinkId); + // start normal wifi connection attempts + connectToWifi(); + }, timeout * 60 * 1000); + } else if (evt.status === 0) { + console.info("SoftAP: Disconnected"); + } else { + console.debug("SoftAP: Status " + evt.status); + } + }); +} + +function parseDate(d: string) { + var day = parseInt(d.substr(5, 2)); + var month = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ].indexOf(d.substr(8, 3)); + var year = parseInt(d.substr(12, 4)); + var hour = parseInt(d.substr(17, 2)); + var minute = parseInt(d.substr(20, 2)); + var second = parseInt(d.substr(23, 2)); + + var date = new Date(Date.UTC(year, month, day, hour, minute, second, 0)); + return date; +} + +function evalScript(content: string, headers?: Headers) { + console.debug("==> Start evaluation:"); + digitalWrite(LED_BUILTIN, 0); + eval(content); // this uses headers implicitly (TODO CHECK) +} + +function connectToWifi() { + digitalWrite(LED_BUILTIN, 1); + + var retries = 0; + wifi.connectWifi(config.wlan.ssid, config.wlan.password, function (evt) { + if (evt.status === 0) { + console.info("WIFI: DISCONNECTED"); + if (!configServerStarted) { + retries++; + } + if (!configServerStarted && retries === 5) { + if (config.ota.offline) { + stopWifi(); + var programLoadedPrev = programLoaded; + programLoaded = true; + if (!programLoadedPrev) { + evalScript(el_load("config.script")); + } + } else { + startSoftApMode(); + } + } + } else if (evt.status === 1) { + if (!programLoaded) { + console.info("WIFI: CONNECTED"); + if (!configServerStarted) { + configServer.startConfigServer(); + configServerStarted = true; + } + + retries = 0; + + if (config.ota.url) { + programLoaded = true; + console.info("Loading program from: " + config.ota.url.href); + + var headers: Headers; + fetch(config.ota.url.href) + .then(function (r) { + headers = r.headers; + return r.text(); + }) + .then(function (data) { + if (config.ota.offline) { + el_store("config.script", data); + console.info("==> Saved offline script length=" + data.length); + } else { + console.info("==> NOT saving offline script"); + } + + var dateString = headers.get("Date"); + if (dateString) { + var now = parseDate(dateString); + setDateTimeInMillis(now.getTime()); + setDateTimeZoneOffsetInHours(2); + console.debug("Setting date to " + new Date()); + } + evalScript(data, headers); + }) + .catch(function (error) { + console.error(error); + startSoftApMode(); + }); + } else { + console.error("No OTA (Over-the-air) url specified."); + startSoftApMode(); + } + } + } else if (evt.status === 2) { + console.info("WIFI: CONNECTING..."); + } + }); +} + +function main() { + if ( + (typeof KEY_BUILTIN !== "undefined" && digitalRead(KEY_BUILTIN) == 0) || + typeof config.wlan.ssid === "undefined" + ) { + console.info("Setup key pressed: Start soft ap..."); + startSoftApMode(); + } else { + console.info("Trying to connect to Wifi from JS:"); + connectToWifi(); + } +} + +module.exports = { + main: main, +}; diff --git a/components/esp32-javascript/modules/esp32-javascript/config.js b/components/esp32-javascript/modules/esp32-javascript/config.js index 74d0b75..d1468a1 100644 --- a/components/esp32-javascript/modules/esp32-javascript/config.js +++ b/components/esp32-javascript/modules/esp32-javascript/config.js @@ -1,19 +1,16 @@ -var config = {}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.reloadConfig = exports.config = void 0; function reloadConfig() { - config = { + exports.config = { wlan: { - ssid: el_load('config.ssid'), - password: el_load('config.password') + ssid: el_load("config.ssid"), + password: el_load("config.password"), }, ota: { - url: urlparse(el_load('config.url')), - offline: el_load('config.offline') === 'true' - } + url: urlparse(el_load("config.url")), + offline: el_load("config.offline") === "true", + }, }; } +exports.reloadConfig = reloadConfig; reloadConfig(); - -module.exports = { - config: config, - reloadConfig: reloadConfig -} \ No newline at end of file diff --git a/components/esp32-javascript/modules/esp32-javascript/config.ts b/components/esp32-javascript/modules/esp32-javascript/config.ts new file mode 100644 index 0000000..3c52b0d --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/config.ts @@ -0,0 +1,25 @@ +interface Esp32JsConfig { + wlan: { + ssid: string; + password: string; + }; + ota: { + url: any; + offline: boolean; + }; +} + +export var config: Esp32JsConfig; +export function reloadConfig() { + config = { + wlan: { + ssid: el_load("config.ssid"), + password: el_load("config.password"), + }, + ota: { + url: urlparse(el_load("config.url")), + offline: el_load("config.offline") === "true", + }, + }; +} +reloadConfig(); diff --git a/components/esp32-javascript/modules/esp32-javascript/configserver.js b/components/esp32-javascript/modules/esp32-javascript/configserver.js index b26726b..5b6a382 100644 --- a/components/esp32-javascript/modules/esp32-javascript/configserver.js +++ b/components/esp32-javascript/modules/esp32-javascript/configserver.js @@ -1,102 +1,120 @@ -var configManager = require('./config'); -var http = require('./http'); -var httpServer = http.httpServer; - -var requestHandler = []; -var baExceptionPathes = []; - +Object.defineProperty(exports, "__esModule", { value: true }); +exports.startConfigServer = exports.redirect = exports.getHeader = exports.baExceptionPathes = exports.requestHandler = void 0; +var configManager = require("./config"); +var http_1 = require("./http"); +exports.requestHandler = []; +exports.baExceptionPathes = []; function getHeader(statusCode, additionalHeaders) { - return ['HTTP/1.1 ', statusCode, ' OK\r\n',// - 'Connection: close\r\n',// - (additionalHeaders ? additionalHeaders : ''), - '\r\n'].join(''); + return [ + "HTTP/1.1 ", + statusCode, + " OK\r\n", + "Connection: close\r\n", + additionalHeaders ? additionalHeaders : "", + "\r\n", + ].join(""); } - +exports.getHeader = getHeader; function redirect(res, location) { - res.end(getHeader(302, 'Location: ' + location + '\r\n')); + res.end(getHeader(302, "Location: " + location + "\r\n")); } - +exports.redirect = redirect; function page(res, headline, text, cb) { - res.write(getHeader(200, 'Content-type: text/html\r\n')); - res.write('esp32-javascript'); + res.write(getHeader(200, "Content-type: text/html\r\n")); + res.write("esp32-javascript"); res.write(''); res.write(''); res.write('

'); res.write(headline); - res.write('

'); + res.write(""); if (Array.isArray(text)) { - text.forEach(function (t) { res.write(t) }); - } else { + text.forEach(function (t) { + res.write(t); + }); + } + else { res.write(text); } - res.end('
\r\n\r\n', cb); + res.end("\r\n\r\n", cb); } - function startConfigServer() { - console.info('Starting config server.'); + console.info("Starting config server."); var defaultConfig = getDefaultConfig(); - var authString = ('Basic ' + btoa(defaultConfig.basicAuthUsername + ':' + defaultConfig.basicAuthPassword)); - httpServer(80, false, function (req, res) { - if (req.headers['authorization'] !== authString && baExceptionPathes.indexOf(req.path) < 0) { - console.debug('401 response'); + var authString = "Basic " + + btoa(defaultConfig.basicAuthUsername + ":" + defaultConfig.basicAuthPassword); + http_1.httpServer(80, false, function (req, res) { + if (req.headers["authorization"] !== authString && + exports.baExceptionPathes.indexOf(req.path) < 0) { + console.debug("401 response"); res.write(getHeader(401, 'WWW-Authenticate: Basic realm="Enter credentials"\r\n')); - res.end('401 Unauthorized'); - } else if (req.path === '/restart' && req.method === 'POST'){ - page(res, 'Restarting...
Home', '', function () { setTimeout(restart, 1000) }); - } else if (req.path === '/setup' || req.path === '/restart') { - if (req.method === 'GET') { - page(res, 'Setup', ['
', - '', - '', - '', + res.end("401 Unauthorized"); + } + else if (req.path === "/restart" && req.method === "POST") { + page(res, 'Restarting...
Home', "", function () { + setTimeout(restart, 1000); + }); + } + else if (req.path === "/setup" || req.path === "/restart") { + if (req.method === "GET") { + page(res, "Setup", [ + '
', + '', + '', + '', '', - '', + el_load("config.offline") === "true" ? "checked" : "", + "/> Offline Mode", + '", '
', - '

Request restart

', - '
']); - } else { - var config = http.parseQueryStr(req.body); - el_store('config.ssid', config.ssid); - el_store('config.password', config.password); - el_store('config.url', config.url); - el_store('config.offline', config.offline === 'true' ? 'true' : 'false'); - el_store('config.script', config.script); - - page(res, 'Saved', JSON.stringify(config)); + "

Request restart

", + '
', + ]); + } + else { + var config = http_1.parseQueryStr(req.body); + el_store("config.ssid", config.ssid); + el_store("config.password", config.password); + el_store("config.url", config.url); + el_store("config.offline", config.offline === "true" ? "true" : "false"); + el_store("config.script", config.script); + page(res, "Saved", JSON.stringify(config)); configManager.reloadConfig(); } - } else { - for (var i = 0; i < requestHandler.length; i++) { + } + else { + for (var i = 0; i < exports.requestHandler.length; i++) { if (!res.isEnded) { try { - requestHandler[i](req, res); - } catch (error) { - var errorMessage = 'Internal server error: ' + error; + exports.requestHandler[i](req, res); + } + catch (error) { + var errorMessage = "Internal server error: " + error; console.error(errorMessage); if (!res.isEnded) { - res.write(getHeader(500, 'Content-type: text/plain\r\n')); + res.write(getHeader(500, "Content-type: text/plain\r\n")); res.end(errorMessage); } } } } if (!res.isEnded) { - if (req.path === '/') { - redirect(res, '/setup'); - } else { - res.write(getHeader(404, 'Content-type: text/plain\r\n')); - res.end('Not found'); + if (req.path === "/") { + redirect(res, "/setup"); + } + else { + res.write(getHeader(404, "Content-type: text/plain\r\n")); + res.end("Not found"); } } } }); } - -module.exports = { - requestHandler: requestHandler, - baExceptionPathes: baExceptionPathes, - startConfigServer: startConfigServer, - redirect: redirect, - getHeader: getHeader -} \ No newline at end of file +exports.startConfigServer = startConfigServer; diff --git a/components/esp32-javascript/modules/esp32-javascript/configserver.ts b/components/esp32-javascript/modules/esp32-javascript/configserver.ts new file mode 100644 index 0000000..79cc5aa --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/configserver.ts @@ -0,0 +1,140 @@ +import configManager = require("./config"); +import { + httpServer, + Esp32JsResponse, + parseQueryStr, + Esp32JsRequest, +} from "./http"; + +export var requestHandler: ((req: Esp32JsRequest, res: Esp32JsResponse) => void)[] = []; +export var baExceptionPathes: string[] = []; + +export function getHeader(statusCode: number, additionalHeaders: string) { + return [ + "HTTP/1.1 ", + statusCode, + " OK\r\n", // + "Connection: close\r\n", // + additionalHeaders ? additionalHeaders : "", + "\r\n", + ].join(""); +} + +export function redirect(res: Esp32JsResponse, location: string) { + res.end(getHeader(302, "Location: " + location + "\r\n")); +} + +function page( + res: Esp32JsResponse, + headline: string, + text: string | string[], + cb?: () => void +) { + res.write(getHeader(200, "Content-type: text/html\r\n")); + res.write("esp32-javascript"); + res.write( + '' + ); + res.write( + '' + ); + res.write( + '

' + ); + res.write(headline); + res.write("

"); + if (Array.isArray(text)) { + text.forEach(function (t) { + res.write(t); + }); + } else { + res.write(text); + } + res.end("
\r\n\r\n", cb); +} + +export function startConfigServer() { + console.info("Starting config server."); + var defaultConfig = getDefaultConfig(); + var authString = + "Basic " + + btoa( + defaultConfig.basicAuthUsername + ":" + defaultConfig.basicAuthPassword + ); + httpServer(80, false, function (req, res) { + if ( + req.headers["authorization"] !== authString && + baExceptionPathes.indexOf(req.path) < 0 + ) { + console.debug("401 response"); + res.write( + getHeader(401, 'WWW-Authenticate: Basic realm="Enter credentials"\r\n') + ); + res.end("401 Unauthorized"); + } else if (req.path === "/restart" && req.method === "POST") { + page(res, 'Restarting...
Home', "", function () { + setTimeout(restart, 1000); + }); + } else if (req.path === "/setup" || req.path === "/restart") { + if (req.method === "GET") { + page(res, "Setup", [ + '
', + '', + '', + '', + '", + '", + '
', + "

Request restart

", + '
', + ]); + } else { + var config = parseQueryStr(req.body); + el_store("config.ssid", config.ssid); + el_store("config.password", config.password); + el_store("config.url", config.url); + el_store( + "config.offline", + config.offline === "true" ? "true" : "false" + ); + el_store("config.script", config.script); + + page(res, "Saved", JSON.stringify(config)); + configManager.reloadConfig(); + } + } else { + for (var i = 0; i < requestHandler.length; i++) { + if (!res.isEnded) { + try { + requestHandler[i](req, res); + } catch (error) { + var errorMessage = "Internal server error: " + error; + console.error(errorMessage); + if (!res.isEnded) { + res.write(getHeader(500, "Content-type: text/plain\r\n")); + res.end(errorMessage); + } + } + } + } + if (!res.isEnded) { + if (req.path === "/") { + redirect(res, "/setup"); + } else { + res.write(getHeader(404, "Content-type: text/plain\r\n")); + res.end("Not found"); + } + } + } + }); +} diff --git a/components/esp32-javascript/modules/esp32-javascript/esp32-javascript.d.ts b/components/esp32-javascript/modules/esp32-javascript/esp32-javascript.d.ts new file mode 100644 index 0000000..0c101f6 --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/esp32-javascript.d.ts @@ -0,0 +1,82 @@ +declare var KEY_BUILTIN: number; +declare var LED_BUILTIN: number; + +declare var INPUT: number; +declare var OUTPUT: number; + +declare var errorhandler: (error: Error) => void; + +declare function pinMode(pin: number, direction: number): void; +declare function digitalWrite(pin: number, value: number): void; +declare function digitalRead(pin: number): number; +declare function stopWifi(): void; + +declare function el_load(key: string): string; +declare function el_store(key: string, value: string): void; + +declare function setDateTimeInMillis(time: number): void; +declare function setDateTimeZoneOffsetInHours(hours: number): void; + +interface Esp32JsDefaultConfig { + basicAuthUsername?: string; + basicAuthPassword?: string; +} + +declare function getDefaultConfig(): Esp32JsDefaultConfig; +declare function restart(): void; + +interface Esp32JsEventloopEvent { + type: number; + status: number; + fd: number; +} + +declare function el_createTimer(timeout: number): number; +declare function el_removeTimer(handle: number): void; +declare function el_suspend(): Esp32JsEventloopEvent[]; + +declare function main(): void; + +interface Esp32JsWifiConfig { + bssid: number[]; +} +declare function getWifiConfig(): Esp32JsWifiConfig; +declare var EL_WIFI_EVENT_TYPE: number; +declare function el_connectWifi(ssid: string, password: string): void; +declare function el_createSoftAp(ssid: string, password: string): void; + +declare function writeSocket( + sockfd: number, + data: Uint8Array, + len: number, + offset: number, + ssl: boolean +): number; + +declare function shutdownSSL(ref: any): void; +declare function freeSSL(ref: any): void; +declare function createSSLClientContext(): number; +declare function createSSL(clientContext: number, host?: string): number; +declare function connectSSL(sslHandle: number, sockfd: number): number; +declare function createSSLServerContext(): number; +declare function acceptSSL(ssl: any, newsockfd: number): number; + +declare function el_closeSocket(sockfd: number): void; +declare function el_createNonBlockingSocket(): number; +declare function el_connectNonBlocking( + sockfd: number, + host: string, + port: number +): void; +declare function el_bindAndListen(sockfd: number, port: number): number; +declare function el_acceptIncoming(sockfd: number): number; +declare function el_registerSocketEvents( + notConnectedSockets: number[], + connectedSockets: number[], + connectedWritableSockets: number[] +): void; +declare var EL_SOCKET_EVENT_TYPE: number; +declare function readSocket( + sockfd: number, + ssl: any +): { data: string; length: number }; diff --git a/components/esp32-javascript/modules/esp32-javascript/eventloop.js b/components/esp32-javascript/modules/esp32-javascript/eventloop.js deleted file mode 100644 index 4024f71..0000000 --- a/components/esp32-javascript/modules/esp32-javascript/eventloop.js +++ /dev/null @@ -1,134 +0,0 @@ -try { - errorHandler = typeof errorHandler === 'undefined' ? - function (error) { - console.error('Uncaught error:'); - console.error(error.stack || error); - } : - errorHandler; - - var timers = []; - var intervals = []; - var handles = 0; - var beforeSuspendHandlers = []; - var afterSuspendHandlers = []; - - function setTimeout(fn, timeout) { - var handle = el_createTimer(timeout); - timers.push({ - timeout: Date.now() + timeout, - fn: fn, - handle: handle, - installed: true - }); - return handle; - } - - function clearTimeout(handle) { - for (var i = 0; i < timers.length; i++) { - if (timers[i].handle === handle) { - var removed = timers.splice(i, 1); - if (removed[0].installed) { - el_removeTimer(handle); - } - } - } - } - - function clearInterval(handle) { - var idx = intervals.indexOf(handle); - if (idx >= 0) { - intervals.splice(idx, 1); - } - } - - function installIntervalTimeout(handle, fn, timeout) { - setTimeout(function () { - if (intervals.indexOf(handle) >= 0) { - fn(); - installIntervalTimeout(handle, fn, timeout); - } - }, timeout); - } - - function setInterval(fn, timeout) { - var handle = handles++; - intervals.push(handle); - installIntervalTimeout(handle, fn, timeout); - return handle; - } - - function el_select_next() { - - if (beforeSuspendHandlers) { - beforeSuspendHandlers.forEach(function (h) { h() }); - } - - var events = el_suspend(); - - var collected = []; - for (var evid = 0; evid < events.length; evid++) { - var evt = events[evid]; - console.debug('HANDLE EVENT: ' + JSON.stringify(evt)); - if (evt.type === 0) { //TIMER EVENT - var nextTimer = null; - for (var timerIdx = 0; timerIdx < timers.length; timerIdx++) { - if (timers[timerIdx].handle === evt.status) { - nextTimer = timers.splice(timerIdx, 1)[0]; - collected.push(nextTimer.fn); - } - } - if (!nextTimer) { - //throw Error('UNKNOWN TIMER HANDLE!!!'); - console.warn('UNKNOWN TIMER HANDLE:' + JSON.stringify(evt) + ';' + JSON.stringify(timers)); - } - } else { - var eventHandled = false; - if (afterSuspendHandlers) { - afterSuspendHandlers.forEach(function (handleCustomEvent) { - if (typeof handleCustomEvent === 'function') { - eventHandled |= handleCustomEvent(evt, collected); - } - }); - } - - if (!eventHandled) { - throw Error('UNKNOWN eventType ' + JSON.stringify(evt)); - } - } - } - return collected; - } - - function start() { - nextfuncs = [main]; - while (true) { - if (Array.isArray(nextfuncs)) { - nextfuncs.forEach(function (nf) { - if (typeof nf === 'function') { - try { - nf(); - } catch (error) { - errorhandler(error); - } - } - }); - } - nextfuncs = el_select_next(); - } - } - - global.setTimeout = setTimeout; - global.clearTimeout = clearTimeout; - global.setInterval = setInterval; - global.clearInterval = clearInterval; - - module.exports = { - start: start, - beforeSuspendHandlers: beforeSuspendHandlers, - afterSuspendHandlers: afterSuspendHandlers - } - -} catch (error) { - console.error('Unrecoverable error:'); - console.error(error.stack || error); -} diff --git a/components/esp32-javascript/modules/esp32-javascript/global.js b/components/esp32-javascript/modules/esp32-javascript/global.js index 8452b1a..14ed90c 100644 --- a/components/esp32-javascript/modules/esp32-javascript/global.js +++ b/components/esp32-javascript/modules/esp32-javascript/global.js @@ -1,11 +1,12 @@ -if (typeof global === 'undefined') { - (function () { - var global = new Function('return this;')(); - Object.defineProperty(global, 'global', { - value: global, - writable: true, - enumerable: false, - configurable: true - }); - })(); -} \ No newline at end of file +var global; +if (typeof global === "undefined") { + (function () { + var global = new Function("return this;")(); + Object.defineProperty(global, "global", { + value: global, + writable: true, + enumerable: false, + configurable: true, + }); + })(); +} diff --git a/components/esp32-javascript/modules/esp32-javascript/global.ts b/components/esp32-javascript/modules/esp32-javascript/global.ts new file mode 100644 index 0000000..46a2c04 --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/global.ts @@ -0,0 +1,12 @@ +var global: any; +if (typeof global === "undefined") { + (function () { + var global = new Function("return this;")(); + Object.defineProperty(global, "global", { + value: global, + writable: true, + enumerable: false, + configurable: true, + }); + })(); +} diff --git a/components/esp32-javascript/modules/esp32-javascript/http.js b/components/esp32-javascript/modules/esp32-javascript/http.js index fd10403..c72cd77 100644 --- a/components/esp32-javascript/modules/esp32-javascript/http.js +++ b/components/esp32-javascript/modules/esp32-javascript/http.js @@ -1,277 +1,276 @@ -var StringBuffer = require('./stringbuffer'); -var socketEvents = require('socket-events'); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.XMLHttpRequest = exports.httpClient = exports.parseQueryStr = exports.decodeQueryParam = exports.httpServer = void 0; +var socketEvents = require("socket-events"); +var stringbuffer_1 = __importDefault(require("./stringbuffer")); var sockListen = socketEvents.sockListen; var sockConnect = socketEvents.sockConnect; var closeSocket = socketEvents.closeSocket; - function parseHeaders(complete, endOfHeaders) { var headers = complete.substring(0, endOfHeaders); - var headerTokens = headers.split('\r\n'); + var headerTokens = headers.split("\r\n"); var firstLine = headerTokens.shift(); - parsedHeaders = {}; + var parsedHeaders = {}; headerTokens.forEach(function (headerLine) { - var delim = headerLine.indexOf(':'); + var delim = headerLine.indexOf(":"); if (delim >= 0) { parsedHeaders[headerLine.substring(0, delim).trim().toLowerCase()] = headerLine.substring(delim + 1).trim(); } }); return { firstLine: firstLine, - parsedHeaders: parsedHeaders + parsedHeaders: parsedHeaders, }; } - function httpServer(port, isSSL, cb) { - var sockres = sockListen(port, - function (socket) { - var complete = null; - var contentLength = 0; - var parsedHeaders = null; - var firstLine = null; - - socket.onData = function (data) { - complete = complete ? complete + data : data; - var endOfHeaders = complete.indexOf('\r\n\r\n'); - if (complete.length >= 4 && endOfHeaders >= 0) { - if (!parsedHeaders) { - var parsed = parseHeaders(complete, endOfHeaders); - firstLine = parsed.firstLine; - parsedHeaders = parsed.parsedHeaders; - } - - var postedData = null; - - if (typeof parsedHeaders['content-length'] !== 'undefined') { - contentLength = parseInt(parsedHeaders['content-length']); + var sockres = sockListen(port, function (socket) { + var complete; + var contentLength = 0; + var parsedHeaders; + var firstLine; + socket.onData = function (data) { + complete = complete ? complete + data : data; + var endOfHeaders = complete.indexOf("\r\n\r\n"); + if (complete.length >= 4 && endOfHeaders >= 0) { + if (!parsedHeaders) { + var parsed = parseHeaders(complete, endOfHeaders); + firstLine = parsed.firstLine; + parsedHeaders = parsed.parsedHeaders; + } + var postedData = null; + if (typeof parsedHeaders["content-length"] !== "undefined") { + contentLength = parseInt(parsedHeaders["content-length"]); + } + if (contentLength > 0) { + if (endOfHeaders === complete.length - 4 - contentLength) { + postedData = complete.substring(endOfHeaders + 4, complete.length); } - - if (contentLength > 0) { - if (endOfHeaders === (complete.length - 4 - contentLength)) { - postedData = complete.substring(endOfHeaders + 4, complete.length); - } - else { - //wait for more data to come (body of a POST request) - return; - } + else { + //wait for more data to come (body of a POST request) + return; } - - var startOfPath = firstLine.indexOf(' '); - var path = firstLine.substring(startOfPath + 1, firstLine.indexOf(' ', startOfPath + 1)); - var method = complete.substring(0, startOfPath); - - // allow gc to free complete string - complete = null; - - var req = { - method: method, - path: path, - body: postedData, - headers: parsedHeaders - }; - - var res = { isEnded: false }; - - res.flush = function (cb, close) { + } + // initialize response + var res = { + isEnded: false, + flush: function (cb, close) { socket.flush(cb); if (close) { - console.debug('Socket ' + socket.sockfd + ' closed.'); + console.debug("Socket " + socket.sockfd + " closed."); closeSocket(socket.sockfd); } - } - res.write = function (data) { + }, + write: function (data) { if (res.isEnded) { - throw Error('request has already ended'); + throw Error("request has already ended"); } socket.write(data); - } - res.end = function (data, cb) { + }, + end: function (data, cb) { res.write(data); res.flush(cb, true); res.isEnded = true; - } - - console.debug('Requesting ' + req.path + ' on socket ' + socket.sockfd); + }, + }; + if (firstLine) { + var startOfPath = firstLine.indexOf(" "); + var path = firstLine.substring(startOfPath + 1, firstLine.indexOf(" ", startOfPath + 1)); + var method = complete.substring(0, startOfPath); + // allow gc to free complete string + complete = null; + var req = { + method: method, + path: path, + body: postedData, + headers: parsedHeaders, + }; + console.debug("Requesting " + req.path + " on socket " + socket.sockfd); cb(req, res); } - }; - socket.onError = function (sockfd) { - console.error('NEW SOCK: ON ERROR: ' + sockfd); - }; - }, - function (sockfd) { - console.error('ON ERROR: Socket ' + sockfd); - }, - function () { - console.info('SOCKET WAS CLOSED!'); - }, - isSSL); + else { + } + } + }; + socket.onError = function (sockfd) { + console.error("NEW SOCK: ON ERROR: " + sockfd); + }; + }, function (sockfd) { + console.error("ON ERROR: Socket " + sockfd); + }, function () { + console.info("SOCKET WAS CLOSED!"); + }, isSSL); } - +exports.httpServer = httpServer; function decodeQueryParam(value) { - return decodeURIComponent(value.replace(/\+/g, '%20')); + return decodeURIComponent(value.replace(/\+/g, "%20")); } - +exports.decodeQueryParam = decodeQueryParam; function parseQueryStr(query) { - var keyValues = query.split('&'); var parsed = {}; - keyValues.forEach(function (val) { - var splitted = val.split('='); - parsed[splitted[0]] = splitted.length > 1 ? decodeQueryParam(splitted[1]) : ''; - }); + if (query) { + var keyValues = query.split("&"); + keyValues.forEach(function (val) { + var splitted = val.split("="); + parsed[splitted[0]] = + splitted.length > 1 ? decodeQueryParam(splitted[1]) : ""; + }); + } return parsed; } - +exports.parseQueryStr = parseQueryStr; function httpClient(ssl, host, port, path, method, requestHeaders, body, successCB, errorCB, finishCB) { - var complete = new StringBuffer(); + var complete = new stringbuffer_1.default(); var completeLength = 0; var chunked = false; var headerRead = false; var headerEnd = -1; var contentLength = -1; - requestHeaders = requestHeaders || ''; + requestHeaders = requestHeaders || ""; if (!errorCB) { errorCB = print; } - - sockConnect(ssl, host, port, - function (socket) { - var bodyStr = body ? body.toString() : null; - - var requestLines = method + ' ' + path + ' HTTP/1.1\r\nHost: ' + host + '\r\n' + - (bodyStr ? 'Content-length: ' + bodyStr.length + '\r\n' : '') + requestHeaders + '\r\n' + - (bodyStr ? bodyStr + '\r\n' : ''); - socket.write(requestLines); - socket.flush(); - }, - function (data, sockfd, length) { - complete.append(data); - completeLength = completeLength + length; - - if (!headerRead && (headerEnd = complete.indexOf('\r\n\r\n')) >= 0) { - headerRead = true; - chunked = complete.toLowerCase().indexOf('transfer-encoding: chunked') >= 0; - var clIndex = complete.toLowerCase().indexOf('content-length: '); - if (clIndex >= 0) { - var endOfContentLength = complete.indexOf('\r\n', clIndex); - contentLength = parseInt(complete.substring(clIndex + 15, endOfContentLength).toString()); - } - headerEnd += 4; + sockConnect(ssl, host, port, function (socket) { + var bodyStr = body ? body.toString() : null; + var requestLines = method + + " " + + path + + " HTTP/1.1\r\nHost: " + + host + + "\r\n" + + (bodyStr ? "Content-length: " + bodyStr.length + "\r\n" : "") + + requestHeaders + + "\r\n" + + (bodyStr ? bodyStr + "\r\n" : ""); + socket.write(requestLines); + socket.flush(); + }, function (data, sockfd, length) { + complete.append(data); + completeLength = completeLength + length; + if (!headerRead && (headerEnd = complete.indexOf("\r\n\r\n")) >= 0) { + headerRead = true; + chunked = + complete.toLowerCase().indexOf("transfer-encoding: chunked") >= 0; + var clIndex = complete.toLowerCase().indexOf("content-length: "); + if (clIndex >= 0) { + var endOfContentLength = complete.indexOf("\r\n", clIndex); + contentLength = parseInt(complete.substring(clIndex + 15, endOfContentLength).toString()); } - - if (chunked) { - if (complete.substring(complete.length - 5).toString() == '0\r\n\r\n') { - closeSocket(sockfd); - } + headerEnd += 4; + } + if (chunked) { + if (complete.substring(complete.length - 5).toString() == "0\r\n\r\n") { + closeSocket(sockfd); } - if (contentLength >= 0) { - if ((completeLength - headerEnd) == contentLength) { - closeSocket(sockfd); - } + } + if (contentLength >= 0) { + if (completeLength - headerEnd == contentLength) { + closeSocket(sockfd); } - }, - function () { - if (errorCB) { - errorCB('Could not load http://' + host + ':' + port + path); + } + }, function () { + if (errorCB) { + errorCB("Could not load http://" + host + ":" + port + path); + } + }, function () { + var startFrom = headerEnd; + var content = null; + if (chunked) { + content = new stringbuffer_1.default(); + do { + var chunkLengthEnd = complete.indexOf("\r\n", startFrom); + var lengthStr = complete + .substring(startFrom, chunkLengthEnd) + .toString(); + var chunkLength = parseInt(lengthStr, 16); + var chunkEnd = chunkLengthEnd + chunkLength + 2; + content.append(complete.substring(chunkLengthEnd + 2, chunkEnd)); + startFrom = chunkEnd + 2; + } while (chunkLength > 0); + } + else { + content = complete.substring(startFrom); + } + var headers = complete.substring(0, headerEnd); + if (successCB) { + successCB(content.toString(), headers.toString()); + } + //free complete for GC + content = null; + if (finishCB) { + finishCB(); + } + }); +} +exports.httpClient = httpClient; +var XMLHttpRequest = /** @class */ (function () { + function XMLHttpRequest() { + this.method = "GET"; + } + XMLHttpRequest.prototype.send = function (body) { + var self = this; + if (this.url) { + httpClient(this.url.protocol === "https:", this.url.hostname, this.url.port, this.url.pathname + this.url.search, this.method, this.requestHeaders ? this.requestHeaders.toString() : undefined, body, function (data, responseHeaders) { + var r = responseHeaders.match(/^HTTP\/[0-9\.]+ ([0-9]+) (.*)/); + if (r) { + self.status = parseInt(r[1], 10); + self.statusText = r[2]; + self.responseURL = ""; + self.responseText = data; + self.reponseHeaders = responseHeaders.substring(r[0].length + 2); + if (self.onload) { + self.onload(); + } + } + else { + if (self.onerror) { + self.onerror("Bad http status line."); + } + } + }, function (error) { + console.error(error); + if (self.onerror) { + self.onerror(error); + } + }); + } + else { + if (self.onerror) { + self.onerror("Url unset."); } - }, - function () { - var startFrom = headerEnd; - var content = null; - - if (chunked) { - content = new StringBuffer(); - - do { - var chunkLengthEnd = complete.indexOf('\r\n', startFrom); - var lengthStr = complete.substring(startFrom, chunkLengthEnd).toString(); - chunkLength = parseInt(lengthStr, 16); - var chunkEnd = chunkLengthEnd + chunkLength + 2; - - content.append(complete.substring(chunkLengthEnd + 2, chunkEnd)); - startFrom = chunkEnd + 2; - } while (chunkLength > 0); - } else { - content = complete.substring(startFrom); + } + }; + XMLHttpRequest.prototype.getAllResponseHeaders = function () { + return this.reponseHeaders; + }; + XMLHttpRequest.prototype.open = function (method, url) { + this.method = method; + this.url = urlparse(url); + // check protocol + if (this.url.protocol !== "http:" && this.url.protocol !== "https:") { + throw Error("Unsupported protocol for esp32 fetch implementation: " + + this.url.protocol); + } + // get default port + var port = parseInt(this.url.port, 10); + if (isNaN(port)) { + if (this.url.protocol === "https:") { + port = 443; } - - var headers = complete.substring(0, headerEnd); - //free complete for GC - complete = null; - - if (successCB) { - successCB(content.toString(), headers.toString()); + else if (this.url.protocol === "http:") { + port = 80; } - //free complete for GC - content = null; - if (finishCB) { - finishCB(); + else { + throw Error("Cannot determine default port for protocol " + this.url.protocol); } - }); -} - -var XMLHttpRequest = function () { -} - -XMLHttpRequest.prototype.send = function (body) { - httpClient(this.url.protocol === 'https:', - this.url.hostname, - this.url.port, - this.url.pathname + this.url.search, - this.method, - this.requestHeaders ? this.requestHeaders.toString() : null, - body, - (function (data, responseHeaders) { - var r = responseHeaders.match(/^HTTP\/[0-9\.]+ ([0-9]+) (.*)/); - this.status = Number.parseInt(r[1], 10); - this.statusText = r[2]; - this.responseURL = ''; - this.responseText = data; - this.reponseHeaders = responseHeaders.substring(r[0].length + 2); - this.onload(); - }).bind(this), - (function (error) { - console.error(error); - this.onerror(); - }).bind(this) - ); -} - -XMLHttpRequest.prototype.getAllResponseHeaders = function () { - return this.reponseHeaders; -} - -XMLHttpRequest.prototype.open = function (method, url) { - this.method = method; - this.url = urlparse(url); - - // check protocol - if (this.url.protocol !== 'http:' && this.url.protocol !== 'https:') { - throw Error('Unsupported protocol for esp32 fetch implementation: ' + this.url.protocol); - } - - // get default port - var port = Number.parseInt(this.url.port, 10); - if (Number.isNaN(port)) { - if (this.url.protocol === 'https:') { - port = 443; - } else if (this.url.protocol === 'http:') { - port = 80; - } else { - throw Error('Cannot determine default port for protocol ' + this.url.protocol); } - } - this.url.port = port; -} - -XMLHttpRequest.prototype.setRequestHeader = function (name, value) { - this.requestHeaders = this.requestHeaders || new StringBuffer(); - this.requestHeaders.append(name).append(': ').append(value).append('\r\n'); -} - -module.exports = { - XMLHttpRequest: XMLHttpRequest, - httpServer: httpServer, - decodeQueryParam: decodeQueryParam, - parseQueryStr: parseQueryStr, - httpClient: httpClient -} \ No newline at end of file + this.url.port = "" + port; + }; + XMLHttpRequest.prototype.setRequestHeader = function (name, value) { + this.requestHeaders = this.requestHeaders || new stringbuffer_1.default(); + this.requestHeaders.append(name).append(": ").append(value).append("\r\n"); + }; + return XMLHttpRequest; +}()); +exports.XMLHttpRequest = XMLHttpRequest; diff --git a/components/esp32-javascript/modules/esp32-javascript/http.ts b/components/esp32-javascript/modules/esp32-javascript/http.ts new file mode 100644 index 0000000..538e15b --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/http.ts @@ -0,0 +1,373 @@ +import socketEvents = require("socket-events"); +import StringBuffer from "./stringbuffer"; + +export interface Esp32JsRequest { + path: string; + headers: Esp32JsHeaders; + method: string; + body: string | null; +} + +export interface Esp32JsResponse { + flush: (cb?: () => void, close?: boolean) => void; + write: (data: string) => void; + end: (data: string, cb?: () => void) => void; + isEnded: boolean; +} + +export interface Esp32JsHeaders { + [key: string]: string; +} + +var sockListen = socketEvents.sockListen; +var sockConnect = socketEvents.sockConnect; +var closeSocket = socketEvents.closeSocket; + +function parseHeaders(complete: string, endOfHeaders: number) { + var headers = complete.substring(0, endOfHeaders); + var headerTokens = headers.split("\r\n"); + var firstLine = headerTokens.shift(); + var parsedHeaders: Esp32JsHeaders = {}; + headerTokens.forEach(function (headerLine) { + var delim = headerLine.indexOf(":"); + if (delim >= 0) { + parsedHeaders[ + headerLine.substring(0, delim).trim().toLowerCase() + ] = headerLine.substring(delim + 1).trim(); + } + }); + return { + firstLine: firstLine, + parsedHeaders: parsedHeaders, + }; +} + +export function httpServer( + port: string|number, + isSSL: boolean, + cb: (req: Esp32JsRequest, res: Esp32JsResponse) => void +) { + var sockres = sockListen( + port, + function (socket) { + var complete: string | null; + var contentLength = 0; + var parsedHeaders: Esp32JsHeaders; + var firstLine: string | undefined; + + socket.onData = function (data: string) { + complete = complete ? complete + data : data; + var endOfHeaders = complete.indexOf("\r\n\r\n"); + if (complete.length >= 4 && endOfHeaders >= 0) { + if (!parsedHeaders) { + var parsed = parseHeaders(complete, endOfHeaders); + firstLine = parsed.firstLine; + parsedHeaders = parsed.parsedHeaders; + } + + var postedData = null; + + if (typeof parsedHeaders["content-length"] !== "undefined") { + contentLength = parseInt(parsedHeaders["content-length"]); + } + + if (contentLength > 0) { + if (endOfHeaders === complete.length - 4 - contentLength) { + postedData = complete.substring( + endOfHeaders + 4, + complete.length + ); + } else { + //wait for more data to come (body of a POST request) + return; + } + } + + // initialize response + var res: Esp32JsResponse = { + isEnded: false, + + flush: function (cb, close) { + socket.flush(cb); + if (close) { + console.debug("Socket " + socket.sockfd + " closed."); + closeSocket(socket.sockfd); + } + }, + + write: function (data) { + if (res.isEnded) { + throw Error("request has already ended"); + } + socket.write(data); + }, + end: function (data, cb) { + res.write(data); + res.flush(cb, true); + res.isEnded = true; + }, + }; + + if (firstLine) { + var startOfPath = firstLine.indexOf(" "); + var path = firstLine.substring( + startOfPath + 1, + firstLine.indexOf(" ", startOfPath + 1) + ); + var method = complete.substring(0, startOfPath); + + // allow gc to free complete string + complete = null; + + var req: Esp32JsRequest = { + method: method, + path: path, + body: postedData, + headers: parsedHeaders, + }; + + console.debug( + "Requesting " + req.path + " on socket " + socket.sockfd + ); + cb(req, res); + } else { + } + } + }; + socket.onError = function (sockfd) { + console.error("NEW SOCK: ON ERROR: " + sockfd); + }; + }, + function (sockfd) { + console.error("ON ERROR: Socket " + sockfd); + }, + function () { + console.info("SOCKET WAS CLOSED!"); + }, + isSSL + ); +} + +export function decodeQueryParam(value: string) { + return decodeURIComponent(value.replace(/\+/g, "%20")); +} + +export function parseQueryStr(query: string | null) { + var parsed: { [key: string]: string } = {}; + if (query) { + var keyValues = query.split("&"); + keyValues.forEach(function (val) { + var splitted = val.split("="); + parsed[splitted[0]] = + splitted.length > 1 ? decodeQueryParam(splitted[1]) : ""; + }); + } + return parsed; +} + +export function httpClient( + ssl: boolean, + host: string, + port: string, + path: string, + method: string, + requestHeaders?: string, + body?: { toString: () => string }, + successCB?: (content: string, headers: string) => void, + errorCB?: (message: string) => void, + finishCB?: () => void +) { + var complete: StringBuffer = new StringBuffer(); + var completeLength = 0; + var chunked = false; + var headerRead = false; + var headerEnd = -1; + var contentLength = -1; + requestHeaders = requestHeaders || ""; + if (!errorCB) { + errorCB = print; + } + + sockConnect( + ssl, + host, + port, + function (socket) { + var bodyStr = body ? body.toString() : null; + + var requestLines = + method + + " " + + path + + " HTTP/1.1\r\nHost: " + + host + + "\r\n" + + (bodyStr ? "Content-length: " + bodyStr.length + "\r\n" : "") + + requestHeaders + + "\r\n" + + (bodyStr ? bodyStr + "\r\n" : ""); + socket.write(requestLines); + socket.flush(); + }, + function (data, sockfd, length) { + complete.append(data); + completeLength = completeLength + length; + + if (!headerRead && (headerEnd = complete.indexOf("\r\n\r\n")) >= 0) { + headerRead = true; + chunked = + complete.toLowerCase().indexOf("transfer-encoding: chunked") >= 0; + var clIndex = complete.toLowerCase().indexOf("content-length: "); + if (clIndex >= 0) { + var endOfContentLength = complete.indexOf("\r\n", clIndex); + contentLength = parseInt( + complete.substring(clIndex + 15, endOfContentLength).toString() + ); + } + headerEnd += 4; + } + + if (chunked) { + if (complete.substring(complete.length - 5).toString() == "0\r\n\r\n") { + closeSocket(sockfd); + } + } + if (contentLength >= 0) { + if (completeLength - headerEnd == contentLength) { + closeSocket(sockfd); + } + } + }, + function () { + if (errorCB) { + errorCB("Could not load http://" + host + ":" + port + path); + } + }, + function () { + var startFrom = headerEnd; + var content = null; + + if (chunked) { + content = new StringBuffer(); + + do { + var chunkLengthEnd = complete.indexOf("\r\n", startFrom); + var lengthStr = complete + .substring(startFrom, chunkLengthEnd) + .toString(); + var chunkLength = parseInt(lengthStr, 16); + var chunkEnd = chunkLengthEnd + chunkLength + 2; + + content.append(complete.substring(chunkLengthEnd + 2, chunkEnd)); + startFrom = chunkEnd + 2; + } while (chunkLength > 0); + } else { + content = complete.substring(startFrom); + } + + var headers = complete.substring(0, headerEnd); + + if (successCB) { + successCB(content.toString(), headers.toString()); + } + //free complete for GC + content = null; + if (finishCB) { + finishCB(); + } + } + ); +} + +export class XMLHttpRequest { + private url?: AnchorElement; + private method: string = "GET"; + private reponseHeaders?: string; + private requestHeaders?: StringBuffer; + private status?: number; + private statusText?: string; + private responseURL?: string; + private responseText?: string; + + public onerror?: (error: string) => void; + public onload?: () => void; + + public send(body: string) { + var self = this; + if (this.url) { + httpClient( + this.url.protocol === "https:", + this.url.hostname, + this.url.port, + this.url.pathname + this.url.search, + this.method, + this.requestHeaders ? this.requestHeaders.toString() : undefined, + body, + function (data: string, responseHeaders: string) { + var r = responseHeaders.match(/^HTTP\/[0-9\.]+ ([0-9]+) (.*)/); + if (r) { + self.status = parseInt(r[1], 10); + self.statusText = r[2]; + self.responseURL = ""; + self.responseText = data; + self.reponseHeaders = responseHeaders.substring(r[0].length + 2); + if (self.onload) { + self.onload(); + } + } else { + if (self.onerror) { + self.onerror("Bad http status line."); + } + } + }, + function (error: string) { + console.error(error); + if (self.onerror) { + self.onerror(error); + } + } + ); + } else { + if (self.onerror) { + self.onerror("Url unset."); + } + } + } + + public getAllResponseHeaders() { + return this.reponseHeaders; + } + + public open(method: string, url: string) { + this.method = method; + this.url = urlparse(url); + + // check protocol + if (this.url.protocol !== "http:" && this.url.protocol !== "https:") { + throw Error( + "Unsupported protocol for esp32 fetch implementation: " + + this.url.protocol + ); + } + + // get default port + var port = parseInt(this.url.port, 10); + if (isNaN(port)) { + if (this.url.protocol === "https:") { + port = 443; + } else if (this.url.protocol === "http:") { + port = 80; + } else { + throw Error( + "Cannot determine default port for protocol " + this.url.protocol + ); + } + } + this.url.port = "" + port; + } + + public setRequestHeader(name: string, value: string) { + this.requestHeaders = this.requestHeaders || new StringBuffer(); + this.requestHeaders.append(name).append(": ").append(value).append("\r\n"); + } +} diff --git a/components/esp32-javascript/modules/esp32-javascript/index.js b/components/esp32-javascript/modules/esp32-javascript/index.js index c332a4c..0d20456 100644 --- a/components/esp32-javascript/modules/esp32-javascript/index.js +++ b/components/esp32-javascript/modules/esp32-javascript/index.js @@ -1,23 +1,16 @@ -console.info('Load global.js (NEW)...') +console.info('Load global.js (NEW)...'); require('./global.js'); - -console.info('Loading promise.js and exposing globals (NEW)...') +console.info('Loading promise.js and exposing globals (NEW)...'); global.Promise = require('./promise.js').Promise; - -console.info('Loading http.js and exposing globals (NEW)...') +console.info('Loading http.js and exposing globals (NEW)...'); global.XMLHttpRequest = require('./http').XMLHttpRequest; - -console.info('Loading fetch.js and exposing globals (NEW)...') +console.info('Loading fetch.js and exposing globals (NEW)...'); require('./fetch.js'); - -console.info('Loading boot.js and exposing main (NEW)...') +console.info('Loading boot.js and exposing main (NEW)...'); global.main = require('./boot').main; - -console.info('Loading socket-events (NEW)...') +console.info('Loading socket-events (NEW)...'); require('socket-events'); - -console.info('Loading wifi-events (NEW)...') +console.info('Loading wifi-events (NEW)...'); require('wifi-events'); - -console.info('Loading eventloop.js and starting eventloop (NEW)...') -require('./eventloop').start(); +console.info('Loading eventloop.js and starting eventloop (NEW)...'); +require('esp32-js-eventloop').start(); diff --git a/components/esp32-javascript/modules/esp32-javascript/index.ts b/components/esp32-javascript/modules/esp32-javascript/index.ts new file mode 100644 index 0000000..76a45fa --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/index.ts @@ -0,0 +1,23 @@ +console.info('Load global.js (NEW)...') +require('./global.js'); + +console.info('Loading promise.js and exposing globals (NEW)...') +global.Promise = require('./promise.js').Promise; + +console.info('Loading http.js and exposing globals (NEW)...') +global.XMLHttpRequest = require('./http').XMLHttpRequest; + +console.info('Loading fetch.js and exposing globals (NEW)...') +require('./fetch.js'); + +console.info('Loading boot.js and exposing main (NEW)...') +global.main = require('./boot').main; + +console.info('Loading socket-events (NEW)...') +require('socket-events'); + +console.info('Loading wifi-events (NEW)...') +require('wifi-events'); + +console.info('Loading eventloop.js and starting eventloop (NEW)...') +require('esp32-js-eventloop').start(); diff --git a/components/esp32-javascript/modules/esp32-javascript/require.d.ts b/components/esp32-javascript/modules/esp32-javascript/require.d.ts new file mode 100644 index 0000000..84e0981 --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/require.d.ts @@ -0,0 +1,2 @@ +declare var module: { exports: any }; +declare function require(moduleId: string): any; diff --git a/components/esp32-javascript/modules/esp32-javascript/stringbuffer.js b/components/esp32-javascript/modules/esp32-javascript/stringbuffer.js index 7e674ad..55db45f 100644 --- a/components/esp32-javascript/modules/esp32-javascript/stringbuffer.js +++ b/components/esp32-javascript/modules/esp32-javascript/stringbuffer.js @@ -1,94 +1,100 @@ -StringBuffer = function () { - this.content = []; - this.length = 0; -} -StringBuffer.prototype.toString = function () { - if (this.content.length === 1) { - return this.content[0]; - } - var s = this.content.join(''); - this.content = [s]; - return s; -} -StringBuffer.prototype.append = function (s) { - var str = s.toString(); - this.length += str.length; - this.content.push(s.toString()); - return this; -} -function reg(t, f) { - t.prototype[f] = function () { - return this.toString()[f].apply(this, arguments); - } -} -StringBuffer.prototype.substring = function (s, e) { - if (typeof e === 'undefined') { - e = this.length; - } - if (e < s) { - var b = s; - s = e; - e = b; - } - if (s > this.length) { - s = this.length; - } - if (e > this.length) { - e = this.length; - } - if (s < 0) { - s = 0; - } - if (e < 0) { - e = 0; - } - var ns = new StringBuffer(); - if (this.content.length > 0) { - var accs = 0; - var i = 0; - for (i = 0; i < this.content.length; i++) { - if (s <= accs + this.content[i].length) { - break; - } else { - accs += this.content[i].length; - } - } - var acce = 0; - var ei = 0; - for (ei = 0; ei < this.content.length; ei++) { - if (e <= acce + this.content[ei].length) { - break; - } else { - acce += this.content[ei].length; - } - } - if (i === ei) { - ns.append(this.content[i].substring(s - accs, e - acce)); - } else { - ns.append(this.content[i].substring(s - accs)); - this.content.slice(i + 1, ei).forEach(function (e) { - ns.append(e); - }); - - ns.append(this.content[ei].substring(0, e - acce)); - } - } - return ns; -} -StringBuffer.prototype.substr = function (s, l) { - if (s < 0) { - s += this.length; - } - if (s < 0) { - s = 0; - } - if (l < 0) { - l = 0; - } - return this.substring(s, s + l); -} -reg(StringBuffer, 'indexOf'); -reg(StringBuffer, 'toLowerCase'); -reg(StringBuffer, 'toUpperCase'); - -module.exports = StringBuffer; \ No newline at end of file +Object.defineProperty(exports, "__esModule", { value: true }); +var StringBuffer = /** @class */ (function () { + function StringBuffer() { + this.content = []; + this.length = 0; + } + StringBuffer.prototype.indexOf = function (searchString, position) { + return this.toString().indexOf(searchString, position); + }; + StringBuffer.prototype.toLowerCase = function () { + return this.toString().toLowerCase(); + }; + StringBuffer.prototype.toUpperCase = function () { + return this.toString().toUpperCase(); + }; + StringBuffer.prototype.toString = function () { + if (this.content.length === 1) { + return this.content[0]; + } + var s = this.content.join(""); + this.content = [s]; + return s; + }; + StringBuffer.prototype.append = function (s) { + var str = s.toString(); + this.length += str.length; + this.content.push(s.toString()); + return this; + }; + StringBuffer.prototype.substring = function (s, e) { + if (typeof e === "undefined") { + e = this.length; + } + if (e < s) { + var b = s; + s = e; + e = b; + } + if (s > this.length) { + s = this.length; + } + if (e > this.length) { + e = this.length; + } + if (s < 0) { + s = 0; + } + if (e < 0) { + e = 0; + } + var ns = new StringBuffer(); + if (this.content.length > 0) { + var accs = 0; + var i = 0; + for (i = 0; i < this.content.length; i++) { + if (s <= accs + this.content[i].length) { + break; + } + else { + accs += this.content[i].length; + } + } + var acce = 0; + var ei = 0; + for (ei = 0; ei < this.content.length; ei++) { + if (e <= acce + this.content[ei].length) { + break; + } + else { + acce += this.content[ei].length; + } + } + if (i === ei) { + ns.append(this.content[i].substring(s - accs, e - acce)); + } + else { + ns.append(this.content[i].substring(s - accs)); + this.content.slice(i + 1, ei).forEach(function (e) { + ns.append(e); + }); + ns.append(this.content[ei].substring(0, e - acce)); + } + } + return ns; + }; + StringBuffer.prototype.substr = function (s, l) { + if (s < 0) { + s += this.length; + } + if (s < 0) { + s = 0; + } + if (l < 0) { + l = 0; + } + return this.substring(s, s + l); + }; + return StringBuffer; +}()); +exports.default = StringBuffer; diff --git a/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts b/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts new file mode 100644 index 0000000..ba46384 --- /dev/null +++ b/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts @@ -0,0 +1,105 @@ +export default class StringBuffer { + private content: string[]; + public length: number; + + constructor() { + this.content = []; + this.length = 0; + } + + public indexOf(searchString: string, position?: number) { + return this.toString().indexOf(searchString, position); + } + + public toLowerCase() { + return this.toString().toLowerCase(); + } + + public toUpperCase() { + return this.toString().toUpperCase(); + } + + public toString() { + if (this.content.length === 1) { + return this.content[0]; + } + var s = this.content.join(""); + this.content = [s]; + return s; + } + + public append(s: StringBuffer | string) { + var str = s.toString(); + this.length += str.length; + this.content.push(s.toString()); + return this; + } + + public substring(s: number, e?: number) { + if (typeof e === "undefined") { + e = this.length; + } + if (e < s) { + var b = s; + s = e; + e = b; + } + if (s > this.length) { + s = this.length; + } + if (e > this.length) { + e = this.length; + } + if (s < 0) { + s = 0; + } + if (e < 0) { + e = 0; + } + var ns = new StringBuffer(); + if (this.content.length > 0) { + var accs = 0; + var i = 0; + for (i = 0; i < this.content.length; i++) { + if (s <= accs + this.content[i].length) { + break; + } else { + accs += this.content[i].length; + } + } + var acce = 0; + var ei = 0; + for (ei = 0; ei < this.content.length; ei++) { + if (e <= acce + this.content[ei].length) { + break; + } else { + acce += this.content[ei].length; + } + } + if (i === ei) { + ns.append(this.content[i].substring(s - accs, e - acce)); + } else { + ns.append(this.content[i].substring(s - accs)); + this.content.slice(i + 1, ei).forEach(function (e) { + ns.append(e); + }); + + ns.append(this.content[ei].substring(0, e - acce)); + } + } + return ns; + } + + public substr(s: number, l: number) { + if (s < 0) { + s += this.length; + } + if (s < 0) { + s = 0; + } + if (l < 0) { + l = 0; + } + return this.substring(s, s + l); + } +} diff --git a/components/esp32-javascript/modules/esp32-js-eventloop/index.js b/components/esp32-javascript/modules/esp32-js-eventloop/index.js new file mode 100644 index 0000000..d7b0ccc --- /dev/null +++ b/components/esp32-javascript/modules/esp32-js-eventloop/index.js @@ -0,0 +1,121 @@ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.start = exports.afterSuspendHandlers = exports.beforeSuspendHandlers = void 0; +errorhandler = + typeof errorhandler === "undefined" + ? function (error) { + console.error("Uncaught error:"); + console.error(error.stack || error); + } + : errorhandler; +var timers = []; +var intervals = []; +var handles = 0; +exports.beforeSuspendHandlers = []; +exports.afterSuspendHandlers = []; +function setTimeout(fn, timeout) { + var handle = el_createTimer(timeout); + timers.push({ + timeout: Date.now() + timeout, + fn: fn, + handle: handle, + installed: true, + }); + return handle; +} +function clearTimeout(handle) { + for (var i = 0; i < timers.length; i++) { + if (timers[i].handle === handle) { + var removed = timers.splice(i, 1); + if (removed[0].installed) { + el_removeTimer(handle); + } + } + } +} +function clearInterval(handle) { + var idx = intervals.indexOf(handle); + if (idx >= 0) { + intervals.splice(idx, 1); + } +} +function installIntervalTimeout(handle, fn, timeout) { + setTimeout(function () { + if (intervals.indexOf(handle) >= 0) { + fn(); + installIntervalTimeout(handle, fn, timeout); + } + }, timeout); +} +function setInterval(fn, timeout) { + var handle = handles++; + intervals.push(handle); + installIntervalTimeout(handle, fn, timeout); + return handle; +} +function el_select_next() { + if (exports.beforeSuspendHandlers) { + exports.beforeSuspendHandlers.forEach(function (h) { + h(); + }); + } + var events = el_suspend(); + var collected = []; + for (var evid = 0; evid < events.length; evid++) { + var evt = events[evid]; + console.debug("HANDLE EVENT: " + JSON.stringify(evt)); + if (evt.type === 0) { + //TIMER EVENT + var nextTimer = null; + for (var timerIdx = 0; timerIdx < timers.length; timerIdx++) { + if (timers[timerIdx].handle === evt.status) { + nextTimer = timers.splice(timerIdx, 1)[0]; + collected.push(nextTimer.fn); + } + } + if (!nextTimer) { + //throw Error('UNKNOWN TIMER HANDLE!!!'); + console.warn("UNKNOWN TIMER HANDLE:" + + JSON.stringify(evt) + + ";" + + JSON.stringify(timers)); + } + } + else { + var eventHandled = false; + if (exports.afterSuspendHandlers) { + exports.afterSuspendHandlers.forEach(function (handleCustomEvent) { + if (typeof handleCustomEvent === "function") { + eventHandled = eventHandled || handleCustomEvent(evt, collected); + } + }); + } + if (!eventHandled) { + throw Error("UNKNOWN eventType " + JSON.stringify(evt)); + } + } + } + return collected; +} +function start() { + var nextfuncs = [main]; + while (true) { + if (Array.isArray(nextfuncs)) { + nextfuncs.forEach(function (nf) { + if (typeof nf === "function") { + try { + nf(); + } + catch (error) { + errorhandler(error); + } + } + }); + } + nextfuncs = el_select_next(); + } +} +exports.start = start; +global.setTimeout = setTimeout; +global.clearTimeout = clearTimeout; +global.setInterval = setInterval; +global.clearInterval = clearInterval; diff --git a/components/esp32-javascript/modules/esp32-js-eventloop/index.ts b/components/esp32-javascript/modules/esp32-js-eventloop/index.ts new file mode 100644 index 0000000..77ef697 --- /dev/null +++ b/components/esp32-javascript/modules/esp32-js-eventloop/index.ts @@ -0,0 +1,144 @@ +interface Esp32JsTimer { + handle: number; + timeout: number; + fn: Function; + installed: boolean; +} + +type Esp32JsEventHandler = ( + event: Esp32JsEventloopEvent, + collected: Function[] +) => boolean; + +errorhandler = + typeof errorhandler === "undefined" + ? function (error) { + console.error("Uncaught error:"); + console.error(error.stack || error); + } + : errorhandler; + +var timers: Esp32JsTimer[] = []; +var intervals: number[] = []; +var handles = 0; +export var beforeSuspendHandlers: (() => void)[] = []; +export var afterSuspendHandlers: Esp32JsEventHandler[] = []; + +function setTimeout(fn: Function, timeout: number) { + var handle = el_createTimer(timeout); + timers.push({ + timeout: Date.now() + timeout, + fn: fn, + handle: handle, + installed: true, + }); + return handle; +} + +function clearTimeout(handle: number) { + for (var i = 0; i < timers.length; i++) { + if (timers[i].handle === handle) { + var removed = timers.splice(i, 1); + if (removed[0].installed) { + el_removeTimer(handle); + } + } + } +} + +function clearInterval(handle: number) { + var idx = intervals.indexOf(handle); + if (idx >= 0) { + intervals.splice(idx, 1); + } +} + +function installIntervalTimeout(handle: number, fn: Function, timeout: number) { + setTimeout(function () { + if (intervals.indexOf(handle) >= 0) { + fn(); + installIntervalTimeout(handle, fn, timeout); + } + }, timeout); +} + +function setInterval(fn: Function, timeout: number) { + var handle = handles++; + intervals.push(handle); + installIntervalTimeout(handle, fn, timeout); + return handle; +} + +function el_select_next() { + if (beforeSuspendHandlers) { + beforeSuspendHandlers.forEach(function (h) { + h(); + }); + } + + var events = el_suspend(); + + var collected: Function[] = []; + for (var evid = 0; evid < events.length; evid++) { + var evt = events[evid]; + console.debug("HANDLE EVENT: " + JSON.stringify(evt)); + if (evt.type === 0) { + //TIMER EVENT + var nextTimer = null; + for (var timerIdx = 0; timerIdx < timers.length; timerIdx++) { + if (timers[timerIdx].handle === evt.status) { + nextTimer = timers.splice(timerIdx, 1)[0]; + collected.push(nextTimer.fn); + } + } + if (!nextTimer) { + //throw Error('UNKNOWN TIMER HANDLE!!!'); + console.warn( + "UNKNOWN TIMER HANDLE:" + + JSON.stringify(evt) + + ";" + + JSON.stringify(timers) + ); + } + } else { + var eventHandled = false; + if (afterSuspendHandlers) { + afterSuspendHandlers.forEach(function ( + handleCustomEvent: Esp32JsEventHandler + ) { + if (typeof handleCustomEvent === "function") { + eventHandled = eventHandled || handleCustomEvent(evt, collected); + } + }); + } + + if (!eventHandled) { + throw Error("UNKNOWN eventType " + JSON.stringify(evt)); + } + } + } + return collected; +} + +export function start() { + var nextfuncs: Function[] = [main]; + while (true) { + if (Array.isArray(nextfuncs)) { + nextfuncs.forEach(function (nf) { + if (typeof nf === "function") { + try { + nf(); + } catch (error) { + errorhandler(error); + } + } + }); + } + nextfuncs = el_select_next(); + } +} + +global.setTimeout = setTimeout; +global.clearTimeout = clearTimeout; +global.setInterval = setInterval; +global.clearInterval = clearInterval; diff --git a/components/esp32-javascript/urlparse.js b/components/esp32-javascript/urlparse.js index 4aeb387..83e79be 100644 --- a/components/esp32-javascript/urlparse.js +++ b/components/esp32-javascript/urlparse.js @@ -1,120 +1,132 @@ var urlparse = function (absoluteUrl) { - var anchorElement = { - _protocol: '', - _hostname: '', - _port: '', - _pathname: '', - _search: '', - _hash: '', - resolve: function (rel) { - var result = urlparse(anchorElement.href); - if (rel.substr(0, 1) === '/') { - result.pathname = rel; - result.search = ''; - result.hash = ''; - } else { - var directoryPath = result.pathname; - if (!(!directoryPath || directoryPath.substr(directoryPath.length - 1, 1) === '/')) { - directoryPath = directoryPath.replace(/[^\/]+$/, ''); - } - result.pathname = directoryPath + rel; - } - return result; - } - }; - - var prependIf = function (str, prep) { - if (prep && !str.substring(0, prep.length) === prep) { - return prep + str; - } - return str; - } - - var protoFunc = function (prop, prep, wrap) { - return { - 'get': function () { - return anchorElement[prop]; - }, - 'set': function (value) { - value = '' + (wrap ? wrap(value) : value); - anchorElement[prop] = prependIf(value, prep); - } - } - } - - var calcRelative = function (path) { - var result = []; - var pathes = path.split('/'); - pathes.forEach(function (p, i) { - if (p === '..') { - result.pop(); - if (i === pathes.length - 1) { - result.push(''); - } - } else if (p === '.') { - if (i === pathes.length - 1) { - result.push(''); - } - } else { - result.push(p); - } - }) - return result.join('/'); - } - - Object.defineProperties(anchorElement, - { - 'href': { - 'get': function () { - var href = anchorElement.origin + anchorElement.pathname + anchorElement.search + anchorElement.hash; - return href; - }, - 'set': function (value) { - var result = (value + '').match(/^(([a-zA-Z]+\:)\/\/)?([^\:\/\?]+)?(:([0-9]+))?(\/[^#\?]+)?(\?[^#]+)?(#.+)?/) - if (result) { - anchorElement.protocol = result[2] || ''; - anchorElement.hostname = result[3] || ''; - anchorElement.port = result[5] || ''; - anchorElement.pathname = result[6] || '/'; - anchorElement.search = result[7] || ''; - anchorElement.hash = result[8] || ''; - } else { - throw Error('URL could not be parsed.'); - } - } - }, - 'protocol': protoFunc('_protocol'), - 'hostname': protoFunc('_hostname'), - 'port': protoFunc('_port'), - 'pathname': protoFunc('_pathname', '/', calcRelative), - 'search': protoFunc('_search', '?'), - 'hash': protoFunc('_hash', '#'), - 'host': - { - 'get': function () { - return anchorElement.hostname + (anchorElement.port ? ':' + anchorElement.port : ''); - }, - 'set': function (value) { - var result = (value + '').match(/^([^\:\/]+)(:[0-9]+)?/); - if (result) { - anchorElement._host = result[1]; - anchorElement._port = result[1]; - } else { - throw Error('host could not be parsed.'); - } - } - }, - 'origin': - { - 'get': function () { - return anchorElement.protocol + '//' + anchorElement.host; - }, - 'set': function (value) { - throw Error('cannot set origin'); - } - } - }); - - anchorElement.href = absoluteUrl; - return anchorElement; + var anchorElement = { + href: "", + origin: "", + protocol: "", + hostname: "", + host: "", + port: "", + pathname: "", + search: "", + hash: "", + _protocol: "", + _hostname: "", + _host: "", + _port: "", + _pathname: "", + _search: "", + _hash: "", + resolve: function (rel) { + var result = urlparse(anchorElement.href); + if (rel.substr(0, 1) === "/") { + result.pathname = rel; + result.search = ""; + result.hash = ""; + } + else { + var directoryPath = result.pathname; + if (!(!directoryPath || + directoryPath.substr(directoryPath.length - 1, 1) === "/")) { + directoryPath = directoryPath.replace(/[^\/]+$/, ""); + } + result.pathname = directoryPath + rel; + } + return result; + }, + }; + var prependIf = function (str, prep) { + if (prep && str.substring(0, prep.length) !== prep) { + return prep + str; + } + return str; + }; + var protoFunc = function (prop, prep, wrap) { + return { + get: function () { + return anchorElement[prop]; + }, + set: function (value) { + value = "" + (wrap ? wrap(value) : value); + anchorElement[prop] = prependIf(value, prep); + }, + }; + }; + var calcRelative = function (path) { + var result = []; + var pathes = path.split("/"); + pathes.forEach(function (p, i) { + if (p === "..") { + result.pop(); + if (i === pathes.length - 1) { + result.push(""); + } + } + else if (p === ".") { + if (i === pathes.length - 1) { + result.push(""); + } + } + else { + result.push(p); + } + }); + return result.join("/"); + }; + Object.defineProperties(anchorElement, { + href: { + get: function () { + var href = anchorElement.origin + + anchorElement.pathname + + anchorElement.search + + anchorElement.hash; + return href; + }, + set: function (value) { + var result = (value + "").match(/^(([a-zA-Z]+\:)\/\/)?([^\:\/\?]+)?(:([0-9]+))?(\/[^#\?]+)?(\?[^#]+)?(#.+)?/); + if (result) { + anchorElement.protocol = result[2] || ""; + anchorElement.hostname = result[3] || ""; + anchorElement.port = result[5] || ""; + anchorElement.pathname = result[6] || "/"; + anchorElement.search = result[7] || ""; + anchorElement.hash = result[8] || ""; + } + else { + throw Error("URL could not be parsed."); + } + }, + }, + protocol: protoFunc("_protocol"), + hostname: protoFunc("_hostname"), + port: protoFunc("_port"), + pathname: protoFunc("_pathname", "/", calcRelative), + search: protoFunc("_search", "?"), + hash: protoFunc("_hash", "#"), + host: { + get: function () { + return (anchorElement.hostname + + (anchorElement.port ? ":" + anchorElement.port : "")); + }, + set: function (value) { + var result = (value + "").match(/^([^\:\/]+)(:[0-9]+)?/); + if (result) { + anchorElement._host = result[1]; + anchorElement._port = result[1]; + } + else { + throw Error("host could not be parsed."); + } + }, + }, + origin: { + get: function () { + return anchorElement.protocol + "//" + anchorElement.host; + }, + set: function (value) { + throw Error("cannot set origin"); + }, + }, + }); + anchorElement.href = absoluteUrl; + return anchorElement; }; diff --git a/components/esp32-javascript/urlparse.ts b/components/esp32-javascript/urlparse.ts new file mode 100644 index 0000000..c090cea --- /dev/null +++ b/components/esp32-javascript/urlparse.ts @@ -0,0 +1,166 @@ +interface AnchorElement { + href: string; + pathname: string; + search: string; + hash: string; + origin: string; + protocol: string; + hostname: string; + host: string; + port: string; + resolve(rel: string): AnchorElement; + + _protocol: string; + _hostname: string; + _host: string; + _port: string; + _pathname: string; + _search: string; + _hash: string; +} + +var urlparse: (absoluteUrl: string) => AnchorElement = function (absoluteUrl) { + var anchorElement: AnchorElement = { + href: "", + origin: "", + protocol: "", + hostname: "", + host: "", + port: "", + pathname: "", + search: "", + hash: "", + _protocol: "", + _hostname: "", + _host: "", + _port: "", + _pathname: "", + _search: "", + _hash: "", + resolve: function (rel: string) { + var result = urlparse(anchorElement.href); + if (rel.substr(0, 1) === "/") { + result.pathname = rel; + result.search = ""; + result.hash = ""; + } else { + var directoryPath = result.pathname; + if ( + !( + !directoryPath || + directoryPath.substr(directoryPath.length - 1, 1) === "/" + ) + ) { + directoryPath = directoryPath.replace(/[^\/]+$/, ""); + } + result.pathname = directoryPath + rel; + } + return result; + }, + }; + + var prependIf = function (str: string, prep?: string) { + if (prep && str.substring(0, prep.length) !== prep) { + return prep + str; + } + return str; + }; + + var protoFunc = function ( + prop: string, + prep?: string, + wrap?: (value: string) => string + ) { + return { + get: function () { + return (anchorElement as any)[prop]; + }, + set: function (value: string) { + value = "" + (wrap ? wrap(value) : value); + (anchorElement as any)[prop] = prependIf(value, prep); + }, + }; + }; + + var calcRelative = function (path: string) { + var result: string[] = []; + var pathes = path.split("/"); + pathes.forEach(function (p, i) { + if (p === "..") { + result.pop(); + if (i === pathes.length - 1) { + result.push(""); + } + } else if (p === ".") { + if (i === pathes.length - 1) { + result.push(""); + } + } else { + result.push(p); + } + }); + return result.join("/"); + }; + + Object.defineProperties(anchorElement, { + href: { + get: function () { + var href = + anchorElement.origin + + anchorElement.pathname + + anchorElement.search + + anchorElement.hash; + return href; + }, + set: function (value) { + var result = (value + "").match( + /^(([a-zA-Z]+\:)\/\/)?([^\:\/\?]+)?(:([0-9]+))?(\/[^#\?]+)?(\?[^#]+)?(#.+)?/ + ); + if (result) { + anchorElement.protocol = result[2] || ""; + anchorElement.hostname = result[3] || ""; + anchorElement.port = result[5] || ""; + anchorElement.pathname = result[6] || "/"; + anchorElement.search = result[7] || ""; + anchorElement.hash = result[8] || ""; + } else { + throw Error("URL could not be parsed."); + } + }, + }, + protocol: protoFunc("_protocol"), + hostname: protoFunc("_hostname"), + port: protoFunc("_port"), + pathname: protoFunc("_pathname", "/", calcRelative), + search: protoFunc("_search", "?"), + hash: protoFunc("_hash", "#"), + host: { + get: function () { + return ( + anchorElement.hostname + + (anchorElement.port ? ":" + anchorElement.port : "") + ); + }, + set: function (value) { + var result = (value + "").match(/^([^\:\/]+)(:[0-9]+)?/); + if (result) { + anchorElement._host = result[1]; + anchorElement._port = result[1]; + } else { + throw Error("host could not be parsed."); + } + }, + }, + origin: { + get: function () { + return anchorElement.protocol + "//" + anchorElement.host; + }, + set: function (value) { + throw Error("cannot set origin"); + }, + }, + }); + + anchorElement.href = absoluteUrl; + return anchorElement; +}; diff --git a/components/socket-events/modules/socket-events/index.js b/components/socket-events/modules/socket-events/index.js index 0d21781..1d38987 100644 --- a/components/socket-events/modules/socket-events/index.js +++ b/components/socket-events/modules/socket-events/index.js @@ -1,218 +1,189 @@ -/** - * @module socket-events - */ - -/** -* Callback for connect event. -* -* @callback onConnectCB -* @param {module:socket-events~Socket} socket The socket. -* @returns {boolean} If the connection attempt should be retried. -*/ -/** - * Callback for data event. - * - * @callback onDataCB - * @param {string} data Data that was received on the socket. - * @param {number} sockfd The socket file descriptor. - * @param {number} length The length of the data. - */ -/** - * Callback for error event. - * - * @callback onErrorCB - * @param {number} sockfd The socket file descriptor. - */ -/** - * Callback for close event. - * - * @callback onCloseCB - * @param {number} sockfd The socket file descriptor. - */ - -var eventloop = require('esp32-javascript/eventloop'); -var beforeSuspendHandlers = eventloop.beforeSuspendHandlers; -var afterSuspendHandlers = eventloop.afterSuspendHandlers; - -/** - * An array which holds all active sockets. - * - * @type module:socket-events~Socket[] - */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sockListen = exports.sockConnect = exports.closeSocket = exports.sockets = void 0; +var esp32_js_eventloop_1 = require("esp32-js-eventloop"); +var sslClientCtx; exports.sockets = []; -var sockets = exports.sockets; - -sockets.pushNative = sockets.push; -sockets.push = function (items) { - sockets.pushNative(items); -} -sockets.find = function (predicate) { - for (var i = 0; i < sockets.length; i++) { - if (predicate(sockets[i])) { - return sockets[i]; - } - } -} +exports.sockets.pushNative = exports.sockets.push; +exports.sockets.push = function (item) { + exports.sockets.pushNative(item); +}; +exports.sockets.find = function (predicate) { + for (var i = 0; i < exports.sockets.length; i++) { + if (predicate(exports.sockets[i])) { + return exports.sockets[i]; + } + } +}; /** * @class */ -var Socket = function () { - this.defaultBufferSize = 3 * 1024; - this.dataBuffer = new Uint8Array(this.defaultBufferSize); - this.dataBufferSize = 0; - this.textEncoder = new TextEncoder(); - this.writebuffer = []; - - /** - * The socket file descriptor. - * @type {number} - */ - this.sockfd = null; - - /** - * The onData callback. - * @type {module:socket-events~onDataCB} - */ - this.onData = null; - this.onConnect = null; - this.onError = null; - this.onClose = null; - this.onWritable = null; - this.isConnected = false; - this.isError = false; - this.isListening = false; - this.ssl = null; - this.flushAlways = true; -} - +var Socket = /** @class */ (function () { + function Socket() { + this.defaultBufferSize = 3 * 1024; + this.dataBuffer = new Uint8Array(this.defaultBufferSize); + this.dataBufferSize = 0; + this.textEncoder = new TextEncoder(); + this.writebuffer = []; + /** + * The socket file descriptor. + * @type {number} + */ + this.sockfd = -1; + /** + * The onData callback. + * @type {module:socket-events~onDataCB} + */ + this.onAccept = null; + this.onData = null; + this.onConnect = null; + this.onError = null; + this.onClose = null; + this.onWritable = null; + this.isConnected = false; + this.isError = false; + this.isListening = false; + this.ssl = null; + this.flushAlways = true; + } + Socket.prototype.write = function (data) { + if (this.dataBuffer) { + if (typeof data === "undefined" || data === null) { + return; + } + else if (Array.isArray(data)) { + throw Error("arrays not allowed anymore"); + } + else if (typeof data === "string") { + // prevents size transmission problems for non-asci-data + data = this.textEncoder.encode(data); + } + else if (Object.prototype.toString.call(data) !== "[object Uint8Array]") { + throw Error("only strings and Uint8Array are supported"); + } + // data is now always Uint8Array + if (data.length + this.dataBufferSize > this.dataBuffer.length) { + this.flush(); + } + if (data.length > this.dataBuffer.length) { + // enlarge default buffer + this.dataBuffer = data; + } + else { + this.dataBuffer.set(data, this.dataBufferSize); + } + this.dataBufferSize += data.length; + } + }; + Socket.prototype.flush = function (cb) { + var onWritable = function (socket) { + socket.onWritable = null; + while (socket.writebuffer.length > 0) { + var entry = socket.writebuffer[0]; + var written = entry.written; + var data = entry.data; + var len = entry.len; + if (written < len) { + if (socket.sockfd === null) { + console.error("error writing to socket. not initialized."); + break; + } + else { + var ret = writeSocket(socket.sockfd, data, len - written, written, socket.ssl); + if (ret == 0) { + // eagain, return immediately and wait for futher onWritable calls + console.debug("eagain in onWritable, socket " + socket.sockfd); + // wait for next select when socket is writable + break; + } + if (ret >= 0) { + written += ret; + entry.written = written; + } + else { + console.error("error writing to socket:" + ret); + break; + } + } + } + if (written >= len) { + // remove entry because it has been written completely. + // pussy null + // socket.writebuffer[0] = null; + socket.writebuffer.shift(); + if (entry.cb) { + entry.cb(); + } + } + } + var bufferEmpty = socket.writebuffer.length === 0; + if (!bufferEmpty) { + socket.onWritable = onWritable; + } + return bufferEmpty; + }; + if (this.dataBufferSize > 0 && this.dataBuffer) { + this.writebuffer.push({ + data: this.dataBuffer, + written: 0, + len: this.dataBufferSize, + cb: cb, + }); + var writtenCompletely = onWritable(this); + if (!writtenCompletely) { + // if not written completely the buffer was stored in write queue + // and a new buffer must be created to prevent race conditions + this.dataBuffer = new Uint8Array(this.defaultBufferSize); + } + this.dataBufferSize = 0; + } + }; + return Socket; +}()); function getOrCreateNewSocket() { - return new Socket(); + return new Socket(); } - -Socket.prototype.write = function (data) { - if (this.dataBuffer) { - if (typeof data === 'undefined' || data === null) { - return; - } else if (Array.isArray(data)) { - throw Error('arrays not allowed anymore'); - } else if (typeof data === 'string' || typeof data === 'number') { - // prevents size transmission problems for non-asci-data - data = this.textEncoder.encode(data); - } else if (Object.prototype.toString.call(data) !== '[object Uint8Array]') { - throw Error('only strings and Uint8Array are supported'); - } - // data is now always Uint8Array - - if (data.length + this.dataBufferSize > this.dataBuffer.length) { - this.flush(); - } - if (data.length > this.dataBuffer.length) { // enlarge default buffer - this.dataBuffer = data; - } else { - this.dataBuffer.set(data, this.dataBufferSize); - } - this.dataBufferSize += data.length; - } -} - -Socket.prototype.flush = function (cb) { - var onWritable = function (socket) { - socket.onWritable = null; - - while (socket.writebuffer.length > 0) { - var entry = socket.writebuffer[0]; - var written = entry.written; - var data = entry.data; - var len = entry.len; - - if (written < len) { - var ret = writeSocket(socket.sockfd, data, len - written, written, socket.ssl); - if (ret == 0) { - // eagain, return immediately and wait for futher onWritable calls - console.debug('eagain in onWritable, socket ' + socket.sockfd); - // wait for next select when socket is writable - break; - } - if (ret >= 0) { - written += ret; - entry.written = written; - } else { - console.error('error writing to socket:' + ret); - break; - } - } - if (written >= len) { - // remove entry because it has been written completely. - // pussy null - socket.writebuffer[0] = null; - socket.writebuffer.shift(); - if (entry.cb) { - entry.cb(); - } - } - } - - var bufferEmpty = socket.writebuffer.length === 0; - if (!bufferEmpty) { - socket.onWritable = onWritable; - } - return bufferEmpty; - }; - - if (this.dataBufferSize > 0 && this.dataBuffer) { - this.writebuffer.push({ data: this.dataBuffer, written: 0, len: this.dataBufferSize, cb: cb }); - var writtenCompletely = onWritable(this); - if (!writtenCompletely) { - // if not written completely the buffer was stored in write queue - // and a new buffer must be created to prevent race conditions - this.dataBuffer = new Uint8Array(this.defaultBufferSize); - } - this.dataBufferSize = 0; - } -} - function performOnClose(socket) { - if (socket && socket.onClose) { - socket.onClose(); - } + if (socket && socket.onClose) { + socket.onClose(socket.sockfd); + } } - /** - * Flushes buffered writes, shutdowns SSL (if it is a secure socket), + * Flushes buffered writes, shutdowns SSL (if it is a secure socket), * close the socket, performs the close callback function, removes * socket from {@link module:socket-events.sockets}. - * + * * @param {(module:socket-events~Socket|number)} */ -exports.closeSocket = function (socketOrSockfd) { - var socket = null; - if (typeof socketOrSockfd === 'number') { - socket = sockets.find(function (s) { return s.sockfd === socketOrSockfd }); - } else if (typeof socketOrSockfd === 'object') { - socket = socketOrSockfd; - } - - if (!socket) { - throw Error('socket not found for closing!'); - } - - socket.flush(); - - if (socket.ssl) { - shutdownSSL(socket.ssl); - } - el_closeSocket(socket.sockfd); - if (socket.ssl) { - freeSSL(socket.ssl); - } - performOnClose(socket); - resetSocket(socket); +function closeSocket(socketOrSockfd) { + var socket = null; + if (typeof socketOrSockfd === "number") { + socket = exports.sockets.find(function (s) { + return s.sockfd === socketOrSockfd; + }); + } + else if (typeof socketOrSockfd === "object") { + socket = exports.sockets.find(function (s) { + return s.sockfd === socketOrSockfd.sockfd; + }); + } + if (!socket) { + throw Error("socket not found for closing!"); + } + socket.flush(); + if (socket.ssl) { + shutdownSSL(socket.ssl); + } + el_closeSocket(socket.sockfd); + if (socket.ssl) { + freeSSL(socket.ssl); + } + performOnClose(socket); + resetSocket(socket); } -var closeSocket = exports.closeSocket; - +exports.closeSocket = closeSocket; /** * Connects to specified host and port. - * + * * @param {boolean} ssl If we want to connect via SSL. * @param {string} host The remote hostname. * @param {number} port The remote port. @@ -220,186 +191,222 @@ var closeSocket = exports.closeSocket; * @param {module:socket-events~onDataCB} onData A callback which gets called on a data event. * @param {module:socket-events~onErrorCB} onError A callback which gets called on an error event. * @param {module:socket-events~onCloseCB} onClose A callback which gets called on a close event. - * + * * @returns {module:socket-events~Socket} The socket. */ -exports.sockConnect = function (ssl, host, port, onConnect, onData, onError, onClose) { - port = Number.parseInt(port, 10); - var sockfd = el_createNonBlockingSocket(); - el_connectNonBlocking(sockfd, host, port); - - var socket = getOrCreateNewSocket(); - socket.sockfd = sockfd; - socket.onData = onData; - socket.onConnect = onConnect; - socket.onError = onError; - socket.onClose = onClose; - socket.isConnected = false; - socket.isError = false; - socket.isListening = false; - socket.ssl = null; - - if (ssl) { - sslClientCtx = typeof sslClientCtx === 'undefined' ? createSSLClientContext() : sslClientCtx; - socket.ssl = createSSL(sslClientCtx, host); - socket.onConnect = function (skt) { - var result = connectSSL(skt.ssl, skt.sockfd); - if (result == 0) // retry - { - return true; - } else if (result < 0) { - console.error('error connecting ssl: ' + result); - closeSocket(socket); - } else { - return onConnect(skt); - } - } - } - - if (sockets.indexOf(socket) < 0) { - sockets.push(socket); - } - return socket; +function sockConnect(ssl, host, port, onConnect, onData, onError, onClose) { + var sockfd = el_createNonBlockingSocket(); + el_connectNonBlocking(sockfd, host, parseInt(port, 10)); + var socket = getOrCreateNewSocket(); + socket.sockfd = sockfd; + socket.onData = onData; + socket.onConnect = onConnect; + socket.onError = onError; + socket.onClose = onClose; + socket.isConnected = false; + socket.isError = false; + socket.isListening = false; + socket.ssl = null; + if (ssl) { + sslClientCtx = + typeof sslClientCtx === "undefined" + ? createSSLClientContext() + : sslClientCtx; + socket.ssl = createSSL(sslClientCtx, host); + socket.onConnect = function (skt) { + var result = connectSSL(skt.ssl, skt.sockfd); + if (result == 0) { + // retry + return true; + } + else if (result < 0) { + console.error("error connecting ssl: " + result); + closeSocket(socket); + return false; + } + else { + return onConnect(skt); + } + }; + } + if (exports.sockets.indexOf(socket) < 0) { + exports.sockets.push(socket); + } + return socket; } - -exports.sockListen = function (port, onAccept, onError, onClose, isSSL) { - port = Number.parseInt(port, 10); - var sslCtx = null; - if (isSSL) { - sslCtx = createSSLServerContext(); - } - - var sockfd = el_createNonBlockingSocket(); - var ret = el_bindAndListen(sockfd, port); - - - if (ret < 0) { - if (onError) { - onError(sockfd); - } - return null; - } else { - var socket = getOrCreateNewSocket(); - socket.sockfd = sockfd; - - socket.onAccept = function () { - var ssl = null; - if (isSSL) { - ssl = createSSL(sslCtx); - } - var newsockfd = el_acceptIncoming(sockfd); - if (newsockfd < 0) { - console.error('accept returned: ' + newsockfd) - onError(sockfd); - } else if (typeof newsockfd !== 'undefined') { //EAGAIN - var newSocket = getOrCreateNewSocket(); - newSocket.sockfd = newsockfd; - newSocket.isConnected = false; - newSocket.isError = false; - newSocket.isListening = false; - newSocket.ssl = ssl; - - if (sockets.indexOf(newSocket) < 0) { - sockets.push(newSocket); - } - if (onAccept) { - onAccept(newSocket); - } - if (isSSL) { - var sslConnected = acceptSSL(ssl, newsockfd); - if (sslConnected <= 0) { - closeSocket(newsockfd); - } - } - } else { - console.debug('EAGAIN received after accept...'); - } - }; - socket.onError = function (sockfd) { console.error('Default error handler: ' + sockfd) }; - socket.onClose = function (sockfd) { console.info('Default close handler: ' + sockfd) }; - socket.isConnected = true; - socket.isError = false; - socket.isListening = true; - - if (sockets.indexOf(socket) < 0) { - sockets.push(socket); - } - return socket; - } +exports.sockConnect = sockConnect; +function sockListen(port, onAccept, onError, onClose, isSSL) { + var sslCtx = null; + if (isSSL) { + sslCtx = createSSLServerContext(); + } + var sockfd = el_createNonBlockingSocket(); + var ret = el_bindAndListen(sockfd, parseInt("" + port, 10)); + if (ret < 0) { + if (onError) { + onError(sockfd); + } + return null; + } + else { + var socket = getOrCreateNewSocket(); + socket.sockfd = sockfd; + socket.onAccept = function () { + var ssl = null; + if (isSSL) { + ssl = createSSL(sslCtx); + } + var newsockfd = el_acceptIncoming(sockfd); + if (newsockfd < 0) { + console.error("accept returned: " + newsockfd); + onError(sockfd); + } + else if (typeof newsockfd !== "undefined") { + //EAGAIN + var newSocket = getOrCreateNewSocket(); + newSocket.sockfd = newsockfd; + newSocket.isConnected = false; + newSocket.isError = false; + newSocket.isListening = false; + newSocket.ssl = ssl; + if (exports.sockets.indexOf(newSocket) < 0) { + exports.sockets.push(newSocket); + } + if (onAccept) { + onAccept(newSocket); + } + if (isSSL) { + var sslConnected = acceptSSL(ssl, newsockfd); + if (sslConnected <= 0) { + closeSocket(newsockfd); + } + } + } + else { + console.debug("EAGAIN received after accept..."); + } + }; + socket.onError = function (sockfd) { + console.error("Default error handler: " + sockfd); + }; + socket.onClose = function (sockfd) { + console.info("Default close handler: " + sockfd); + }; + socket.isConnected = true; + socket.isError = false; + socket.isListening = true; + if (exports.sockets.indexOf(socket) < 0) { + exports.sockets.push(socket); + } + return socket; + } } - +exports.sockListen = sockListen; function resetSocket(socket) { - if (socket) { - sockets.splice(sockets.indexOf(socket), 1); - return; - } - throw Error('invalid sockfd'); + if (socket) { + exports.sockets.splice(exports.sockets.indexOf(socket), 1); + return; + } + throw Error("invalid sockfd"); } - function beforeSuspend() { - //collect sockets - function notConnectedFilter(s) { return !s.isConnected && !s.isListening } - function connectedFilter(s) { return s.isConnected } - function connectedWritableFilter(s) { return s.isConnected && s.onWritable } - function mapToSockfd(s) { return s.sockfd; }; - function validSocketsFilter(s) { return s.sockfd && !s.isError; } - - var validSockets = sockets.filter(validSocketsFilter); - var notConnectedSockets = validSockets.filter(notConnectedFilter).map(mapToSockfd); - var connectedSockets = validSockets.filter(connectedFilter).map(mapToSockfd); - var connectedWritableSockets = validSockets.filter(connectedWritableFilter).map(mapToSockfd); - - el_registerSocketEvents(notConnectedSockets, connectedSockets, connectedWritableSockets); + //collect sockets + function notConnectedFilter(s) { + return !s.isConnected && !s.isListening; + } + function connectedFilter(s) { + return s.isConnected; + } + function connectedWritableFilter(s) { + return s.isConnected && s.onWritable; + } + function mapToSockfd(s) { + return s.sockfd; + } + function validSocketsFilter(s) { + return s.sockfd && !s.isError; + } + var validSockets = exports.sockets.filter(validSocketsFilter); + var notConnectedSockets = validSockets + .filter(notConnectedFilter) + .map(mapToSockfd); + var connectedSockets = validSockets.filter(connectedFilter).map(mapToSockfd); + var connectedWritableSockets = validSockets + .filter(connectedWritableFilter) + .map(mapToSockfd); + el_registerSocketEvents(notConnectedSockets, connectedSockets, connectedWritableSockets); } - function afterSuspend(evt, collected) { - if (evt.type === EL_SOCKET_EVENT_TYPE) { - var findSocket = sockets.filter(function (s) { return s.sockfd === evt.fd; }); - var socket = findSocket[0]; - if (socket) { - if (evt.status === 0) //writable - { - if (!socket.isConnected && socket.onConnect) { - collected.push(function (socket) { - return function () { - var retry = socket.onConnect(socket); - socket.isConnected = !retry; - } - }(socket)); - } else if (!socket.isConnected) { - socket.isConnected = true; - } - if (socket.isConnected && socket.onWritable) { - collected.push(function (socket) { return function () { socket.onWritable(socket) } }(socket)); - } - } else if (evt.status === 1) //readable - { - if (socket.isListening && socket.onAccept) { - collected.push(socket.onAccept); - } else { - var result = readSocket(socket.sockfd, socket.ssl); - if (result === null || (result && typeof result.data === 'string' && result.length == 0)) { - closeSocket(socket.sockfd); - } else if (!result) { - console.debug('******** EAGAIN!!'); - } else { - if (socket.onData) { - collected.push(function (data, fd, length) { return function () { socket.onData(data, fd, length) } }(result.data, socket.sockfd, result.length)); - } - } - } - } else if (evt.status === 2) //error - { - socket.isError = true; - collected.push(function (sockfd) { return function () { socket.onError(sockfd) } }(socket.sockfd)); - } else { - throw Error('UNKNOWN socket event status ' + evt.status); - } - } - return true; - } - return false; + if (evt.type === EL_SOCKET_EVENT_TYPE) { + var findSocket = exports.sockets.filter(function (s) { + return s.sockfd === evt.fd; + }); + var socket = findSocket[0]; + if (socket) { + if (evt.status === 0) { + //writable + if (!socket.isConnected && socket.onConnect) { + collected.push((function (socket) { + return function () { + var retry = socket.onConnect(socket); + socket.isConnected = !retry; + }; + })(socket)); + } + else if (!socket.isConnected) { + socket.isConnected = true; + } + if (socket.isConnected && socket.onWritable) { + collected.push((function (socket) { + return function () { + socket.onWritable(socket); + }; + })(socket)); + } + } + else if (evt.status === 1) { + //readable + if (socket.isListening && socket.onAccept) { + collected.push(socket.onAccept); + } + else { + var result = readSocket(socket.sockfd, socket.ssl); + if (result === null || + (result && typeof result.data === "string" && result.length == 0)) { + closeSocket(socket.sockfd); + } + else if (!result) { + console.debug("******** EAGAIN!!"); + } + else { + if (socket.onData) { + collected.push((function (data, fd, length) { + return function () { + socket.onData(data, fd, length); + }; + })(result.data, socket.sockfd, result.length)); + } + } + } + } + else if (evt.status === 2) { + //error + socket.isError = true; + if (socket.onError) { + collected.push((function (sockfd) { + return function () { + socket.onError(sockfd); + }; + })(socket.sockfd)); + } + } + else { + throw Error("UNKNOWN socket event status " + evt.status); + } + } + return true; + } + return false; } - -beforeSuspendHandlers.push(beforeSuspend); -afterSuspendHandlers.push(afterSuspend); +esp32_js_eventloop_1.beforeSuspendHandlers.push(beforeSuspend); +esp32_js_eventloop_1.afterSuspendHandlers.push(afterSuspend); diff --git a/components/socket-events/modules/socket-events/index.ts b/components/socket-events/modules/socket-events/index.ts new file mode 100644 index 0000000..e356a0d --- /dev/null +++ b/components/socket-events/modules/socket-events/index.ts @@ -0,0 +1,527 @@ +import { + beforeSuspendHandlers, + afterSuspendHandlers, +} from "esp32-js-eventloop"; + +export type OnDataCB = (data: string, sockfd: number, length: number) => void; +export type OnConnectCB = (socket: Esp32JsSocket) => boolean | void; +export type OnErrorCB = (sockfd: number) => void; +export type OnCloseCB = (sockfd: number) => void; +export type OnAcceptCB = () => void; +export type OnWritableCB = (socket: Esp32JsSocket) => boolean; + +export interface Esp32JsSocket { + sockfd: number; + onAccept: OnAcceptCB | null; + onData: OnDataCB | null; + onConnect: OnConnectCB | null; + onError: OnErrorCB | null; + onWritable: OnWritableCB | null; + flush(cb?: () => void): void; + write(data: string | Uint8Array): void; + onClose: OnCloseCB | null; + ssl: any; + writebuffer: BufferEntry[]; +} + +var sslClientCtx: any; + +/** + * @module socket-events + */ + +/** + * Callback for connect event. + * + * @callback onConnectCB + * @param {module:socket-events~Socket} socket The socket. + * @returns {boolean} If the connection attempt should be retried. + */ +/** + * Callback for data event. + * + * @callback onDataCB + * @param {string} data Data that was received on the socket. + * @param {number} sockfd The socket file descriptor. + * @param {number} length The length of the data. + */ +/** + * Callback for error event. + * + * @callback onErrorCB + * @param {number} sockfd The socket file descriptor. + */ +/** + * Callback for close event. + * + * @callback onCloseCB + * @param {number} sockfd The socket file descriptor. + */ + +/** + * An array which holds all active sockets. + * + * @type module:socket-events~Socket[] + */ +interface SocketArrayFind { + find(predicate: (socket: Socket) => boolean): Socket; +} +export var sockets: Socket[] & SocketArrayFind = [] as any; + +(sockets as any).pushNative = sockets.push; +(sockets as any).push = function (item: Esp32JsSocket) { + (sockets as any).pushNative(item); +}; +(sockets as any).find = function (predicate: (socket: Socket) => boolean) { + for (var i = 0; i < sockets.length; i++) { + if (predicate(sockets[i])) { + return sockets[i]; + } + } +}; + +interface BufferEntry { + written: number; + data: Uint8Array; + len: number; + cb?: () => void; +} +/** + * @class + */ +class Socket implements Esp32JsSocket { + private defaultBufferSize = 3 * 1024; + private dataBuffer = new Uint8Array(this.defaultBufferSize); + private dataBufferSize = 0; + private textEncoder = new TextEncoder(); + public writebuffer: BufferEntry[] = []; + + /** + * The socket file descriptor. + * @type {number} + */ + public sockfd: number = -1; + + /** + * The onData callback. + * @type {module:socket-events~onDataCB} + */ + public onAccept: OnAcceptCB | null = null; + public onData: OnDataCB | null = null; + public onConnect: OnConnectCB | null = null; + public onError: OnErrorCB | null = null; + public onClose: OnCloseCB | null = null; + public onWritable: OnWritableCB | null = null; + public isConnected: boolean = false; + public isError: boolean = false; + public isListening: boolean = false; + public ssl: any = null; + public flushAlways: boolean = true; + + public write(data: string | Uint8Array) { + if (this.dataBuffer) { + if (typeof data === "undefined" || data === null) { + return; + } else if (Array.isArray(data)) { + throw Error("arrays not allowed anymore"); + } else if (typeof data === "string") { + // prevents size transmission problems for non-asci-data + data = this.textEncoder.encode(data); + } else if ( + Object.prototype.toString.call(data) !== "[object Uint8Array]" + ) { + throw Error("only strings and Uint8Array are supported"); + } + // data is now always Uint8Array + + if (data.length + this.dataBufferSize > this.dataBuffer.length) { + this.flush(); + } + if (data.length > this.dataBuffer.length) { + // enlarge default buffer + this.dataBuffer = data; + } else { + this.dataBuffer.set(data, this.dataBufferSize); + } + this.dataBufferSize += data.length; + } + } + + public flush(cb?: () => void) { + var onWritable: OnWritableCB = function (socket: Esp32JsSocket) { + socket.onWritable = null; + + while (socket.writebuffer.length > 0) { + var entry = socket.writebuffer[0]; + var written = entry.written; + var data = entry.data; + var len = entry.len; + + if (written < len) { + if (socket.sockfd === null) { + console.error("error writing to socket. not initialized."); + break; + } else { + var ret = writeSocket( + socket.sockfd, + data, + len - written, + written, + socket.ssl + ); + if (ret == 0) { + // eagain, return immediately and wait for futher onWritable calls + console.debug("eagain in onWritable, socket " + socket.sockfd); + // wait for next select when socket is writable + break; + } + if (ret >= 0) { + written += ret; + entry.written = written; + } else { + console.error("error writing to socket:" + ret); + break; + } + } + } + if (written >= len) { + // remove entry because it has been written completely. + // pussy null + // socket.writebuffer[0] = null; + socket.writebuffer.shift(); + if (entry.cb) { + entry.cb(); + } + } + } + + var bufferEmpty = socket.writebuffer.length === 0; + if (!bufferEmpty) { + socket.onWritable = onWritable; + } + return bufferEmpty; + }; + + if (this.dataBufferSize > 0 && this.dataBuffer) { + this.writebuffer.push({ + data: this.dataBuffer, + written: 0, + len: this.dataBufferSize, + cb: cb, + }); + var writtenCompletely = onWritable(this); + if (!writtenCompletely) { + // if not written completely the buffer was stored in write queue + // and a new buffer must be created to prevent race conditions + this.dataBuffer = new Uint8Array(this.defaultBufferSize); + } + this.dataBufferSize = 0; + } + } +} + +function getOrCreateNewSocket() { + return new Socket(); +} + +function performOnClose(socket: Esp32JsSocket) { + if (socket && socket.onClose) { + socket.onClose(socket.sockfd); + } +} + +/** + * Flushes buffered writes, shutdowns SSL (if it is a secure socket), + * close the socket, performs the close callback function, removes + * socket from {@link module:socket-events.sockets}. + * + * @param {(module:socket-events~Socket|number)} + */ + +export function closeSocket(socketOrSockfd: Esp32JsSocket | number): void { + var socket: Socket | null = null; + if (typeof socketOrSockfd === "number") { + socket = sockets.find(function (s) { + return s.sockfd === socketOrSockfd; + }); + } else if (typeof socketOrSockfd === "object") { + socket = sockets.find(function (s) { + return s.sockfd === socketOrSockfd.sockfd; + }); + } + + if (!socket) { + throw Error("socket not found for closing!"); + } + + socket.flush(); + + if (socket.ssl) { + shutdownSSL(socket.ssl); + } + el_closeSocket(socket.sockfd); + if (socket.ssl) { + freeSSL(socket.ssl); + } + performOnClose(socket); + resetSocket(socket); +} + +/** + * Connects to specified host and port. + * + * @param {boolean} ssl If we want to connect via SSL. + * @param {string} host The remote hostname. + * @param {number} port The remote port. + * @param {module:socket-events~onConnectCB} onConnect A callback which gets called on connect event. + * @param {module:socket-events~onDataCB} onData A callback which gets called on a data event. + * @param {module:socket-events~onErrorCB} onError A callback which gets called on an error event. + * @param {module:socket-events~onCloseCB} onClose A callback which gets called on a close event. + * + * @returns {module:socket-events~Socket} The socket. + */ +export function sockConnect( + ssl: boolean, + host: string, + port: string, + onConnect: OnConnectCB, + onData: (data: string, sockfd: number, length: number) => void, + onError: (sockfd: number) => void, + onClose: () => void +): Esp32JsSocket { + var sockfd = el_createNonBlockingSocket(); + el_connectNonBlocking(sockfd, host, parseInt(port, 10)); + + var socket = getOrCreateNewSocket(); + socket.sockfd = sockfd; + socket.onData = onData; + socket.onConnect = onConnect; + socket.onError = onError; + socket.onClose = onClose; + socket.isConnected = false; + socket.isError = false; + socket.isListening = false; + socket.ssl = null; + + if (ssl) { + sslClientCtx = + typeof sslClientCtx === "undefined" + ? createSSLClientContext() + : sslClientCtx; + socket.ssl = createSSL(sslClientCtx, host); + socket.onConnect = function (skt) { + var result = connectSSL(skt.ssl, skt.sockfd); + if (result == 0) { + // retry + return true; + } else if (result < 0) { + console.error("error connecting ssl: " + result); + closeSocket(socket); + return false; + } else { + return onConnect(skt); + } + }; + } + + if (sockets.indexOf(socket) < 0) { + sockets.push(socket); + } + return socket; +} + +export function sockListen( + port: string | number, + onAccept: (socket: Esp32JsSocket) => void, + onError: (sockfd: number) => void, + onClose: (sockfd: number) => void, + isSSL: boolean +): Esp32JsSocket | null { + var sslCtx: any = null; + if (isSSL) { + sslCtx = createSSLServerContext(); + } + + var sockfd = el_createNonBlockingSocket(); + var ret = el_bindAndListen(sockfd, parseInt("" + port, 10)); + + if (ret < 0) { + if (onError) { + onError(sockfd); + } + return null; + } else { + var socket = getOrCreateNewSocket(); + socket.sockfd = sockfd; + + socket.onAccept = function () { + var ssl = null; + if (isSSL) { + ssl = createSSL(sslCtx); + } + var newsockfd = el_acceptIncoming(sockfd); + if (newsockfd < 0) { + console.error("accept returned: " + newsockfd); + onError(sockfd); + } else if (typeof newsockfd !== "undefined") { + //EAGAIN + var newSocket = getOrCreateNewSocket(); + newSocket.sockfd = newsockfd; + newSocket.isConnected = false; + newSocket.isError = false; + newSocket.isListening = false; + newSocket.ssl = ssl; + + if (sockets.indexOf(newSocket) < 0) { + sockets.push(newSocket); + } + if (onAccept) { + onAccept(newSocket); + } + if (isSSL) { + var sslConnected = acceptSSL(ssl, newsockfd); + if (sslConnected <= 0) { + closeSocket(newsockfd); + } + } + } else { + console.debug("EAGAIN received after accept..."); + } + }; + socket.onError = function (sockfd) { + console.error("Default error handler: " + sockfd); + }; + socket.onClose = function (sockfd: number) { + console.info("Default close handler: " + sockfd); + }; + socket.isConnected = true; + socket.isError = false; + socket.isListening = true; + + if (sockets.indexOf(socket) < 0) { + sockets.push(socket); + } + return socket; + } +} + +function resetSocket(socket: Socket) { + if (socket) { + sockets.splice(sockets.indexOf(socket), 1); + return; + } + throw Error("invalid sockfd"); +} + +function beforeSuspend() { + //collect sockets + function notConnectedFilter(s: Socket) { + return !s.isConnected && !s.isListening; + } + function connectedFilter(s: Socket) { + return s.isConnected; + } + function connectedWritableFilter(s: Socket) { + return s.isConnected && s.onWritable; + } + function mapToSockfd(s: Socket) { + return s.sockfd; + } + function validSocketsFilter(s: Socket) { + return s.sockfd && !s.isError; + } + + var validSockets = sockets.filter(validSocketsFilter); + var notConnectedSockets = validSockets + .filter(notConnectedFilter) + .map(mapToSockfd); + var connectedSockets = validSockets.filter(connectedFilter).map(mapToSockfd); + var connectedWritableSockets = validSockets + .filter(connectedWritableFilter) + .map(mapToSockfd); + + el_registerSocketEvents( + notConnectedSockets, + connectedSockets, + connectedWritableSockets + ); +} + +function afterSuspend(evt: Esp32JsEventloopEvent, collected: Function[]) { + if (evt.type === EL_SOCKET_EVENT_TYPE) { + var findSocket = sockets.filter(function (s) { + return s.sockfd === evt.fd; + }); + var socket = findSocket[0]; + if (socket) { + if (evt.status === 0) { + //writable + if (!socket.isConnected && socket.onConnect) { + collected.push( + (function (socket) { + return function () { + var retry = (socket.onConnect as OnConnectCB)(socket); + socket.isConnected = !retry; + }; + })(socket) + ); + } else if (!socket.isConnected) { + socket.isConnected = true; + } + if (socket.isConnected && socket.onWritable) { + collected.push( + (function (socket) { + return function () { + (socket.onWritable as OnWritableCB)(socket); + }; + })(socket) + ); + } + } else if (evt.status === 1) { + //readable + if (socket.isListening && socket.onAccept) { + collected.push(socket.onAccept); + } else { + var result = readSocket(socket.sockfd, socket.ssl); + if ( + result === null || + (result && typeof result.data === "string" && result.length == 0) + ) { + closeSocket(socket.sockfd); + } else if (!result) { + console.debug("******** EAGAIN!!"); + } else { + if (socket.onData) { + collected.push( + (function (data, fd, length) { + return function () { + (socket.onData as OnDataCB)(data, fd, length); + }; + })(result.data, socket.sockfd, result.length) + ); + } + } + } + } else if (evt.status === 2) { + //error + socket.isError = true; + if (socket.onError) { + collected.push( + (function (sockfd) { + return function () { + (socket.onError as OnErrorCB)(sockfd); + }; + })(socket.sockfd) + ); + } + } else { + throw Error("UNKNOWN socket event status " + evt.status); + } + } + return true; + } + return false; +} + +beforeSuspendHandlers.push(beforeSuspend); +afterSuspendHandlers.push(afterSuspend); diff --git a/components/wifi-events/modules/wifi-events/index.js b/components/wifi-events/modules/wifi-events/index.js index 08afc75..3ba8953 100644 --- a/components/wifi-events/modules/wifi-events/index.js +++ b/components/wifi-events/modules/wifi-events/index.js @@ -1,61 +1,64 @@ -/** - * @module wifi-events - */ - -var eventloop = require('esp32-javascript/eventloop'); -var afterSuspendHandlers = eventloop.afterSuspendHandlers; - +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getBssid = exports.createSoftAp = exports.connectWifi = void 0; +var esp32_js_eventloop_1 = require("esp32-js-eventloop"); var wifi = undefined; - /** * Callback for wifi status. * * @callback wifiStatusCallback * @param status - The connection status. */ - /** * Connect to AP with given ssid and password. - * + * * @param ssid The ssid of the wifi network. * @param password The password of the wifi network. * @param {wifiStatusCallback} callback A cb which gets the connect status updates. */ -exports.connectWifi = function (ssid, password, callback) { - wifi = { - status: callback, - }; - el_connectWifi(ssid, password); +function connectWifi(ssid, password, callback) { + wifi = { + status: callback, + }; + el_connectWifi(ssid, password); } - +exports.connectWifi = connectWifi; /** * Create soft AP with given ssid and password. - * + * * @param ssid The ssid of the wifi network. * @param password The password of the wifi network. * @param {wifiStatusCallback} callback A cb which gets the connect status updates. */ -exports.createSoftAp = function (ssid, password, callback) { - wifi = { - status: callback, - }; - el_createSoftAp(ssid, password); +function createSoftAp(ssid, password, callback) { + wifi = { + status: callback, + }; + el_createSoftAp(ssid, password); } - +exports.createSoftAp = createSoftAp; /** * Get the bssid of the current connected wifi AP as formatted as hex string. * @returns The bssid. */ -exports.getBssid = function () { - return getWifiConfig().bssid.map(function (n) { return n.toString(16) }).join(':'); +function getBssid() { + return getWifiConfig() + .bssid.map(function (n) { + return n.toString(16); + }) + .join(":"); } - +exports.getBssid = getBssid; function afterSuspend(evt, collected) { - if (evt.type === EL_WIFI_EVENT_TYPE) { - collected.push(function (evt) { return function () { wifi.status(evt) } }(evt)); - return true; - } - return false + if (evt.type === EL_WIFI_EVENT_TYPE) { + collected.push((function (evt) { + return function () { + if (wifi) { + wifi.status(evt); + } + }; + })(evt)); + return true; + } + return false; } - -afterSuspendHandlers.push(afterSuspend); +esp32_js_eventloop_1.afterSuspendHandlers.push(afterSuspend); diff --git a/components/wifi-events/modules/wifi-events/index.ts b/components/wifi-events/modules/wifi-events/index.ts new file mode 100644 index 0000000..6b4d2c4 --- /dev/null +++ b/components/wifi-events/modules/wifi-events/index.ts @@ -0,0 +1,88 @@ +import { afterSuspendHandlers } from "esp32-js-eventloop"; + +/** + * @module wifi-events + */ +interface Esp32JsWifiEvent { + status: number; +} + +interface Esp32JsWifi { + status: (event: Esp32JsWifiEvent) => void; +} + +var wifi: Esp32JsWifi | undefined = undefined; + +/** + * Callback for wifi status. + * + * @callback wifiStatusCallback + * @param status - The connection status. + */ + +/** + * Connect to AP with given ssid and password. + * + * @param ssid The ssid of the wifi network. + * @param password The password of the wifi network. + * @param {wifiStatusCallback} callback A cb which gets the connect status updates. + */ + +export function connectWifi( + ssid: string, + password: string, + callback: (event: Esp32JsWifiEvent) => void +): void { + wifi = { + status: callback, + }; + el_connectWifi(ssid, password); +} + +/** + * Create soft AP with given ssid and password. + * + * @param ssid The ssid of the wifi network. + * @param password The password of the wifi network. + * @param {wifiStatusCallback} callback A cb which gets the connect status updates. + */ +export function createSoftAp( + ssid: string, + password: string, + callback: (event: Esp32JsWifiEvent) => void +): void { + wifi = { + status: callback, + }; + el_createSoftAp(ssid, password); +} + +/** + * Get the bssid of the current connected wifi AP as formatted as hex string. + * @returns The bssid. + */ +export function getBssid() { + return getWifiConfig() + .bssid.map(function (n) { + return n.toString(16); + }) + .join(":"); +} + +function afterSuspend(evt: Esp32JsEventloopEvent, collected: Function[]) { + if (evt.type === EL_WIFI_EVENT_TYPE) { + collected.push( + (function (evt) { + return function () { + if (wifi) { + wifi.status(evt); + } + }; + })(evt) + ); + return true; + } + return false; +} + +afterSuspendHandlers.push(afterSuspend); diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..93f33a6 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,19 @@ +[esp32-javascript](README.md) + +# esp32-javascript + +## Index + +### Modules + +* ["esp32-javascript/modules/esp32-javascript/boot"](modules/_esp32_javascript_modules_esp32_javascript_boot_.md) +* ["esp32-javascript/modules/esp32-javascript/config"](modules/_esp32_javascript_modules_esp32_javascript_config_.md) +* ["esp32-javascript/modules/esp32-javascript/configserver"](modules/_esp32_javascript_modules_esp32_javascript_configserver_.md) +* ["esp32-javascript/modules/esp32-javascript/global"](modules/_esp32_javascript_modules_esp32_javascript_global_.md) +* ["esp32-javascript/modules/esp32-javascript/http"](modules/_esp32_javascript_modules_esp32_javascript_http_.md) +* ["esp32-javascript/modules/esp32-javascript/index"](modules/_esp32_javascript_modules_esp32_javascript_index_.md) +* ["esp32-javascript/modules/esp32-javascript/stringbuffer"](modules/_esp32_javascript_modules_esp32_javascript_stringbuffer_.md) +* ["esp32-javascript/modules/esp32-js-eventloop/index"](modules/_esp32_javascript_modules_esp32_js_eventloop_index_.md) +* ["esp32-javascript/urlparse"](modules/_esp32_javascript_urlparse_.md) +* ["socket-events/modules/socket-events/index"](modules/_socket_events_modules_socket_events_index_.md) +* ["wifi-events/modules/wifi-events/index"](modules/_wifi_events_modules_wifi_events_index_.md) diff --git a/docs/classes/_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md b/docs/classes/_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md new file mode 100644 index 0000000..37d3fda --- /dev/null +++ b/docs/classes/_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md @@ -0,0 +1,169 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/http"](../modules/_esp32_javascript_modules_esp32_javascript_http_.md) › [XMLHttpRequest](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md) + +# Class: XMLHttpRequest + +## Hierarchy + +* **XMLHttpRequest** + +## Index + +### Properties + +* [method](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-method) +* [onerror](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#optional-onerror) +* [onload](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#optional-onload) +* [reponseHeaders](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-reponseheaders) +* [requestHeaders](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-requestheaders) +* [responseText](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-responsetext) +* [responseURL](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-responseurl) +* [status](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-status) +* [statusText](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-statustext) +* [url](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#private-optional-url) + +### Methods + +* [getAllResponseHeaders](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#getallresponseheaders) +* [open](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#open) +* [send](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#send) +* [setRequestHeader](_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md#setrequestheader) + +## Properties + +### `Private` method + +• **method**: *string* = "GET" + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:284](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L284)* + +___ + +### `Optional` onerror + +• **onerror**? : *undefined | function* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:292](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L292)* + +___ + +### `Optional` onload + +• **onload**? : *undefined | function* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:293](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L293)* + +___ + +### `Private` `Optional` reponseHeaders + +• **reponseHeaders**? : *undefined | string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:285](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L285)* + +___ + +### `Private` `Optional` requestHeaders + +• **requestHeaders**? : *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:286](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L286)* + +___ + +### `Private` `Optional` responseText + +• **responseText**? : *undefined | string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:290](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L290)* + +___ + +### `Private` `Optional` responseURL + +• **responseURL**? : *undefined | string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:289](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L289)* + +___ + +### `Private` `Optional` status + +• **status**? : *undefined | number* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:287](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L287)* + +___ + +### `Private` `Optional` statusText + +• **statusText**? : *undefined | string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:288](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L288)* + +___ + +### `Private` `Optional` url + +• **url**? : *[AnchorElement](../interfaces/_esp32_javascript_urlparse_.anchorelement.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:283](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L283)* + +## Methods + +### getAllResponseHeaders + +▸ **getAllResponseHeaders**(): *undefined | string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:337](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L337)* + +**Returns:** *undefined | string* + +___ + +### open + +▸ **open**(`method`: string, `url`: string): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:341](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L341)* + +**Parameters:** + +Name | Type | +------ | ------ | +`method` | string | +`url` | string | + +**Returns:** *void* + +___ + +### send + +▸ **send**(`body`: string): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:295](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L295)* + +**Parameters:** + +Name | Type | +------ | ------ | +`body` | string | + +**Returns:** *void* + +___ + +### setRequestHeader + +▸ **setRequestHeader**(`name`: string, `value`: string): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:369](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L369)* + +**Parameters:** + +Name | Type | +------ | ------ | +`name` | string | +`value` | string | + +**Returns:** *void* diff --git a/docs/classes/_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md b/docs/classes/_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md new file mode 100644 index 0000000..bcc6da2 --- /dev/null +++ b/docs/classes/_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md @@ -0,0 +1,151 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/stringbuffer"](../modules/_esp32_javascript_modules_esp32_javascript_stringbuffer_.md) › [StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md) + +# Class: StringBuffer + +## Hierarchy + +* **StringBuffer** + +## Index + +### Constructors + +* [constructor](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#constructor) + +### Properties + +* [content](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#private-content) +* [length](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#length) + +### Methods + +* [append](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#append) +* [indexOf](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#indexof) +* [substr](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#substr) +* [substring](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#substring) +* [toLowerCase](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#tolowercase) +* [toString](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#tostring) +* [toUpperCase](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md#touppercase) + +## Constructors + +### constructor + +\+ **new StringBuffer**(): *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:3](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L3)* + +**Returns:** *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)* + +## Properties + +### `Private` content + +• **content**: *string[]* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:2](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L2)* + +___ + +### length + +• **length**: *number* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:3](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L3)* + +## Methods + +### append + +▸ **append**(`s`: [StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md) | string): *this* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:31](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L31)* + +**Parameters:** + +Name | Type | +------ | ------ | +`s` | [StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md) | string | + +**Returns:** *this* + +___ + +### indexOf + +▸ **indexOf**(`searchString`: string, `position?`: undefined | number): *number* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:10](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L10)* + +**Parameters:** + +Name | Type | +------ | ------ | +`searchString` | string | +`position?` | undefined | number | + +**Returns:** *number* + +___ + +### substr + +▸ **substr**(`s`: number, `l`: number): *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)‹›* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:93](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L93)* + +**Parameters:** + +Name | Type | +------ | ------ | +`s` | number | +`l` | number | + +**Returns:** *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)‹›* + +___ + +### substring + +▸ **substring**(`s`: number, `e?`: undefined | number): *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)‹›* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:38](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L38)* + +**Parameters:** + +Name | Type | +------ | ------ | +`s` | number | +`e?` | undefined | number | + +**Returns:** *[StringBuffer](_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md)‹›* + +___ + +### toLowerCase + +▸ **toLowerCase**(): *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:14](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L14)* + +**Returns:** *string* + +___ + +### toString + +▸ **toString**(): *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:22](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L22)* + +**Returns:** *string* + +___ + +### toUpperCase + +▸ **toUpperCase**(): *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/stringbuffer.ts:18](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/stringbuffer.ts#L18)* + +**Returns:** *string* diff --git a/docs/classes/_socket_events_modules_socket_events_index_.socket.md b/docs/classes/_socket_events_modules_socket_events_index_.socket.md new file mode 100644 index 0000000..77c3c09 --- /dev/null +++ b/docs/classes/_socket_events_modules_socket_events_index_.socket.md @@ -0,0 +1,236 @@ +[esp32-javascript](../README.md) › ["socket-events/modules/socket-events/index"](../modules/_socket_events_modules_socket_events_index_.md) › [Socket](_socket_events_modules_socket_events_index_.socket.md) + +# Class: Socket + +**`class`** + +## Hierarchy + +* **Socket** + +## Implements + +* [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) + +## Index + +### Properties + +* [dataBuffer](_socket_events_modules_socket_events_index_.socket.md#private-databuffer) +* [dataBufferSize](_socket_events_modules_socket_events_index_.socket.md#private-databuffersize) +* [defaultBufferSize](_socket_events_modules_socket_events_index_.socket.md#private-defaultbuffersize) +* [flushAlways](_socket_events_modules_socket_events_index_.socket.md#flushalways) +* [isConnected](_socket_events_modules_socket_events_index_.socket.md#isconnected) +* [isError](_socket_events_modules_socket_events_index_.socket.md#iserror) +* [isListening](_socket_events_modules_socket_events_index_.socket.md#islistening) +* [onAccept](_socket_events_modules_socket_events_index_.socket.md#onaccept) +* [onClose](_socket_events_modules_socket_events_index_.socket.md#onclose) +* [onConnect](_socket_events_modules_socket_events_index_.socket.md#onconnect) +* [onData](_socket_events_modules_socket_events_index_.socket.md#ondata) +* [onError](_socket_events_modules_socket_events_index_.socket.md#onerror) +* [onWritable](_socket_events_modules_socket_events_index_.socket.md#onwritable) +* [sockfd](_socket_events_modules_socket_events_index_.socket.md#sockfd) +* [ssl](_socket_events_modules_socket_events_index_.socket.md#ssl) +* [textEncoder](_socket_events_modules_socket_events_index_.socket.md#private-textencoder) +* [writebuffer](_socket_events_modules_socket_events_index_.socket.md#writebuffer) + +### Methods + +* [flush](_socket_events_modules_socket_events_index_.socket.md#flush) +* [write](_socket_events_modules_socket_events_index_.socket.md#write) + +## Properties + +### `Private` dataBuffer + +• **dataBuffer**: *Uint8Array‹›* = new Uint8Array(this.defaultBufferSize) + +*Defined in [socket-events/modules/socket-events/index.ts:94](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L94)* + +___ + +### `Private` dataBufferSize + +• **dataBufferSize**: *number* = 0 + +*Defined in [socket-events/modules/socket-events/index.ts:95](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L95)* + +___ + +### `Private` defaultBufferSize + +• **defaultBufferSize**: *number* = 3 * 1024 + +*Defined in [socket-events/modules/socket-events/index.ts:93](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L93)* + +___ + +### flushAlways + +• **flushAlways**: *boolean* = true + +*Defined in [socket-events/modules/socket-events/index.ts:119](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L119)* + +___ + +### isConnected + +• **isConnected**: *boolean* = false + +*Defined in [socket-events/modules/socket-events/index.ts:115](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L115)* + +___ + +### isError + +• **isError**: *boolean* = false + +*Defined in [socket-events/modules/socket-events/index.ts:116](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L116)* + +___ + +### isListening + +• **isListening**: *boolean* = false + +*Defined in [socket-events/modules/socket-events/index.ts:117](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L117)* + +___ + +### onAccept + +• **onAccept**: *[OnAcceptCB](../modules/_socket_events_modules_socket_events_index_.md#onacceptcb) | null* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[onAccept](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#onaccept)* + +*Defined in [socket-events/modules/socket-events/index.ts:109](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L109)* + +The onData callback. + +**`type`** {module:socket-events~onDataCB} + +___ + +### onClose + +• **onClose**: *[OnCloseCB](../modules/_socket_events_modules_socket_events_index_.md#onclosecb) | null* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[onClose](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#onclose)* + +*Defined in [socket-events/modules/socket-events/index.ts:113](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L113)* + +___ + +### onConnect + +• **onConnect**: *[OnConnectCB](../modules/_socket_events_modules_socket_events_index_.md#onconnectcb) | null* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[onConnect](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#onconnect)* + +*Defined in [socket-events/modules/socket-events/index.ts:111](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L111)* + +___ + +### onData + +• **onData**: *[OnDataCB](../modules/_socket_events_modules_socket_events_index_.md#ondatacb) | null* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[onData](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#ondata)* + +*Defined in [socket-events/modules/socket-events/index.ts:110](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L110)* + +___ + +### onError + +• **onError**: *[OnErrorCB](../modules/_socket_events_modules_socket_events_index_.md#onerrorcb) | null* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[onError](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#onerror)* + +*Defined in [socket-events/modules/socket-events/index.ts:112](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L112)* + +___ + +### onWritable + +• **onWritable**: *[OnWritableCB](../modules/_socket_events_modules_socket_events_index_.md#onwritablecb) | null* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[onWritable](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#onwritable)* + +*Defined in [socket-events/modules/socket-events/index.ts:114](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L114)* + +___ + +### sockfd + +• **sockfd**: *number* = -1 + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[sockfd](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#sockfd)* + +*Defined in [socket-events/modules/socket-events/index.ts:103](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L103)* + +The socket file descriptor. + +**`type`** {number} + +___ + +### ssl + +• **ssl**: *any* = null + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[ssl](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#ssl)* + +*Defined in [socket-events/modules/socket-events/index.ts:118](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L118)* + +___ + +### `Private` textEncoder + +• **textEncoder**: *TextEncoder* = new TextEncoder() + +*Defined in [socket-events/modules/socket-events/index.ts:96](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L96)* + +___ + +### writebuffer + +• **writebuffer**: *[BufferEntry](../interfaces/_socket_events_modules_socket_events_index_.bufferentry.md)[]* = [] + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md).[writebuffer](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md#writebuffer)* + +*Defined in [socket-events/modules/socket-events/index.ts:97](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L97)* + +## Methods + +### flush + +▸ **flush**(`cb?`: undefined | function): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:150](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L150)* + +**Parameters:** + +Name | Type | +------ | ------ | +`cb?` | undefined | function | + +**Returns:** *void* + +___ + +### write + +▸ **write**(`data`: string | Uint8Array): *void* + +*Implementation of [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)* + +*Defined in [socket-events/modules/socket-events/index.ts:121](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L121)* + +**Parameters:** + +Name | Type | +------ | ------ | +`data` | string | Uint8Array | + +**Returns:** *void* diff --git a/docs/interfaces/_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md new file mode 100644 index 0000000..bad3c50 --- /dev/null +++ b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md @@ -0,0 +1,42 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/config"](../modules/_esp32_javascript_modules_esp32_javascript_config_.md) › [Esp32JsConfig](_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md) + +# Interface: Esp32JsConfig + +## Hierarchy + +* **Esp32JsConfig** + +## Index + +### Properties + +* [ota](_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md#ota) +* [wlan](_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md#wlan) + +## Properties + +### ota + +• **ota**: *object* + +*Defined in [esp32-javascript/modules/esp32-javascript/config.ts:6](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/config.ts#L6)* + +#### Type declaration: + +* **offline**: *boolean* + +* **url**: *any* + +___ + +### wlan + +• **wlan**: *object* + +*Defined in [esp32-javascript/modules/esp32-javascript/config.ts:2](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/config.ts#L2)* + +#### Type declaration: + +* **password**: *string* + +* **ssid**: *string* diff --git a/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md new file mode 100644 index 0000000..bc4f409 --- /dev/null +++ b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md @@ -0,0 +1,11 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/http"](../modules/_esp32_javascript_modules_esp32_javascript_http_.md) › [Esp32JsHeaders](_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md) + +# Interface: Esp32JsHeaders + +## Hierarchy + +* **Esp32JsHeaders** + +## Indexable + +* \[ **key**: *string*\]: string diff --git a/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md new file mode 100644 index 0000000..b562777 --- /dev/null +++ b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md @@ -0,0 +1,48 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/http"](../modules/_esp32_javascript_modules_esp32_javascript_http_.md) › [Esp32JsRequest](_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md) + +# Interface: Esp32JsRequest + +## Hierarchy + +* **Esp32JsRequest** + +## Index + +### Properties + +* [body](_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md#body) +* [headers](_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md#headers) +* [method](_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md#method) +* [path](_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md#path) + +## Properties + +### body + +• **body**: *string | null* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:8](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L8)* + +___ + +### headers + +• **headers**: *[Esp32JsHeaders](_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:6](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L6)* + +___ + +### method + +• **method**: *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:7](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L7)* + +___ + +### path + +• **path**: *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:5](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L5)* diff --git a/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md new file mode 100644 index 0000000..3e9f6c1 --- /dev/null +++ b/docs/interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md @@ -0,0 +1,80 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/http"](../modules/_esp32_javascript_modules_esp32_javascript_http_.md) › [Esp32JsResponse](_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md) + +# Interface: Esp32JsResponse + +## Hierarchy + +* **Esp32JsResponse** + +## Index + +### Properties + +* [end](_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md#end) +* [flush](_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md#flush) +* [isEnded](_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md#isended) +* [write](_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md#write) + +## Properties + +### end + +• **end**: *function* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:14](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L14)* + +#### Type declaration: + +▸ (`data`: string, `cb?`: undefined | function): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`data` | string | +`cb?` | undefined | function | + +___ + +### flush + +• **flush**: *function* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:12](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L12)* + +#### Type declaration: + +▸ (`cb?`: undefined | function, `close?`: undefined | false | true): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`cb?` | undefined | function | +`close?` | undefined | false | true | + +___ + +### isEnded + +• **isEnded**: *boolean* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:15](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L15)* + +___ + +### write + +• **write**: *function* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:13](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L13)* + +#### Type declaration: + +▸ (`data`: string): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`data` | string | diff --git a/docs/interfaces/_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md b/docs/interfaces/_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md new file mode 100644 index 0000000..942cb22 --- /dev/null +++ b/docs/interfaces/_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md @@ -0,0 +1,48 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-js-eventloop/index"](../modules/_esp32_javascript_modules_esp32_js_eventloop_index_.md) › [Esp32JsTimer](_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md) + +# Interface: Esp32JsTimer + +## Hierarchy + +* **Esp32JsTimer** + +## Index + +### Properties + +* [fn](_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md#fn) +* [handle](_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md#handle) +* [installed](_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md#installed) +* [timeout](_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md#timeout) + +## Properties + +### fn + +• **fn**: *Function* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:4](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L4)* + +___ + +### handle + +• **handle**: *number* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:2](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L2)* + +___ + +### installed + +• **installed**: *boolean* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:5](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L5)* + +___ + +### timeout + +• **timeout**: *number* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:3](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L3)* diff --git a/docs/interfaces/_esp32_javascript_urlparse_.anchorelement.md b/docs/interfaces/_esp32_javascript_urlparse_.anchorelement.md new file mode 100644 index 0000000..3a01e4b --- /dev/null +++ b/docs/interfaces/_esp32_javascript_urlparse_.anchorelement.md @@ -0,0 +1,176 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/urlparse"](../modules/_esp32_javascript_urlparse_.md) › [AnchorElement](_esp32_javascript_urlparse_.anchorelement.md) + +# Interface: AnchorElement + +## Hierarchy + +* **AnchorElement** + +## Index + +### Properties + +* [_hash](_esp32_javascript_urlparse_.anchorelement.md#_hash) +* [_host](_esp32_javascript_urlparse_.anchorelement.md#_host) +* [_hostname](_esp32_javascript_urlparse_.anchorelement.md#_hostname) +* [_pathname](_esp32_javascript_urlparse_.anchorelement.md#_pathname) +* [_port](_esp32_javascript_urlparse_.anchorelement.md#_port) +* [_protocol](_esp32_javascript_urlparse_.anchorelement.md#_protocol) +* [_search](_esp32_javascript_urlparse_.anchorelement.md#_search) +* [hash](_esp32_javascript_urlparse_.anchorelement.md#hash) +* [host](_esp32_javascript_urlparse_.anchorelement.md#host) +* [hostname](_esp32_javascript_urlparse_.anchorelement.md#hostname) +* [href](_esp32_javascript_urlparse_.anchorelement.md#href) +* [origin](_esp32_javascript_urlparse_.anchorelement.md#origin) +* [pathname](_esp32_javascript_urlparse_.anchorelement.md#pathname) +* [port](_esp32_javascript_urlparse_.anchorelement.md#port) +* [protocol](_esp32_javascript_urlparse_.anchorelement.md#protocol) +* [search](_esp32_javascript_urlparse_.anchorelement.md#search) + +### Methods + +* [resolve](_esp32_javascript_urlparse_.anchorelement.md#resolve) + +## Properties + +### _hash + +• **_hash**: *string* + +*Defined in [esp32-javascript/urlparse.ts:19](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L19)* + +___ + +### _host + +• **_host**: *string* + +*Defined in [esp32-javascript/urlparse.ts:15](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L15)* + +___ + +### _hostname + +• **_hostname**: *string* + +*Defined in [esp32-javascript/urlparse.ts:14](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L14)* + +___ + +### _pathname + +• **_pathname**: *string* + +*Defined in [esp32-javascript/urlparse.ts:17](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L17)* + +___ + +### _port + +• **_port**: *string* + +*Defined in [esp32-javascript/urlparse.ts:16](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L16)* + +___ + +### _protocol + +• **_protocol**: *string* + +*Defined in [esp32-javascript/urlparse.ts:13](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L13)* + +___ + +### _search + +• **_search**: *string* + +*Defined in [esp32-javascript/urlparse.ts:18](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L18)* + +___ + +### hash + +• **hash**: *string* + +*Defined in [esp32-javascript/urlparse.ts:5](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L5)* + +___ + +### host + +• **host**: *string* + +*Defined in [esp32-javascript/urlparse.ts:9](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L9)* + +___ + +### hostname + +• **hostname**: *string* + +*Defined in [esp32-javascript/urlparse.ts:8](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L8)* + +___ + +### href + +• **href**: *string* + +*Defined in [esp32-javascript/urlparse.ts:2](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L2)* + +___ + +### origin + +• **origin**: *string* + +*Defined in [esp32-javascript/urlparse.ts:6](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L6)* + +___ + +### pathname + +• **pathname**: *string* + +*Defined in [esp32-javascript/urlparse.ts:3](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L3)* + +___ + +### port + +• **port**: *string* + +*Defined in [esp32-javascript/urlparse.ts:10](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L10)* + +___ + +### protocol + +• **protocol**: *string* + +*Defined in [esp32-javascript/urlparse.ts:7](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L7)* + +___ + +### search + +• **search**: *string* + +*Defined in [esp32-javascript/urlparse.ts:4](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L4)* + +## Methods + +### resolve + +▸ **resolve**(`rel`: string): *[AnchorElement](_esp32_javascript_urlparse_.anchorelement.md)* + +*Defined in [esp32-javascript/urlparse.ts:11](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L11)* + +**Parameters:** + +Name | Type | +------ | ------ | +`rel` | string | + +**Returns:** *[AnchorElement](_esp32_javascript_urlparse_.anchorelement.md)* diff --git a/docs/interfaces/_socket_events_modules_socket_events_index_.bufferentry.md b/docs/interfaces/_socket_events_modules_socket_events_index_.bufferentry.md new file mode 100644 index 0000000..29bd5f5 --- /dev/null +++ b/docs/interfaces/_socket_events_modules_socket_events_index_.bufferentry.md @@ -0,0 +1,48 @@ +[esp32-javascript](../README.md) › ["socket-events/modules/socket-events/index"](../modules/_socket_events_modules_socket_events_index_.md) › [BufferEntry](_socket_events_modules_socket_events_index_.bufferentry.md) + +# Interface: BufferEntry + +## Hierarchy + +* **BufferEntry** + +## Index + +### Properties + +* [cb](_socket_events_modules_socket_events_index_.bufferentry.md#optional-cb) +* [data](_socket_events_modules_socket_events_index_.bufferentry.md#data) +* [len](_socket_events_modules_socket_events_index_.bufferentry.md#len) +* [written](_socket_events_modules_socket_events_index_.bufferentry.md#written) + +## Properties + +### `Optional` cb + +• **cb**? : *undefined | function* + +*Defined in [socket-events/modules/socket-events/index.ts:87](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L87)* + +___ + +### data + +• **data**: *Uint8Array* + +*Defined in [socket-events/modules/socket-events/index.ts:85](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L85)* + +___ + +### len + +• **len**: *number* + +*Defined in [socket-events/modules/socket-events/index.ts:86](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L86)* + +___ + +### written + +• **written**: *number* + +*Defined in [socket-events/modules/socket-events/index.ts:84](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L84)* diff --git a/docs/interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md b/docs/interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md new file mode 100644 index 0000000..534dc52 --- /dev/null +++ b/docs/interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md @@ -0,0 +1,134 @@ +[esp32-javascript](../README.md) › ["socket-events/modules/socket-events/index"](../modules/_socket_events_modules_socket_events_index_.md) › [Esp32JsSocket](_socket_events_modules_socket_events_index_.esp32jssocket.md) + +# Interface: Esp32JsSocket + +## Hierarchy + +* **Esp32JsSocket** + +## Implemented by + +* [Socket](../classes/_socket_events_modules_socket_events_index_.socket.md) + +## Index + +### Properties + +* [onAccept](_socket_events_modules_socket_events_index_.esp32jssocket.md#onaccept) +* [onClose](_socket_events_modules_socket_events_index_.esp32jssocket.md#onclose) +* [onConnect](_socket_events_modules_socket_events_index_.esp32jssocket.md#onconnect) +* [onData](_socket_events_modules_socket_events_index_.esp32jssocket.md#ondata) +* [onError](_socket_events_modules_socket_events_index_.esp32jssocket.md#onerror) +* [onWritable](_socket_events_modules_socket_events_index_.esp32jssocket.md#onwritable) +* [sockfd](_socket_events_modules_socket_events_index_.esp32jssocket.md#sockfd) +* [ssl](_socket_events_modules_socket_events_index_.esp32jssocket.md#ssl) +* [writebuffer](_socket_events_modules_socket_events_index_.esp32jssocket.md#writebuffer) + +### Methods + +* [flush](_socket_events_modules_socket_events_index_.esp32jssocket.md#flush) +* [write](_socket_events_modules_socket_events_index_.esp32jssocket.md#write) + +## Properties + +### onAccept + +• **onAccept**: *[OnAcceptCB](../modules/_socket_events_modules_socket_events_index_.md#onacceptcb) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:15](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L15)* + +___ + +### onClose + +• **onClose**: *[OnCloseCB](../modules/_socket_events_modules_socket_events_index_.md#onclosecb) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:22](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L22)* + +___ + +### onConnect + +• **onConnect**: *[OnConnectCB](../modules/_socket_events_modules_socket_events_index_.md#onconnectcb) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:17](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L17)* + +___ + +### onData + +• **onData**: *[OnDataCB](../modules/_socket_events_modules_socket_events_index_.md#ondatacb) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:16](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L16)* + +___ + +### onError + +• **onError**: *[OnErrorCB](../modules/_socket_events_modules_socket_events_index_.md#onerrorcb) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:18](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L18)* + +___ + +### onWritable + +• **onWritable**: *[OnWritableCB](../modules/_socket_events_modules_socket_events_index_.md#onwritablecb) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:19](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L19)* + +___ + +### sockfd + +• **sockfd**: *number* + +*Defined in [socket-events/modules/socket-events/index.ts:14](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L14)* + +___ + +### ssl + +• **ssl**: *any* + +*Defined in [socket-events/modules/socket-events/index.ts:23](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L23)* + +___ + +### writebuffer + +• **writebuffer**: *[BufferEntry](_socket_events_modules_socket_events_index_.bufferentry.md)[]* + +*Defined in [socket-events/modules/socket-events/index.ts:24](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L24)* + +## Methods + +### flush + +▸ **flush**(`cb?`: undefined | function): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:20](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L20)* + +**Parameters:** + +Name | Type | +------ | ------ | +`cb?` | undefined | function | + +**Returns:** *void* + +___ + +### write + +▸ **write**(`data`: string | Uint8Array): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:21](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L21)* + +**Parameters:** + +Name | Type | +------ | ------ | +`data` | string | Uint8Array | + +**Returns:** *void* diff --git a/docs/interfaces/_socket_events_modules_socket_events_index_.socketarrayfind.md b/docs/interfaces/_socket_events_modules_socket_events_index_.socketarrayfind.md new file mode 100644 index 0000000..3f55bc3 --- /dev/null +++ b/docs/interfaces/_socket_events_modules_socket_events_index_.socketarrayfind.md @@ -0,0 +1,39 @@ +[esp32-javascript](../README.md) › ["socket-events/modules/socket-events/index"](../modules/_socket_events_modules_socket_events_index_.md) › [SocketArrayFind](_socket_events_modules_socket_events_index_.socketarrayfind.md) + +# Interface: SocketArrayFind + +An array which holds all active sockets. + +**`type`** module:socket-events~Socket[] + +## Hierarchy + +* **SocketArrayFind** + +## Index + +### Methods + +* [find](_socket_events_modules_socket_events_index_.socketarrayfind.md#find) + +## Methods + +### find + +▸ **find**(`predicate`: function): *[Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)* + +*Defined in [socket-events/modules/socket-events/index.ts:67](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L67)* + +**Parameters:** + +▪ **predicate**: *function* + +▸ (`socket`: [Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)): *boolean* + +**Parameters:** + +Name | Type | +------ | ------ | +`socket` | [Socket](../classes/_socket_events_modules_socket_events_index_.socket.md) | + +**Returns:** *[Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)* diff --git a/docs/interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifi.md b/docs/interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifi.md new file mode 100644 index 0000000..1c43e32 --- /dev/null +++ b/docs/interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifi.md @@ -0,0 +1,31 @@ +[esp32-javascript](../README.md) › ["wifi-events/modules/wifi-events/index"](../modules/_wifi_events_modules_wifi_events_index_.md) › [Esp32JsWifi](_wifi_events_modules_wifi_events_index_.esp32jswifi.md) + +# Interface: Esp32JsWifi + +## Hierarchy + +* **Esp32JsWifi** + +## Index + +### Properties + +* [status](_wifi_events_modules_wifi_events_index_.esp32jswifi.md#status) + +## Properties + +### status + +• **status**: *function* + +*Defined in [wifi-events/modules/wifi-events/index.ts:11](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L11)* + +#### Type declaration: + +▸ (`event`: [Esp32JsWifiEvent](_wifi_events_modules_wifi_events_index_.esp32jswifievent.md)): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`event` | [Esp32JsWifiEvent](_wifi_events_modules_wifi_events_index_.esp32jswifievent.md) | diff --git a/docs/interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md b/docs/interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md new file mode 100644 index 0000000..fbf6dd4 --- /dev/null +++ b/docs/interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md @@ -0,0 +1,23 @@ +[esp32-javascript](../README.md) › ["wifi-events/modules/wifi-events/index"](../modules/_wifi_events_modules_wifi_events_index_.md) › [Esp32JsWifiEvent](_wifi_events_modules_wifi_events_index_.esp32jswifievent.md) + +# Interface: Esp32JsWifiEvent + +**`module`** wifi-events + +## Hierarchy + +* **Esp32JsWifiEvent** + +## Index + +### Properties + +* [status](_wifi_events_modules_wifi_events_index_.esp32jswifievent.md#status) + +## Properties + +### status + +• **status**: *number* + +*Defined in [wifi-events/modules/wifi-events/index.ts:7](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L7)* diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_boot_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_boot_.md new file mode 100644 index 0000000..96e2758 --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_boot_.md @@ -0,0 +1,126 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/boot"](_esp32_javascript_modules_esp32_javascript_boot_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/boot" + +## Index + +### Variables + +* [configServer](_esp32_javascript_modules_esp32_javascript_boot_.md#configserver) +* [configServerStarted](_esp32_javascript_modules_esp32_javascript_boot_.md#configserverstarted) +* [programLoaded](_esp32_javascript_modules_esp32_javascript_boot_.md#programloaded) +* [wifi](_esp32_javascript_modules_esp32_javascript_boot_.md#wifi) + +### Functions + +* [blink](_esp32_javascript_modules_esp32_javascript_boot_.md#blink) +* [connectToWifi](_esp32_javascript_modules_esp32_javascript_boot_.md#connecttowifi) +* [evalScript](_esp32_javascript_modules_esp32_javascript_boot_.md#evalscript) +* [main](_esp32_javascript_modules_esp32_javascript_boot_.md#main) +* [parseDate](_esp32_javascript_modules_esp32_javascript_boot_.md#parsedate) +* [startSoftApMode](_esp32_javascript_modules_esp32_javascript_boot_.md#startsoftapmode) + +## Variables + +### configServer + +• **configServer**: *["esp32-javascript/modules/esp32-javascript/configserver"](_esp32_javascript_modules_esp32_javascript_configserver_.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:2](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L2)* + +___ + +### configServerStarted + +• **configServerStarted**: *boolean* = false + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:17](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L17)* + +___ + +### programLoaded + +• **programLoaded**: *boolean* = false + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:18](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L18)* + +___ + +### wifi + +• **wifi**: *["wifi-events/modules/wifi-events/index"](_wifi_events_modules_wifi_events_index_.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:1](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L1)* + +## Functions + +### blink + +▸ **blink**(): *number* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:20](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L20)* + +**Returns:** *number* + +___ + +### connectToWifi + +▸ **connectToWifi**(): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:88](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L88)* + +**Returns:** *void* + +___ + +### evalScript + +▸ **evalScript**(`content`: string, `headers?`: Headers): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:82](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L82)* + +**Parameters:** + +Name | Type | +------ | ------ | +`content` | string | +`headers?` | Headers | + +**Returns:** *void* + +___ + +### main + +▸ **main**(): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:162](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L162)* + +**Returns:** *void* + +___ + +### parseDate + +▸ **parseDate**(`d`: string): *Date* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:57](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L57)* + +**Parameters:** + +Name | Type | +------ | ------ | +`d` | string | + +**Returns:** *Date* + +___ + +### startSoftApMode + +▸ **startSoftApMode**(): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/boot.ts:28](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/boot.ts#L28)* + +**Returns:** *void* diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_config_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_config_.md new file mode 100644 index 0000000..788b99e --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_config_.md @@ -0,0 +1,35 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/config"](_esp32_javascript_modules_esp32_javascript_config_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/config" + +## Index + +### Interfaces + +* [Esp32JsConfig](../interfaces/_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md) + +### Variables + +* [config](_esp32_javascript_modules_esp32_javascript_config_.md#config) + +### Functions + +* [reloadConfig](_esp32_javascript_modules_esp32_javascript_config_.md#reloadconfig) + +## Variables + +### config + +• **config**: *[Esp32JsConfig](../interfaces/_esp32_javascript_modules_esp32_javascript_config_.esp32jsconfig.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/config.ts:12](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/config.ts#L12)* + +## Functions + +### reloadConfig + +▸ **reloadConfig**(): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/config.ts:13](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/config.ts#L13)* + +**Returns:** *void* diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_configserver_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_configserver_.md new file mode 100644 index 0000000..3ceeadd --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_configserver_.md @@ -0,0 +1,105 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/configserver"](_esp32_javascript_modules_esp32_javascript_configserver_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/configserver" + +## Index + +### Variables + +* [baExceptionPathes](_esp32_javascript_modules_esp32_javascript_configserver_.md#baexceptionpathes) +* [configManager](_esp32_javascript_modules_esp32_javascript_configserver_.md#configmanager) +* [requestHandler](_esp32_javascript_modules_esp32_javascript_configserver_.md#requesthandler) + +### Functions + +* [getHeader](_esp32_javascript_modules_esp32_javascript_configserver_.md#getheader) +* [page](_esp32_javascript_modules_esp32_javascript_configserver_.md#page) +* [redirect](_esp32_javascript_modules_esp32_javascript_configserver_.md#redirect) +* [startConfigServer](_esp32_javascript_modules_esp32_javascript_configserver_.md#startconfigserver) + +## Variables + +### baExceptionPathes + +• **baExceptionPathes**: *string[]* = [] + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:10](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L10)* + +___ + +### configManager + +• **configManager**: *["esp32-javascript/modules/esp32-javascript/config"](_esp32_javascript_modules_esp32_javascript_config_.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:1](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L1)* + +___ + +### requestHandler + +• **requestHandler**: *function[]* = [] + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:9](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L9)* + +## Functions + +### getHeader + +▸ **getHeader**(`statusCode`: number, `additionalHeaders`: string): *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:12](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L12)* + +**Parameters:** + +Name | Type | +------ | ------ | +`statusCode` | number | +`additionalHeaders` | string | + +**Returns:** *string* + +___ + +### page + +▸ **page**(`res`: [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md), `headline`: string, `text`: string | string[], `cb?`: undefined | function): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:27](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L27)* + +**Parameters:** + +Name | Type | +------ | ------ | +`res` | [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md) | +`headline` | string | +`text` | string | string[] | +`cb?` | undefined | function | + +**Returns:** *void* + +___ + +### redirect + +▸ **redirect**(`res`: [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md), `location`: string): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:23](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L23)* + +**Parameters:** + +Name | Type | +------ | ------ | +`res` | [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md) | +`location` | string | + +**Returns:** *void* + +___ + +### startConfigServer + +▸ **startConfigServer**(): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/configserver.ts:56](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/configserver.ts#L56)* + +**Returns:** *void* diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_global_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_global_.md new file mode 100644 index 0000000..1c7795f --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_global_.md @@ -0,0 +1,17 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/global"](_esp32_javascript_modules_esp32_javascript_global_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/global" + +## Index + +### Variables + +* [global](_esp32_javascript_modules_esp32_javascript_global_.md#global) + +## Variables + +### global + +• **global**: *any* + +*Defined in [esp32-javascript/modules/esp32-javascript/global.ts:1](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/global.ts#L1)* diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_http_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_http_.md new file mode 100644 index 0000000..e0c83e5 --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_http_.md @@ -0,0 +1,169 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/http"](_esp32_javascript_modules_esp32_javascript_http_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/http" + +## Index + +### Classes + +* [XMLHttpRequest](../classes/_esp32_javascript_modules_esp32_javascript_http_.xmlhttprequest.md) + +### Interfaces + +* [Esp32JsHeaders](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md) +* [Esp32JsRequest](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md) +* [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md) + +### Variables + +* [closeSocket](_esp32_javascript_modules_esp32_javascript_http_.md#closesocket) +* [sockConnect](_esp32_javascript_modules_esp32_javascript_http_.md#sockconnect) +* [sockListen](_esp32_javascript_modules_esp32_javascript_http_.md#socklisten) +* [socketEvents](_esp32_javascript_modules_esp32_javascript_http_.md#socketevents) + +### Functions + +* [decodeQueryParam](_esp32_javascript_modules_esp32_javascript_http_.md#decodequeryparam) +* [httpClient](_esp32_javascript_modules_esp32_javascript_http_.md#httpclient) +* [httpServer](_esp32_javascript_modules_esp32_javascript_http_.md#httpserver) +* [parseHeaders](_esp32_javascript_modules_esp32_javascript_http_.md#parseheaders) +* [parseQueryStr](_esp32_javascript_modules_esp32_javascript_http_.md#parsequerystr) + +## Variables + +### closeSocket + +• **closeSocket**: *[closeSocket](_socket_events_modules_socket_events_index_.md#closesocket)* = socketEvents.closeSocket + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:24](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L24)* + +___ + +### sockConnect + +• **sockConnect**: *[sockConnect](_socket_events_modules_socket_events_index_.md#sockconnect)* = socketEvents.sockConnect + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:23](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L23)* + +___ + +### sockListen + +• **sockListen**: *[sockListen](_socket_events_modules_socket_events_index_.md#socklisten)* = socketEvents.sockListen + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:22](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L22)* + +___ + +### socketEvents + +• **socketEvents**: *["socket-events/modules/socket-events/index"](_socket_events_modules_socket_events_index_.md)* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:1](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L1)* + +## Functions + +### decodeQueryParam + +▸ **decodeQueryParam**(`value`: string): *string* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:151](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L151)* + +**Parameters:** + +Name | Type | +------ | ------ | +`value` | string | + +**Returns:** *string* + +___ + +### httpClient + +▸ **httpClient**(`ssl`: boolean, `host`: string, `port`: string, `path`: string, `method`: string, `requestHeaders?`: undefined | string, `body?`: undefined | object, `successCB?`: undefined | function, `errorCB?`: undefined | function, `finishCB?`: undefined | function): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:168](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L168)* + +**Parameters:** + +Name | Type | +------ | ------ | +`ssl` | boolean | +`host` | string | +`port` | string | +`path` | string | +`method` | string | +`requestHeaders?` | undefined | string | +`body?` | undefined | object | +`successCB?` | undefined | function | +`errorCB?` | undefined | function | +`finishCB?` | undefined | function | + +**Returns:** *void* + +___ + +### httpServer + +▸ **httpServer**(`port`: string | number, `isSSL`: boolean, `cb`: function): *void* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:45](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L45)* + +**Parameters:** + +▪ **port**: *string | number* + +▪ **isSSL**: *boolean* + +▪ **cb**: *function* + +▸ (`req`: [Esp32JsRequest](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md), `res`: [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md)): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`req` | [Esp32JsRequest](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsrequest.md) | +`res` | [Esp32JsResponse](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsresponse.md) | + +**Returns:** *void* + +___ + +### parseHeaders + +▸ **parseHeaders**(`complete`: string, `endOfHeaders`: number): *object* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:26](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L26)* + +**Parameters:** + +Name | Type | +------ | ------ | +`complete` | string | +`endOfHeaders` | number | + +**Returns:** *object* + +* **firstLine**: *undefined | string* = firstLine + +* **parsedHeaders**: *[Esp32JsHeaders](../interfaces/_esp32_javascript_modules_esp32_javascript_http_.esp32jsheaders.md)* = parsedHeaders + +___ + +### parseQueryStr + +▸ **parseQueryStr**(`query`: string | null): *object* + +*Defined in [esp32-javascript/modules/esp32-javascript/http.ts:155](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-javascript/http.ts#L155)* + +**Parameters:** + +Name | Type | +------ | ------ | +`query` | string | null | + +**Returns:** *object* + +* \[ **key**: *string*\]: string diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_index_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_index_.md new file mode 100644 index 0000000..a9af03e --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_index_.md @@ -0,0 +1,5 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/index"](_esp32_javascript_modules_esp32_javascript_index_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/index" + + diff --git a/docs/modules/_esp32_javascript_modules_esp32_javascript_stringbuffer_.md b/docs/modules/_esp32_javascript_modules_esp32_javascript_stringbuffer_.md new file mode 100644 index 0000000..286c702 --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_javascript_stringbuffer_.md @@ -0,0 +1,9 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-javascript/stringbuffer"](_esp32_javascript_modules_esp32_javascript_stringbuffer_.md) + +# Module: "esp32-javascript/modules/esp32-javascript/stringbuffer" + +## Index + +### Classes + +* [StringBuffer](../classes/_esp32_javascript_modules_esp32_javascript_stringbuffer_.stringbuffer.md) diff --git a/docs/modules/_esp32_javascript_modules_esp32_js_eventloop_index_.md b/docs/modules/_esp32_javascript_modules_esp32_js_eventloop_index_.md new file mode 100644 index 0000000..312a659 --- /dev/null +++ b/docs/modules/_esp32_javascript_modules_esp32_js_eventloop_index_.md @@ -0,0 +1,194 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/modules/esp32-js-eventloop/index"](_esp32_javascript_modules_esp32_js_eventloop_index_.md) + +# Module: "esp32-javascript/modules/esp32-js-eventloop/index" + +## Index + +### Interfaces + +* [Esp32JsTimer](../interfaces/_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md) + +### Type aliases + +* [Esp32JsEventHandler](_esp32_javascript_modules_esp32_js_eventloop_index_.md#esp32jseventhandler) + +### Variables + +* [afterSuspendHandlers](_esp32_javascript_modules_esp32_js_eventloop_index_.md#aftersuspendhandlers) +* [beforeSuspendHandlers](_esp32_javascript_modules_esp32_js_eventloop_index_.md#beforesuspendhandlers) +* [handles](_esp32_javascript_modules_esp32_js_eventloop_index_.md#handles) +* [intervals](_esp32_javascript_modules_esp32_js_eventloop_index_.md#intervals) +* [timers](_esp32_javascript_modules_esp32_js_eventloop_index_.md#timers) + +### Functions + +* [clearInterval](_esp32_javascript_modules_esp32_js_eventloop_index_.md#clearinterval) +* [clearTimeout](_esp32_javascript_modules_esp32_js_eventloop_index_.md#cleartimeout) +* [el_select_next](_esp32_javascript_modules_esp32_js_eventloop_index_.md#el_select_next) +* [installIntervalTimeout](_esp32_javascript_modules_esp32_js_eventloop_index_.md#installintervaltimeout) +* [setInterval](_esp32_javascript_modules_esp32_js_eventloop_index_.md#setinterval) +* [setTimeout](_esp32_javascript_modules_esp32_js_eventloop_index_.md#settimeout) +* [start](_esp32_javascript_modules_esp32_js_eventloop_index_.md#start) + +## Type aliases + +### Esp32JsEventHandler + +Ƭ **Esp32JsEventHandler**: *function* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:8](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L8)* + +#### Type declaration: + +▸ (`event`: Esp32JsEventloopEvent, `collected`: Function[]): *boolean* + +**Parameters:** + +Name | Type | +------ | ------ | +`event` | Esp32JsEventloopEvent | +`collected` | Function[] | + +## Variables + +### afterSuspendHandlers + +• **afterSuspendHandlers**: *[Esp32JsEventHandler](_esp32_javascript_modules_esp32_js_eventloop_index_.md#esp32jseventhandler)[]* = [] + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:25](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L25)* + +___ + +### beforeSuspendHandlers + +• **beforeSuspendHandlers**: *function[]* = [] + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:24](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L24)* + +___ + +### handles + +• **handles**: *number* = 0 + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:23](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L23)* + +___ + +### intervals + +• **intervals**: *number[]* = [] + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:22](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L22)* + +___ + +### timers + +• **timers**: *[Esp32JsTimer](../interfaces/_esp32_javascript_modules_esp32_js_eventloop_index_.esp32jstimer.md)[]* = [] + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:21](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L21)* + +## Functions + +### clearInterval + +▸ **clearInterval**(`handle`: number): *void* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:49](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L49)* + +**Parameters:** + +Name | Type | +------ | ------ | +`handle` | number | + +**Returns:** *void* + +___ + +### clearTimeout + +▸ **clearTimeout**(`handle`: number): *void* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:38](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L38)* + +**Parameters:** + +Name | Type | +------ | ------ | +`handle` | number | + +**Returns:** *void* + +___ + +### el_select_next + +▸ **el_select_next**(): *Function[]* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:72](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L72)* + +**Returns:** *Function[]* + +___ + +### installIntervalTimeout + +▸ **installIntervalTimeout**(`handle`: number, `fn`: Function, `timeout`: number): *void* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:56](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L56)* + +**Parameters:** + +Name | Type | +------ | ------ | +`handle` | number | +`fn` | Function | +`timeout` | number | + +**Returns:** *void* + +___ + +### setInterval + +▸ **setInterval**(`fn`: Function, `timeout`: number): *number* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:65](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L65)* + +**Parameters:** + +Name | Type | +------ | ------ | +`fn` | Function | +`timeout` | number | + +**Returns:** *number* + +___ + +### setTimeout + +▸ **setTimeout**(`fn`: Function, `timeout`: number): *number* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:27](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L27)* + +**Parameters:** + +Name | Type | +------ | ------ | +`fn` | Function | +`timeout` | number | + +**Returns:** *number* + +___ + +### start + +▸ **start**(): *void* + +*Defined in [esp32-javascript/modules/esp32-js-eventloop/index.ts:123](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/modules/esp32-js-eventloop/index.ts#L123)* + +**Returns:** *void* diff --git a/docs/modules/_esp32_javascript_urlparse_.md b/docs/modules/_esp32_javascript_urlparse_.md new file mode 100644 index 0000000..3697513 --- /dev/null +++ b/docs/modules/_esp32_javascript_urlparse_.md @@ -0,0 +1,29 @@ +[esp32-javascript](../README.md) › ["esp32-javascript/urlparse"](_esp32_javascript_urlparse_.md) + +# Module: "esp32-javascript/urlparse" + +## Index + +### Interfaces + +* [AnchorElement](../interfaces/_esp32_javascript_urlparse_.anchorelement.md) + +### Functions + +* [urlparse](_esp32_javascript_urlparse_.md#urlparse) + +## Functions + +### urlparse + +▸ **urlparse**(`absoluteUrl`: string): *[AnchorElement](../interfaces/_esp32_javascript_urlparse_.anchorelement.md)* + +*Defined in [esp32-javascript/urlparse.ts:22](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/esp32-javascript/urlparse.ts#L22)* + +**Parameters:** + +Name | Type | +------ | ------ | +`absoluteUrl` | string | + +**Returns:** *[AnchorElement](../interfaces/_esp32_javascript_urlparse_.anchorelement.md)* diff --git a/docs/modules/_socket_events_modules_socket_events_index_.md b/docs/modules/_socket_events_modules_socket_events_index_.md new file mode 100644 index 0000000..baefc12 --- /dev/null +++ b/docs/modules/_socket_events_modules_socket_events_index_.md @@ -0,0 +1,359 @@ +[esp32-javascript](../README.md) › ["socket-events/modules/socket-events/index"](_socket_events_modules_socket_events_index_.md) + +# Module: "socket-events/modules/socket-events/index" + +## Index + +### Classes + +* [Socket](../classes/_socket_events_modules_socket_events_index_.socket.md) + +### Interfaces + +* [BufferEntry](../interfaces/_socket_events_modules_socket_events_index_.bufferentry.md) +* [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) +* [SocketArrayFind](../interfaces/_socket_events_modules_socket_events_index_.socketarrayfind.md) + +### Type aliases + +* [OnAcceptCB](_socket_events_modules_socket_events_index_.md#onacceptcb) +* [OnCloseCB](_socket_events_modules_socket_events_index_.md#onclosecb) +* [OnConnectCB](_socket_events_modules_socket_events_index_.md#onconnectcb) +* [OnDataCB](_socket_events_modules_socket_events_index_.md#ondatacb) +* [OnErrorCB](_socket_events_modules_socket_events_index_.md#onerrorcb) +* [OnWritableCB](_socket_events_modules_socket_events_index_.md#onwritablecb) + +### Variables + +* [sockets](_socket_events_modules_socket_events_index_.md#sockets) +* [sslClientCtx](_socket_events_modules_socket_events_index_.md#sslclientctx) + +### Functions + +* [afterSuspend](_socket_events_modules_socket_events_index_.md#aftersuspend) +* [beforeSuspend](_socket_events_modules_socket_events_index_.md#beforesuspend) +* [closeSocket](_socket_events_modules_socket_events_index_.md#closesocket) +* [getOrCreateNewSocket](_socket_events_modules_socket_events_index_.md#getorcreatenewsocket) +* [performOnClose](_socket_events_modules_socket_events_index_.md#performonclose) +* [resetSocket](_socket_events_modules_socket_events_index_.md#resetsocket) +* [sockConnect](_socket_events_modules_socket_events_index_.md#sockconnect) +* [sockListen](_socket_events_modules_socket_events_index_.md#socklisten) + +## Type aliases + +### OnAcceptCB + +Ƭ **OnAcceptCB**: *function* + +*Defined in [socket-events/modules/socket-events/index.ts:10](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L10)* + +#### Type declaration: + +▸ (): *void* + +___ + +### OnCloseCB + +Ƭ **OnCloseCB**: *function* + +*Defined in [socket-events/modules/socket-events/index.ts:9](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L9)* + +#### Type declaration: + +▸ (`sockfd`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`sockfd` | number | + +___ + +### OnConnectCB + +Ƭ **OnConnectCB**: *function* + +*Defined in [socket-events/modules/socket-events/index.ts:7](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L7)* + +#### Type declaration: + +▸ (`socket`: [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)): *boolean | void* + +**Parameters:** + +Name | Type | +------ | ------ | +`socket` | [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | + +___ + +### OnDataCB + +Ƭ **OnDataCB**: *function* + +*Defined in [socket-events/modules/socket-events/index.ts:6](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L6)* + +#### Type declaration: + +▸ (`data`: string, `sockfd`: number, `length`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`data` | string | +`sockfd` | number | +`length` | number | + +___ + +### OnErrorCB + +Ƭ **OnErrorCB**: *function* + +*Defined in [socket-events/modules/socket-events/index.ts:8](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L8)* + +#### Type declaration: + +▸ (`sockfd`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`sockfd` | number | + +___ + +### OnWritableCB + +Ƭ **OnWritableCB**: *function* + +*Defined in [socket-events/modules/socket-events/index.ts:11](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L11)* + +#### Type declaration: + +▸ (`socket`: [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)): *boolean* + +**Parameters:** + +Name | Type | +------ | ------ | +`socket` | [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | + +## Variables + +### sockets + +• **sockets**: *[Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)[] & [SocketArrayFind](../interfaces/_socket_events_modules_socket_events_index_.socketarrayfind.md)* = [] as any + +*Defined in [socket-events/modules/socket-events/index.ts:69](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L69)* + +___ + +### sslClientCtx + +• **sslClientCtx**: *any* + +*Defined in [socket-events/modules/socket-events/index.ts:27](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L27)* + +## Functions + +### afterSuspend + +▸ **afterSuspend**(`evt`: Esp32JsEventloopEvent, `collected`: Function[]): *boolean* + +*Defined in [socket-events/modules/socket-events/index.ts:450](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L450)* + +**Parameters:** + +Name | Type | +------ | ------ | +`evt` | Esp32JsEventloopEvent | +`collected` | Function[] | + +**Returns:** *boolean* + +___ + +### beforeSuspend + +▸ **beforeSuspend**(): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:416](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L416)* + +**Returns:** *void* + +___ + +### closeSocket + +▸ **closeSocket**(`socketOrSockfd`: [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | number): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:241](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L241)* + +Flushes buffered writes, shutdowns SSL (if it is a secure socket), +close the socket, performs the close callback function, removes +socket from {@link module:socket-events.sockets}. + +**Parameters:** + +Name | Type | +------ | ------ | +`socketOrSockfd` | [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | number | + +**Returns:** *void* + +___ + +### getOrCreateNewSocket + +▸ **getOrCreateNewSocket**(): *[Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)‹›* + +*Defined in [socket-events/modules/socket-events/index.ts:223](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L223)* + +**Returns:** *[Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)‹›* + +___ + +### performOnClose + +▸ **performOnClose**(`socket`: [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:227](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L227)* + +**Parameters:** + +Name | Type | +------ | ------ | +`socket` | [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | + +**Returns:** *void* + +___ + +### resetSocket + +▸ **resetSocket**(`socket`: [Socket](../classes/_socket_events_modules_socket_events_index_.socket.md)): *void* + +*Defined in [socket-events/modules/socket-events/index.ts:408](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L408)* + +**Parameters:** + +Name | Type | +------ | ------ | +`socket` | [Socket](../classes/_socket_events_modules_socket_events_index_.socket.md) | + +**Returns:** *void* + +___ + +### sockConnect + +▸ **sockConnect**(`ssl`: boolean, `host`: string, `port`: string, `onConnect`: [OnConnectCB](_socket_events_modules_socket_events_index_.md#onconnectcb), `onData`: function, `onError`: function, `onClose`: function): *[Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)* + +*Defined in [socket-events/modules/socket-events/index.ts:283](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L283)* + +Connects to specified host and port. + +**Parameters:** + +▪ **ssl**: *boolean* + +If we want to connect via SSL. + +▪ **host**: *string* + +The remote hostname. + +▪ **port**: *string* + +The remote port. + +▪ **onConnect**: *[OnConnectCB](_socket_events_modules_socket_events_index_.md#onconnectcb)* + +A callback which gets called on connect event. + +▪ **onData**: *function* + +A callback which gets called on a data event. + +▸ (`data`: string, `sockfd`: number, `length`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`data` | string | +`sockfd` | number | +`length` | number | + +▪ **onError**: *function* + +A callback which gets called on an error event. + +▸ (`sockfd`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`sockfd` | number | + +▪ **onClose**: *function* + +A callback which gets called on a close event. + +▸ (): *void* + +**Returns:** *[Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)* + +The socket. + +___ + +### sockListen + +▸ **sockListen**(`port`: string | number, `onAccept`: function, `onError`: function, `onClose`: function, `isSSL`: boolean): *[Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | null* + +*Defined in [socket-events/modules/socket-events/index.ts:333](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/socket-events/modules/socket-events/index.ts#L333)* + +**Parameters:** + +▪ **port**: *string | number* + +▪ **onAccept**: *function* + +▸ (`socket`: [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md)): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`socket` | [Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | + +▪ **onError**: *function* + +▸ (`sockfd`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`sockfd` | number | + +▪ **onClose**: *function* + +▸ (`sockfd`: number): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`sockfd` | number | + +▪ **isSSL**: *boolean* + +**Returns:** *[Esp32JsSocket](../interfaces/_socket_events_modules_socket_events_index_.esp32jssocket.md) | null* diff --git a/docs/modules/_wifi_events_modules_wifi_events_index_.md b/docs/modules/_wifi_events_modules_wifi_events_index_.md new file mode 100644 index 0000000..8afdb49 --- /dev/null +++ b/docs/modules/_wifi_events_modules_wifi_events_index_.md @@ -0,0 +1,128 @@ +[esp32-javascript](../README.md) › ["wifi-events/modules/wifi-events/index"](_wifi_events_modules_wifi_events_index_.md) + +# Module: "wifi-events/modules/wifi-events/index" + +## Index + +### Interfaces + +* [Esp32JsWifi](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifi.md) +* [Esp32JsWifiEvent](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md) + +### Variables + +* [wifi](_wifi_events_modules_wifi_events_index_.md#wifi) + +### Functions + +* [afterSuspend](_wifi_events_modules_wifi_events_index_.md#aftersuspend) +* [connectWifi](_wifi_events_modules_wifi_events_index_.md#connectwifi) +* [createSoftAp](_wifi_events_modules_wifi_events_index_.md#createsoftap) +* [getBssid](_wifi_events_modules_wifi_events_index_.md#getbssid) + +## Variables + +### wifi + +• **wifi**: *[Esp32JsWifi](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifi.md) | undefined* = undefined + +*Defined in [wifi-events/modules/wifi-events/index.ts:14](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L14)* + +## Functions + +### afterSuspend + +▸ **afterSuspend**(`evt`: Esp32JsEventloopEvent, `collected`: Function[]): *boolean* + +*Defined in [wifi-events/modules/wifi-events/index.ts:72](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L72)* + +**Parameters:** + +Name | Type | +------ | ------ | +`evt` | Esp32JsEventloopEvent | +`collected` | Function[] | + +**Returns:** *boolean* + +___ + +### connectWifi + +▸ **connectWifi**(`ssid`: string, `password`: string, `callback`: function): *void* + +*Defined in [wifi-events/modules/wifi-events/index.ts:31](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L31)* + +Connect to AP with given ssid and password. + +**Parameters:** + +▪ **ssid**: *string* + +The ssid of the wifi network. + +▪ **password**: *string* + +The password of the wifi network. + +▪ **callback**: *function* + +A cb which gets the connect status updates. + +▸ (`event`: [Esp32JsWifiEvent](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md)): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`event` | [Esp32JsWifiEvent](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md) | + +**Returns:** *void* + +___ + +### createSoftAp + +▸ **createSoftAp**(`ssid`: string, `password`: string, `callback`: function): *void* + +*Defined in [wifi-events/modules/wifi-events/index.ts:49](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L49)* + +Create soft AP with given ssid and password. + +**Parameters:** + +▪ **ssid**: *string* + +The ssid of the wifi network. + +▪ **password**: *string* + +The password of the wifi network. + +▪ **callback**: *function* + +A cb which gets the connect status updates. + +▸ (`event`: [Esp32JsWifiEvent](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md)): *void* + +**Parameters:** + +Name | Type | +------ | ------ | +`event` | [Esp32JsWifiEvent](../interfaces/_wifi_events_modules_wifi_events_index_.esp32jswifievent.md) | + +**Returns:** *void* + +___ + +### getBssid + +▸ **getBssid**(): *string* + +*Defined in [wifi-events/modules/wifi-events/index.ts:64](https://github.com/marcelkottmann/esp32-javascript/blob/2b53f2e/components/wifi-events/modules/wifi-events/index.ts#L64)* + +Get the bssid of the current connected wifi AP as formatted as hex string. + +**Returns:** *string* + +The bssid. diff --git a/package.json b/package.json new file mode 100644 index 0000000..83e92f4 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "esp32-javascript", + "version": "0.0.0", + "description": "", + "scripts": { + "compile": "tsc", + "doc": "typedoc --mode modules --plugin typedoc-plugin-markdown --readme none" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/marcelkottmann/esp32-javascript.git" + }, + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/marcelkottmann/esp32-javascript/issues" + }, + "homepage": "https://github.com/marcelkottmann/esp32-javascript#readme", + "devDependencies": { + "cp2": "file:scripts/cp2", + "typedoc": "^0.17.0-3", + "typedoc-plugin-markdown": "^2.2.17", + "typescript": "^3.8.3" + } +} diff --git a/scripts/copy-modules.sh b/scripts/copy-modules.sh index 6a494e7..2d4538f 100755 --- a/scripts/copy-modules.sh +++ b/scripts/copy-modules.sh @@ -1,4 +1,7 @@ #!/bin/bash +set -e -mkdir -p build/modules -cp -r components/*/modules/* build/modules \ No newline at end of file +npm install +npx tsc +rm -rf build/modules +npx cp2 --verbose 'components/**/modules/**/*.js' 'f=>f.replace(/components\/([^\/]+)/,"build")' diff --git a/scripts/cp2/cp2.js b/scripts/cp2/cp2.js new file mode 100755 index 0000000..1550ba7 --- /dev/null +++ b/scripts/cp2/cp2.js @@ -0,0 +1,76 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const glob = require('glob'); +const meow = require('meow'); + +async function main() { + + const cli = meow(` + Usage of cp2 + + $ cp2 [--dry-run] [--verbose] SRC EXPR + + SRC - input src files glob + EXPR - javascript function that accepts filename as string and returns + target filename + + --dry-run Don't copy or move files. For testing the function. + --verbose Output src and target file locations. + --move Move instead of copy. + + Examples + $ cp2 '**/*.js' 'f=>f.replace(/.*\/src\/([^\/]+)\/.*\/([^\/]+)$/,"out/$1/$2")' + + Please use single-quotes enclosed arguments to protect glob and expression + from interpretion by your shell. +`, { + flags: { + 'dry-run': { + type: 'boolean', + }, + 'verbose': { + type: 'boolean', + }, + 'move': { + type: 'boolean', + } + } + }); + + if (cli.input.length < 2) { + console.error(cli.help); + process.exit(1); + } + + const files = glob.sync(cli.input[0]); + + let findReplace; + try { + findReplace = eval(cli.input.slice(1).join(' ')); + } catch (error) { + console.error('javascript find-replace-function contains error:'); + console.error(error); + process.exit(2); + } + + files.forEach(f => { + let target = findReplace.call(findReplace, f); + + if (f === target) { + console.log(`ommiting ${f}: src and target are equal`) + } else { + if (cli.flags.verbose) { + console.log(`${cli.flags.move ? 'mv' : 'cp'} ${f} ==> ${target}`); + } + + if (!cli.flags.dryRun) { + fs.mkdirSync(path.dirname(target), { recursive: true }); + cli.flags.move ? fs.renameSync(f, target) : fs.copyFileSync(f, target); + } + } + }); +} + +main(); diff --git a/scripts/cp2/package-lock.json b/scripts/cp2/package-lock.json new file mode 100644 index 0000000..51415b6 --- /dev/null +++ b/scripts/cp2/package-lock.json @@ -0,0 +1,518 @@ +{ + "name": "cp2", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", + "requires": { + "@babel/highlight": "^7.10.1" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, + "@babel/highlight": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==" + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==" + }, + "meow": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "requires": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" + } + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==" + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + } + } +} diff --git a/scripts/cp2/package.json b/scripts/cp2/package.json new file mode 100644 index 0000000..b3330a0 --- /dev/null +++ b/scripts/cp2/package.json @@ -0,0 +1,16 @@ +{ + "name": "cp2", + "version": "1.0.0", + "description": "", + "main": "cp2.js", + "bin": "./cp2.js", + "scripts": { + "start": "node cp2.js" + }, + "author": "Marcel Kottmann", + "license": "MIT", + "dependencies": { + "glob": "^7.1.6", + "meow": "^7.0.1" + } +} \ No newline at end of file diff --git a/scripts/generate-api-doc.sh b/scripts/generate-api-doc.sh deleted file mode 100755 index 0c939a5..0000000 --- a/scripts/generate-api-doc.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -npx jsdoc-to-markdown $(find components -iname '*.js') > api.md diff --git a/tools/Dockerfile b/tools/Dockerfile new file mode 100644 index 0000000..4475141 --- /dev/null +++ b/tools/Dockerfile @@ -0,0 +1,4 @@ +FROM espressif/idf:latest + +ADD . /opt/esp32-javascript +WORKDIR /opt/esp32-javascript diff --git a/tools/install-node.sh b/tools/install-node.sh new file mode 100755 index 0000000..0eb2f17 --- /dev/null +++ b/tools/install-node.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -e + +VERSION=v12.17.0 +DISTRO=linux-x64 + +wget https://nodejs.org/dist/${VERSION}/node-${VERSION}-${DISTRO}.tar.xz + +mkdir -p /usr/local/lib/nodejs +tar -xJvf node-$VERSION-$DISTRO.tar.xz -C /usr/local/lib/nodejs +export PATH=/usr/local/lib/nodejs/node-$VERSION-$DISTRO/bin:$PATH + +node -v diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1faf847 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "declaration": false, + "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, + "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* Enable strict null checks. */, + "strictFunctionTypes": true /* Enable strict checking of function types. */, + "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, + "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, + "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, + "noImplicitUseStrict": true, + "baseUrl": "./components/" /* Base directory to resolve non-relative module names. */, + "paths": { + "*": [ + "esp32-javascript/modules/*", + "wifi-events/modules/*", + "socket-events/modules/*" + ] + }, + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, + "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ + }, + "exclude": [ + "build" + ] +} \ No newline at end of file pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy