Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 731beca

Browse files
feat: improve socket-events performance
1 parent 43e3b0f commit 731beca

File tree

15 files changed

+489
-224
lines changed

15 files changed

+489
-224
lines changed

components/esp32-javascript/esp32-javascript.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -390,18 +390,31 @@ static void createConsole(duk_context *ctx)
390390
duk_put_prop_string(ctx, obj_idx, "log");
391391
duk_push_c_function(ctx, console_debug_binding, 1);
392392
duk_put_prop_string(ctx, obj_idx, "debug");
393+
duk_push_boolean(ctx, DEBUG >= (5 - LOG_LOCAL_LEVEL));
394+
duk_put_prop_string(ctx, obj_idx, "isDebug");
393395
duk_push_c_function(ctx, console_info_binding, 1);
394396
duk_put_prop_string(ctx, obj_idx, "info");
397+
duk_push_boolean(ctx, INFO >= (5 - LOG_LOCAL_LEVEL));
398+
duk_put_prop_string(ctx, obj_idx, "isInfo");
395399
duk_push_c_function(ctx, console_warn_binding, 1);
396400
duk_put_prop_string(ctx, obj_idx, "warn");
401+
duk_push_boolean(ctx, WARN >= (5 - LOG_LOCAL_LEVEL));
402+
duk_put_prop_string(ctx, obj_idx, "isWarn");
397403
duk_push_c_function(ctx, console_error_binding, 1);
398404
duk_put_prop_string(ctx, obj_idx, "error");
405+
duk_push_boolean(ctx, ERROR >= (5 - LOG_LOCAL_LEVEL));
406+
duk_put_prop_string(ctx, obj_idx, "isError");
399407

400408
duk_put_global_string(ctx, "console");
401409
}
402410

