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