Skip to content

Commit a426093

Browse files
committed
8 Feb 2024
Changes to client-side storage cache mechanics. 1) ADDED CACHE_VER to settings. 2) Added LIB-CCache.php 3) Updated LIB-Install.php > Run CCache->init() on installation end. 4) CB-worker.js - Removed storage cache, moved to PAGE-cbwork.js instead. 5) Updated TEMPLATE-top.php - Load PAGE-cbwork.js 6) Renamed assets/head-storage-boxx.webp to banner.webp 7) Page settings - Will not show "CACHE_VER" TLDR - Call $_CORE->CCache->init() to "force push update". All clients will rebuild cached asset files.
1 parent ac0c72b commit a426093

11 files changed

+67
-49
lines changed

admin/pages/ADM-settings.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
require PATH_PAGES . "TEMPLATE-ADM-top.php"; ?>
88
<h3 class="mb-3">SYSTEM SETTINGS</h3>
99
<form id="set-list" onsubmit="return save()">
10-
<?php foreach ($settings as $o) { ?>
10+
<?php foreach ($settings as $o) { if ($o["setting_name"]!="CACHE_VER") { ?>
1111
<div class="form-floating mb-3">
1212
<input type="text" class="form-control" required
1313
name="<?=$o["setting_name"]?>" value="<?=$o["setting_value"]?>">
1414
<label><?=$o["setting_description"]?></label>
1515
</div>
16-
<?php } ?>
16+
<?php }} ?>
1717

1818
<button type="submit" class="my-1 btn btn-primary d-flex-inline">
1919
<i class="ico-sm icon-floppy-disk"></i> Save Settings

admin/pages/ADM-users-list.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
<div class="d-flex align-items-center border p-2">
88
<div class="flex-grow-1">
99
<strong><?=$u["user_name"]?></strong><br>
10-
<small><?=USR_LVL[$u["user_level"]]?></small><br>
11-
<small><?=$u["user_email"]?></small>
10+
<small>
11+
<span class="badge bg-secondary">level</span> <?=USR_LVL[$u["user_level"]]?><br>
12+
<span class="badge bg-secondary">email</span> <?=$u["user_email"]?>
13+
</small>
1214
</div>
1315
<div class="dropdown">
1416
<button type="button" class="btn btn-primary p-3 ico-sm icon-arrow-right" type="button" data-bs-toggle="dropdown"></button>

core/CB-worker.js

