Skip to content

Commit 970a4dd

Browse files
committed
feat: cachetime command line option
1 parent 44639b9 commit 970a4dd

File tree

8 files changed

+83
-30
lines changed

8 files changed

+83
-30
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change log
22

3+
## 1.7
4+
5+
### 1.7.0
6+
7+
- Using the cachetime command line option, you can set whether the browser can cache pages. Together with the ETag switch, you can replace the default no-cache response with a max-age=xy response.
8+
39
## 1.6
410

511
### 1.6.1

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ In order to be able to easily update OTA, it is important - from the users' poin
1212

1313
This npm package provides a solution for **inserting any JS client application into the ESP web server** (PsychicHttp and also ESPAsyncWebServer available, PsychicHttp is the default). For this, JS, html, css, font, assets, etc. files must be converted to binary byte array. Npm mode is easy to use and easy to **integrate into your CI/CD pipeline**.
1414

15+
> Starting with version v1.7.0, with the cachetime command line option, you can set whether the browser can cache pages
16+
1517
> Starting with version v1.6.0, mime npm package is used instead of mime-types (application/javascript -> text/javascript)
1618
1719
> Starting with version v1.5.0, PsychicHttp v2 is also supported.
@@ -176,6 +178,12 @@ The use of ETag is **not enabled by default**, this can be achieved with the `--
176178

177179
> This setting has three states: yes, no, and compiler mode is available. In compiler mode, you can disable/enable ETag by setting the `SVELTEESP32_ENABLE_ETAG` c++ compiler directive. For example, if using platformio, just type `-D SVELTEESP32_ENABLE_ETAG`.
178180
181+
### Cache-control
182+
183+
By default (when using the ETag), we send no-cache in the cache-control header of the HTTP response. Pages, subpages and other elements are downloaded every time. This is perfectly acceptable when serving small pages with ESP.
184+
185+
At the same time, it can be an advantage that the content is cached by the browser and not even the ETag check is performed. For this, you can specify how many seconds the max-age value sent instead of no-cache should be. In the case of `--cachetime=86400` (max-age=86400), the page (and other elements) will not be downloaded by the browser **for one day**.
186+
179187
### Main entry point - index.html
180188

181189
Typically, the entry point for web applications is the **index.htm or index.html** file. This does not need to be listed in the browser's address bar because web servers know that this file should be served by default. Svelteesp32 also does this: if there is an index.htm or index.html file, it sets it as the main file to be served. So using `http://esp_xxx.local` or just entering the `http://x.y.w.z/` IP address will serve this main file.
@@ -230,6 +238,7 @@ You can use the following c++ directives at the project level if you want to con
230238
| `-e` | The engine for which the include file is created (psychic/psychic2/async) | psychic |
231239
| `-o` | Generated output file with path | `svelteesp32.h` |
232240
| `--etag` | Use ETag header for cache (true/false/compiler) | false |
241+
| `--cachetime` | Override no-cache response with a max-age=<cachetime> response | 0 |
233242
| `--gzip` | Compress content with gzip (true/false/compiler) | true |
234243
| `--created` | Include creation time | false |
235244
| `--version` | Include a version string, `--version=v$npm_package_version` | '' |

demo/esp32/platformio.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[env]
22
platform = espressif32
33
board = wemos_d1_mini32
4+
#board = lolin_s3_mini
45
framework = arduino
56

67

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "svelteesp32",
3-
"version": "1.6.1",
3+
"version": "1.7.0",
44
"description": "Convert Svelte (or any frontend) JS application to serve it from ESP32 webserver (PsychicHttp)",
55
"author": "BCsabaEngine",
66
"license": "ISC",