403411
static duk_ret_t el_suspend(duk_context *ctx)
404412
{
413+
// force garbage collection 2 times see duktape doc
414+
// greatly increases perfomance with external memory
415+
duk_gc(ctx, 0);
416+
duk_gc(ctx, 0);
417+
405418
// feed watchdog
406419
vTaskDelay(1);
407420

@@ -413,15 +426,6 @@ static duk_ret_t el_suspend(duk_context *ctx)
413426
int arrsize = 0;
414427
TickType_t timeout = portMAX_DELAY;
415428

416-
// If event queue is empty its time for a manually started garbage collection
417-
if (uxQueueMessagesWaiting(el_event_queue) == 0)
418-
{
419-
// force garbage collection 2 times see duktape doc
420-
// greatly increases perfomance with external memory
421-
duk_gc(ctx, 0);
422-
duk_gc(ctx, 0);
423-
}
424-
425429
while (xQueueReceive(el_event_queue, &events, timeout) == pdTRUE)
426430
{
427431
timeout = 0; // set timeout to 0 to not wait in while loop if there are no more events available

components/esp32-javascript/modules/esp32-javascript/configserver.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,8 @@ function startConfigServer() {
352352
});
353353
}, 2000);
354354
}
355-
redirect(res, "/native-ota");
356355
}
356+
redirect(res, "/native-ota");
357357
}
358358
else {
359359
page(res, "Upgrade", "" + ((upgradeStatus.status === "error" &&

components/esp32-javascript/modules/esp32-javascript/configserver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,8 +594,8 @@ export function startConfigServer(): void {
594594
);
595595
}, 2000);
596596
}
597-
redirect(res, "/native-ota");
598597
}
598+
redirect(res, "/native-ota");
599599
} else {
600600
page(
601601
res,

components/esp32-javascript/modules/esp32-javascript/esp32-javascript.d.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ declare function el_store(key: string, value: string): void;
1616

1717
declare function setDateTimeInMillis(time: number): void;
1818
declare function setDateTimeZoneOffsetInHours(hours: number): void;
19-
2019
interface Esp32JsFirmwareDefaults {
2120
basicAuthUsername: string;
2221
basicAuthPassword: string;
@@ -108,3 +107,25 @@ declare function el_find_partition(name: string): {
108107
size: number;
109108
};
110109
declare function el_readAndFreeString(ptr: number): string;
110+
111+
interface Console {
112+
/*
113+
* Check if logger level is appropiate to print debug messsages.
114+
*/
115+
isDebug: boolean;
116+
117+
/*
118+
* Check if logger level is appropiate to print info messsages.
119+
*/
120+
isInfo: boolean;
121+
122+
/*
123+
* Check if logger level is appropiate to print warn messsages.
124+
*/
125+
isWarn: boolean;
126+
127+
/*
128+
* Check if logger level is appropiate to print error messsages.
129+
*/
130+
isError: boolean;
131+
}

components/esp32-javascript/modules/esp32-javascript/http.js

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,20 +93,22 @@ function httpServer(port, isSSL, cb) {
9393
contentLength = parseInt(contentLengthHeader);
9494
}
9595
if (contentLength > 0) {
96-
console.debug("A request body is expected.");
96+
if (console.isDebug) {
97+
console.debug("A request body is expected.");
98+
}
9799
if (gotten >= endOfHeaders + 4 + contentLength) {
98100
var potentialRequestBody = textEncoder.encode(complete.substring(endOfHeaders + 4).toString());
99101
postedData = textDecoder.decode(potentialRequestBody.subarray(0, contentLength));
100-
console.debug("Request body is complete:");
101-
console.debug(postedData);
102+
if (console.isDebug) {
103+
console.debug("Request body is complete:");
104+
console.debug(postedData);
105+
}
102106
}
103107
else {
104108
//wait for more data to come (body of a POST request)
105-
console.debug("Waiting for more data to come:");
106-
console.debug(contentLength);
107-
console.debug(complete.length);
108-
console.debug(gotten);
109-
console.debug(endOfHeaders);
109+
if (console.isDebug) {
110+
console.debug("Waiting for more data to come:");
111+
}
110112
return;
111113
}
112114
}
@@ -197,7 +199,7 @@ function httpServer(port, isSSL, cb) {
197199
}
198200
if (!responseHeaders_1.has("connection")) {
199201
responseHeaders_1.set("connection", "keep-alive");
200-
socket.setReadTimeout(20000);
202+
socket.setReadTimeout(22222); // set to a non-standard timeout
201203
}
202204
var contentType = responseHeaders_1.get("content-type");
203205
if (typeof contentType !== "string") {
@@ -251,29 +253,39 @@ function httpServer(port, isSSL, cb) {
251253
contentLength = 0;
252254
headers = undefined;
253255
statusLine = undefined;
254-
console.debug("gotten: " + gotten);
255-
console.debug("complete.length: " + complete.length);
256256
var item_1 = { req: req_1, res: res_1 };
257257
var num = active.push(item_1);
258-
console.debug("Currently active requests: " + num);
258+
if (console.isDebug) {
259+
console.debug("Currently active requests: " + num);
260+
}
259261
res_1.on("end", function () {
260-
console.debug("splicing req/res form active list");
262+
if (console.isDebug) {
263+
console.debug("splicing req/res form active list");
264+
}
261265
active.splice(active.indexOf(item_1), 1);
262266
});
263267
var previous = num - 2;
264268
if (previous < 0 || active[previous].res.isEnded) {
265269
// active request/response is empty, perform immediately
266-
console.debug("// active request/response is empty or entries are ended, perform immediately");
270+
if (console.isDebug) {
271+
console.debug("// active request/response is empty or entries are ended, perform immediately");
272+
}
267273
setTimeout(function () {
268-
console.debug("perform immediate");
274+
if (console.isDebug) {
275+
console.debug("perform immediate");
276+
}
269277
cb(req_1, res_1);
270278
}, 0);
271279
}
272280
else {
273281
// queue request/response callback after previous request/response
274-
console.debug("// queue request/response callback after previous request/response");
282+
if (console.isDebug) {
283+
console.debug("// queue request/response callback after previous request/response");
284+
}
275285
active[previous].res.on("end", function () {
276-
console.debug("end of previous req/res: triggering new req/res callback");
286+
if (console.isDebug) {
287+
console.debug("end of previous req/res: triggering new req/res callback");
288+
}
277289
cb(req_1, res_1);
278290
});
279291
}

components/esp32-javascript/modules/esp32-javascript/http.ts

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -131,24 +131,25 @@ export function httpServer(
131131
}
132132

133133
if (contentLength > 0) {
134-
console.debug("A request body is expected.");
135-
134+
if (console.isDebug) {
135+
console.debug("A request body is expected.");
136+
}
136137
if (gotten >= endOfHeaders + 4 + contentLength) {
137138
const potentialRequestBody = textEncoder.encode(
138139
complete.substring(endOfHeaders + 4).toString()
139140
);
140141
postedData = textDecoder.decode(
141142
potentialRequestBody.subarray(0, contentLength)
142143
);
143-
console.debug("Request body is complete:");
144-
console.debug(postedData);
144+
if (console.isDebug) {
145+
console.debug("Request body is complete:");
146+
console.debug(postedData);
147+
}
145148
} else {
146149
//wait for more data to come (body of a POST request)
147-
console.debug("Waiting for more data to come:");
148-
console.debug(contentLength);
149-
console.debug(complete.length);
150-
console.debug(gotten);
151-
console.debug(endOfHeaders);
150+
if (console.isDebug) {
151+
console.debug("Waiting for more data to come:");
152+
}
152153
return;
153154
}
154155
}
@@ -264,7 +265,7 @@ export function httpServer(
264265
}
265266
if (!responseHeaders.has("connection")) {
266267
responseHeaders.set("connection", "keep-alive");
267-
socket.setReadTimeout(20000);
268+
socket.setReadTimeout(22222); // set to a non-standard timeout
268269
}
269270
const contentType = responseHeaders.get("content-type");
270271
if (typeof contentType !== "string") {
@@ -327,36 +328,45 @@ export function httpServer(
327328
headers = undefined;
328329
statusLine = undefined;
329330

330-
console.debug(`gotten: ${gotten}`);
331-
console.debug(`complete.length: ${complete.length}`);
332-
333331
const item = { req, res };
334332
const num = active.push(item);
335-
console.debug(`Currently active requests: ${num}`);
333+
if (console.isDebug) {
334+
console.debug(`Currently active requests: ${num}`);
335+
}
336336
res.on("end", () => {
337-
console.debug("splicing req/res form active list");
337+
if (console.isDebug) {
338+
console.debug("splicing req/res form active list");
339+
}
338340
active.splice(active.indexOf(item), 1);
339341
});
340342

341343
const previous = num - 2;
342344
if (previous < 0 || active[previous].res.isEnded) {
343345
// active request/response is empty, perform immediately
344-
console.debug(
345-
"// active request/response is empty or entries are ended, perform immediately"
346-
);
346+
if (console.isDebug) {
347+
console.debug(
348+
"// active request/response is empty or entries are ended, perform immediately"
349+
);
350+
}
347351
setTimeout(() => {
348-
console.debug("perform immediate");
352+
if (console.isDebug) {
353+
console.debug("perform immediate");
354+
}
349355
cb(req, res);
350356
}, 0);
351357
} else {
352358
// queue request/response callback after previous request/response
353-
console.debug(
354-
"// queue request/response callback after previous request/response"
355-
);
356-
active[previous].res.on("end", () => {
359+
if (console.isDebug) {
357360
console.debug(
358-
"end of previous req/res: triggering new req/res callback"
361+
"// queue request/response callback after previous request/response"
359362
);
363+
}
364+
active[previous].res.on("end", () => {
365+
if (console.isDebug) {
366+
console.debug(
367+
"end of previous req/res: triggering new req/res callback"
368+
);
369+
}
360370
cb(req, res);
361371
});
362372
}

components/esp32-javascript/modules/esp32-js-eventloop/index.js

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ var intervals = [];
1212
var handles = 0;
1313
exports.beforeSuspendHandlers = [];
1414
exports.afterSuspendHandlers = [];
15-
// eslint-disable-next-line @typescript-eslint/ban-types
1615
function setTimeout(fn, timeout) {
1716
var handle = el_createTimer(timeout);
1817
timers.push({
@@ -39,7 +38,6 @@ function clearInterval(handle) {
3938
intervals.splice(idx, 1);
4039
}
4140
}
42-
// eslint-disable-next-line @typescript-eslint/ban-types
4341
function installIntervalTimeout(handle, fn, timeout) {
4442
setTimeout(function () {
4543
if (intervals.indexOf(handle) >= 0) {
@@ -48,7 +46,6 @@ function installIntervalTimeout(handle, fn, timeout) {
4846
}
4947
}, timeout);
5048
}
51-
// eslint-disable-next-line @typescript-eslint/ban-types
5249
function setInterval(fn, timeout) {
5350
var handle = handles++;
5451
intervals.push(handle);
@@ -62,11 +59,12 @@ function el_select_next() {
6259
});
6360
}
6461
var events = el_suspend();
65-
// eslint-disable-next-line @typescript-eslint/ban-types
6662
var collected = [];
6763
var _loop_1 = function (evid) {
6864
var evt = events[evid];
69-
console.debug("HANDLE EVENT: " + JSON.stringify(evt));
65+
if (console.isDebug) {
66+
console.debug("== HANDLE EVENT: " + JSON.stringify(evt) + " ==");
67+
}
7068
if (evt.type === EL_TIMER_EVENT_TYPE) {
7169
//TIMER EVENT
7270
var nextTimer = null;
@@ -77,7 +75,6 @@ function el_select_next() {
7775
}
7876
}
7977
if (!nextTimer) {
80-
//throw Error('UNKNOWN TIMER HANDLE!!!');
8178
console.warn("UNKNOWN TIMER HANDLE:" +
8279
JSON.stringify(evt) +
8380
";" +
@@ -86,25 +83,22 @@ function el_select_next() {
8683
}
8784
else if (evt.type === EL_LOG_EVENT_TYPE) {
8885
//LOG EVENT
89-
var logevent_1 = evt;
90-
collected.push(function () {
91-
var logfunction = console.log;
92-
switch (logevent_1.status) {
93-
case 1:
94-
logfunction = console.debug;
95-
break;
96-
case 2:
97-
logfunction = console.info;
98-
break;
99-
case 3:
100-
logfunction = console.warn;
101-
break;
102-
case 4:
103-
logfunction = console.error;
104-
break;
105-
}
106-
logfunction(el_readAndFreeString(logevent_1.fd));
107-
});
86+
var logfunction = console.log;
87+
switch (evt.status) {
88+
case 1:
89+
logfunction = console.debug;
90+
break;
91+
case 2:
92+
logfunction = console.info;
93+
break;
94+
case 3:
95+
logfunction = console.warn;
96+
break;
97+
case 4:
98+
logfunction = console.error;
99+
break;
100+
}
101+
logfunction("LE " + evt.fd + ": " + el_readAndFreeString(evt.fd));
108102
}
109103
else {
110104
var eventHandled_1 = false;
@@ -126,7 +120,6 @@ function el_select_next() {
126120
return collected;
127121
}
128122
function start() {
129-
// eslint-disable-next-line @typescript-eslint/ban-types
130123
var nextfuncs = [main];
131124
for (;;) {
132125
if (Array.isArray(nextfuncs)) {

0 commit comments

Comments
 (0)