+6-39
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,11 @@
1-
// (A) CREATE/INSTALL CACHE
2-
self.addEventListener("install", evt => {
3-
self.skipWaiting();
4-
evt.waitUntil(
5-
caches.open("CoreBoxx")
6-
.then(cache => cache.addAll([
7-
// (A1) BOOTSTRAP
8-
"assets/bootstrap.bundle.min.js",
9-
"assets/bootstrap.bundle.min.js.map",
10-
"assets/bootstrap.min.css",
11-
"assets/bootstrap.min.css.map",
12-
// (A2) ICONS + IMAGES
13-
"assets/ico-512.png",
14-
"assets/favicon.png",
15-
// (A3) COMMON INTERFACE
16-
"assets/icomoon.woff",
17-
"assets/PAGE-cb.js",
18-
"assets/PAGE-cb.css",
19-
"CB-manifest.json"
20-
// @TODO - ADD MORE OF YOUR OWN TO CACHE
21-
]))
22-
.catch(err => console.error(err))
23-
);
24-
});
25-
26-
// (B) CLAIM CONTROL INSTANTLY
27-
self.addEventListener("activate", evt => self.clients.claim());
28-
29-
// (C) LOAD FROM CACHE FIRST, FALLBACK TO NETWORK IF NOT FOUND
30-
self.addEventListener("fetch", evt => evt.respondWith(
31-
caches.match(evt.request).then(res => res || fetch(evt.request))
1+
// (A) LOAD FROM CACHE FIRST, FALLBACK TO NETWORK IF NOT FOUND
2+
self.addEventListener("fetch", e => e.respondWith(
3+
caches.match(e.request).then(r => r || fetch(e.request))
324
));
335

34-
/* (C) LOAD WITH NETWORK FIRST, FALLBACK TO CACHE IF OFFLINE
35-
self.addEventListener("fetch", evt => evt.respondWith(
36-
fetch(evt.request).catch(() => caches.match(evt.request))
37-
)); */
38-
39-
// (D) LISTEN TO PUSH NOTIFICATIONS
40-
self.addEventListener("push", evt => {
41-
const data = evt.data.json();
6+
// (B) LISTEN TO PUSH NOTIFICATIONS
7+
self.addEventListener("push", e => {
8+
const data = e.data.json();
429
self.registration.showNotification(data.title, {
4310
body: data.body,
4411
icon: data.icon,

core/assets/PAGE-cbwork.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
if ("serviceWorker" in navigator) {
2+
// (A) REGISTER SERVICE WORKER
3+
navigator.serviceWorker.register(cbhost.base+"CB-worker.js", {scope: cbhost.basepath});
4+
5+
// (B) UPDATE CACHE
6+
if (cbcache.s > cbcache.c) {
7+
// (B1) GET FILES LIST FROM SERVER
8+
fetch(cbhost.base+"CB-cache-files.json")
9+
.then(r => r.json())
10+
.then(async f => {
11+
// (B2) DELETE OLD CACHE
12+
if (await caches.has(cbcache.n)) {
13+
await caches.delete(cbcache.n);
14+
}
15+
16+
// (B3) UPDATE CACHE
17+
(await caches.open(cbcache.n)).addAll(f);
18+
localStorage.setItem("CBCACHE", cbcache.s);
19+
});
20+
}
21+
}
File renamed without changes.

core/lib/LIB-CCache.php

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
class CCache extends Core {
3+
// (A) REGENERATE CLIENT STORAGE CACHE LIST
4+
function init () : void {
5+
// (A1) GET FILES TO STORE IN CACHE
6+
$all = [HOST_ASSETS . "favicon.png", HOST_ASSETS . "ico-512.png"];
7+
if (file_exists(PATH_ASSETS . "banner.webp")) {
8+
$all[] = HOST_ASSETS."banner.webp";
9+
}
10+
if (file_exists(PATH_ASSETS . "users.webp")) {
11+
$all[] = HOST_ASSETS."users.webp";
12+
}
13+
foreach (glob(PATH_ASSETS . "*.{js,css,map,woff}", GLOB_BRACE) as $f) {
14+
$all[] = HOST_ASSETS . basename($f);
15+
}
16+
file_put_contents(PATH_BASE . "CB-cache-files.json", json_encode($all));
17+
18+
// (A2) UPDATE DATABASE TIMESTAMP
19+
$this->Core->load("DB");
20+
$this->DB->update("settings", ["setting_value"], "`setting_name`=?", [strtotime("now"), "CACHE_VER"]);
21+
}
22+
}

core/lib/LIB-Install.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -227,15 +227,19 @@ function F () {
227227

228228
// (PHASE G) CLEAN UP
229229
function G () {
230-
// (G1) SWAP OUT INDEX
230+
// (G1) GENERATE LIST OF ASSET FILES FOR CLIENTS TO CACHE
231+
$this->Core->load("CCache");
232+
$this->CCache->init();
233+
234+
// (G2) SWAP OUT INDEX
231235
file_put_contents(PATH_BASE . "index.php", <<<EOF
232236
<?php
233237
require __DIR__ . DIRECTORY_SEPARATOR . "lib" . DIRECTORY_SEPARATOR . "CORE-Go.php";
234238
\$_CORE->load("Route");
235239
\$_CORE->Route->run();
236240
EOF);
237241

238-
// (G2) INSTALL COMPLETE!
242+
// (G3) INSTALL COMPLETE!
239243
if (defined("I_RELOAD")) { $this->Core->redirect(); }
240244
exit("OK");
241245
}

core/lib/SQL-CoreBoxx-1.sql

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CREATE TABLE `settings` (
77

88
INSERT INTO `settings` (`setting_name`, `setting_description`, `setting_value`, `setting_group`) VALUES
99
('APP_VER', 'App version', '1', 0),
10+
('CACHE_VER', 'Client storage cache timestamp', 0, 1),
1011
('EMAIL_FROM', 'System email from', 'sys@site.com', 1),
1112
('PAGE_PER', 'Number of entries per page', '20', 1),
1213
('D_LONG', 'MYSQL date format (long)', '%e %M %Y', 1),

core/pages/TEMPLATE-top.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727

2828
<!-- (A4) SERVICE WORKER + HOST -->
2929
<script>
30-
if ("serviceWorker" in navigator) { navigator.serviceWorker.register("<?=HOST_BASE?>CB-worker.js", {scope: "<?=HOST_BASE_PATH?>"}); }
31-
var cbhost={base:"<?=HOST_BASE?>",basepath:"<?=HOST_BASE_PATH?>",api:"<?=HOST_API_BASE?>",assets:"<?=HOST_ASSETS?>"};
30+
const cbhost={base:"<?=HOST_BASE?>",basepath:"<?=HOST_BASE_PATH?>",api:"<?=HOST_API_BASE?>",assets:"<?=HOST_ASSETS?>"},
31+
cbcache={n:"CBCACHE",s:<?=CACHE_VER?>,c:localStorage.getItem("CBCACHE") || 0};
3232
</script>
33+
<script src="<?=HOST_ASSETS?>PAGE-cbwork.js"></script>
3334

3435
<!-- (A5) LIBRARIES & SCRIPTS -->
3536
<!-- https://getbootstrap.com/ -->

web push/pages/ADM-push.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
</div>
2020

2121
<div class="form-floating mb-4">
22-
<input type="text" class="form-control" id="push_img" required value="<?=HOST_ASSETS?>head-core-boxx.webp">
22+
<input type="text" class="form-control" id="push_img" required value="<?=HOST_ASSETS?>banner.webp">
2323
<label>Cover Image</label>
2424
</div>
2525

web push/pages/PAGE-push.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
</div>
2828

2929
<div class="form-floating mb-4">
30-
<input type="text" required class="form-control" name="image" value="<?=HOST_ASSETS?>head-core-boxx.webp">
30+
<input type="text" required class="form-control" name="image" value="<?=HOST_ASSETS?>banner.webp">
3131
<label class="form-label">Image</label>
3232
</div>
3333

0 commit comments

Comments
 (0)