package.script

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
1-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/_/svelteesp32async.h --etag=false --gzip=false
2-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/g/svelteesp32async.h --etag=false --gzip=true
3-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/gc/svelteesp32async.h --etag=false --gzip=compiler
4-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/e/svelteesp32async.h --etag=true --gzip=false
5-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/eg/svelteesp32async.h --etag=true --gzip=true
6-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/egc/svelteesp32async.h --etag=true --gzip=compiler
7-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/ec/svelteesp32async.h --etag=compiler --gzip=false
8-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/ecg/svelteesp32async.h --etag=compiler --gzip=true
9-
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/ecgc/svelteesp32async.h --etag=compiler --gzip=compiler
1+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/_/svelteesp32async.h --etag=false --gzip=false --cachetime=86400
2+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/g/svelteesp32async.h --etag=false --gzip=true --cachetime=86400
3+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/gc/svelteesp32async.h --etag=false --gzip=compiler --cachetime=86400
4+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/e/svelteesp32async.h --etag=true --gzip=false --cachetime=86400
5+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/eg/svelteesp32async.h --etag=true --gzip=true --cachetime=86400
6+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/egc/svelteesp32async.h --etag=true --gzip=compiler --cachetime=86400
7+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/ec/svelteesp32async.h --etag=compiler --gzip=false --cachetime=86400
8+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/ecg/svelteesp32async.h --etag=compiler --gzip=true --cachetime=86400
9+
npx tsx src/index.ts -e async -s ./demo/svelte/dist -o ./demo/esp32/include/ecgc/svelteesp32async.h --etag=compiler --gzip=compiler --cachetime=86400
1010

11-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/_/svelteesp32psychic.h --etag=false --gzip=false
12-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/g/svelteesp32psychic.h --etag=false --gzip=true
13-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/gc/svelteesp32psychic.h --etag=false --gzip=compiler
14-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/e/svelteesp32psychic.h --etag=true --gzip=false
15-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/eg/svelteesp32psychic.h --etag=true --gzip=true
16-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/egc/svelteesp32psychic.h --etag=true --gzip=compiler
17-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/ec/svelteesp32psychic.h --etag=compiler --gzip=false
18-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/ecg/svelteesp32psychic.h --etag=compiler --gzip=true
19-
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/ecgc/svelteesp32psychic.h --etag=compiler --gzip=compiler
11+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/_/svelteesp32psychic.h --etag=false --gzip=false --cachetime=86400
12+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/g/svelteesp32psychic.h --etag=false --gzip=true --cachetime=86400
13+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/gc/svelteesp32psychic.h --etag=false --gzip=compiler --cachetime=86400
14+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/e/svelteesp32psychic.h --etag=true --gzip=false --cachetime=86400
15+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/eg/svelteesp32psychic.h --etag=true --gzip=true --cachetime=86400
16+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/egc/svelteesp32psychic.h --etag=true --gzip=compiler --cachetime=86400
17+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/ec/svelteesp32psychic.h --etag=compiler --gzip=false --cachetime=86400
18+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/ecg/svelteesp32psychic.h --etag=compiler --gzip=true --cachetime=86400
19+
npx tsx src/index.ts -e psychic -s ./demo/svelte/dist -o ./demo/esp32/include/ecgc/svelteesp32psychic.h --etag=compiler --gzip=compiler --cachetime=86400
2020

21-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/_/svelteesp32psychic2.h --etag=false --gzip=false
22-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/g/svelteesp32psychic2.h --etag=false --gzip=true
23-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/gc/svelteesp32psychic2.h --etag=false --gzip=compiler
24-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/e/svelteesp32psychic2.h --etag=true --gzip=false
25-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/eg/svelteesp32psychic2.h --etag=true --gzip=true
26-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/egc/svelteesp32psychic2.h --etag=true --gzip=compiler
27-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/ec/svelteesp32psychic2.h --etag=compiler --gzip=false
28-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/ecg/svelteesp32psychic2.h --etag=compiler --gzip=true
29-
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/ecgc/svelteesp32psychic2.h --etag=compiler --gzip=compiler
21+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/_/svelteesp32psychic2.h --etag=false --gzip=false --cachetime=86400
22+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/g/svelteesp32psychic2.h --etag=false --gzip=true --cachetime=86400
23+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/gc/svelteesp32psychic2.h --etag=false --gzip=compiler --cachetime=86400
24+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/e/svelteesp32psychic2.h --etag=true --gzip=false --cachetime=86400
25+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/eg/svelteesp32psychic2.h --etag=true --gzip=true --cachetime=86400
26+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/egc/svelteesp32psychic2.h --etag=true --gzip=compiler --cachetime=86400
27+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/ec/svelteesp32psychic2.h --etag=compiler --gzip=false --cachetime=86400
28+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/ecg/svelteesp32psychic2.h --etag=compiler --gzip=true --cachetime=86400
29+
npx tsx src/index.ts -e psychic2 -s ./demo/svelte/dist -o ./demo/esp32/include/ecgc/svelteesp32psychic2.h --etag=compiler --gzip=compiler --cachetime=86400

src/commandLine.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface ICopyFilesArguments {
1010
define: string;
1111
gzip: 'true' | 'false' | 'compiler';
1212
etag: 'true' | 'false' | 'compiler';
13+
cachetime: number;
1314
created: boolean;
1415
version: string;
1516
help?: boolean;
@@ -79,6 +80,11 @@ export const cmdLine = parse<ICopyFilesArguments>(
7980
description: 'Prefix of c++ defines',
8081
defaultValue: 'SVELTEESP32'
8182
},
83+
cachetime: {
84+
type: Number,
85+
description: 'max-age cache time in seconds',
86+
defaultValue: 0
87+
},
8288
help: { type: Boolean, optional: true, alias: 'h', description: 'Shows this help' }
8389
},
8490
{

src/cppCode.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,22 @@ void {{methodName}}(PsychicHttpServer * server) {
168168
169169
{{#switch ../etag}}
170170
{{#case "true"}}
171+
{{#../cacheTime}}
172+
response.addHeader("cache-control", "max-age={{value}}");
173+
{{/../cacheTime}}
174+
{{^../cacheTime}}
171175
response.addHeader("cache-control", "no-cache");
176+
{{/../cacheTime}}
172177
response.addHeader("ETag", etag_{{this.dataname}});
173178
{{/case}}
174179
{{#case "compiler"}}
175180
#ifdef {{../definePrefix}}_ENABLE_ETAG
181+
{{#../cacheTime}}
182+
response.addHeader("cache-control", "max-age={{value}}");
183+
{{/../cacheTime}}
184+
{{^../cacheTime}}
176185
response.addHeader("cache-control", "no-cache");
186+
{{/../cacheTime}}
177187
response.addHeader("ETag", etag_{{this.dataname}});
178188
#endif
179189
{{/case}}
@@ -345,12 +355,22 @@ void {{methodName}}(PsychicHttpServer * server) {
345355
346356
{{#switch ../etag}}
347357
{{#case "true"}}
358+
{{#../cacheTime}}
359+
response->addHeader("cache-control", "max-age={{value}}");
360+
{{/../cacheTime}}
361+
{{^../cacheTime}}
348362
response->addHeader("cache-control", "no-cache");
363+
{{/../cacheTime}}
349364
response->addHeader("ETag", etag_{{this.dataname}});
350365
{{/case}}
351366
{{#case "compiler"}}
352367
#ifdef {{../definePrefix}}_ENABLE_ETAG
368+
{{#../cacheTime}}
369+
response->addHeader("cache-control", "max-age={{value}}");
370+
{{/../cacheTime}}
371+
{{^../cacheTime}}
353372
response->addHeader("cache-control", "no-cache");
373+
{{/../cacheTime}}
354374
response->addHeader("ETag", etag_{{this.dataname}});
355375
#endif
356376
{{/case}}
@@ -526,12 +546,22 @@ void {{methodName}}(AsyncWebServer * server) {
526546
527547
{{#switch ../etag}}
528548
{{#case "true"}}
549+
{{#../cacheTime}}
550+
response->addHeader("cache-control", "max-age={{value}}");
551+
{{/../cacheTime}}
552+
{{^../cacheTime}}
529553
response->addHeader("cache-control", "no-cache");
554+
{{/../cacheTime}}
530555
response->addHeader("ETag", etag_{{this.dataname}});
531556
{{/case}}
532557
{{#case "compiler"}}
533558
#ifdef {{../definePrefix}}_ENABLE_ETAG
559+
{{#../cacheTime}}
560+
response->addHeader("cache-control", "max-age={{value}}");
561+
{{/../cacheTime}}
562+
{{^../cacheTime}}
534563
response->addHeader("cache-control", "no-cache");
564+
{{/../cacheTime}}
535565
response->addHeader("ETag", etag_{{this.dataname}});
536566
#endif
537567
{{/case}}
@@ -572,6 +602,7 @@ export const getCppCode = (sources: CppCodeSources, filesByExtension: ExtensionG
572602
created: cmdLine.created,
573603
version: cmdLine.version,
574604
methodName: cmdLine.espmethod,
605+
cacheTime: cmdLine.cachetime ? { value: cmdLine.cachetime } : undefined,
575606
definePrefix: cmdLine.define
576607
},
577608
{

0 commit comments

Comments
 (0)