@tomorrowos/sdk 0.8.5 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/REPLIT_SETUP.md
CHANGED
package/dist/tomorrowos.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAKV,eAAe,EAEhB,MAAM,kBAAkB,CAAC;AAc1B,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,eAAe,CAAC;IACvB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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"}
|
package/dist/tomorrowos.js
CHANGED
|
@@ -1432,6 +1432,20 @@ export class TomorrowOS extends EventEmitter {
|
|
|
1432
1432
|
})();
|
|
1433
1433
|
return;
|
|
1434
1434
|
}
|
|
1435
|
+
if (type === "device.ping") {
|
|
1436
|
+
ws.send(JSON.stringify({
|
|
1437
|
+
type: "device.pong",
|
|
1438
|
+
timestamp: new Date().toISOString()
|
|
1439
|
+
}));
|
|
1440
|
+
const deviceId = ws.deviceId;
|
|
1441
|
+
if (deviceId) {
|
|
1442
|
+
const timestamp = typeof msg.timestamp === "string" && msg.timestamp.trim()
|
|
1443
|
+
? msg.timestamp
|
|
1444
|
+
: new Date().toISOString();
|
|
1445
|
+
this.emit("device.heartbeat", { deviceId, timestamp });
|
|
1446
|
+
}
|
|
1447
|
+
return;
|
|
1448
|
+
}
|
|
1435
1449
|
if (type === "device.log") {
|
|
1436
1450
|
const deviceId = ws.deviceId;
|
|
1437
1451
|
if (!deviceId)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomorrowos/sdk",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.7",
|
|
4
4
|
"description": "TomorrowOS CMS server SDK - WebSocket transport, pairing, device commands, optional static CMS UI. Includes CLI (tomorrowos init / build) and starter templates.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "my-cms",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.7",
|
|
4
4
|
"description": "CMS server on @tomorrowos/sdk. Add your UI (React, static files, etc.) alongside this server.",
|
|
5
5
|
"private": true,
|
|
6
6
|
"type": "module",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"build-player": "tomorrowos build --platform tizen"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@tomorrowos/sdk": "^0.8.
|
|
16
|
+
"@tomorrowos/sdk": "^0.8.7",
|
|
17
17
|
"dotenv": "^17.2.3",
|
|
18
18
|
"tsx": "^4.19.0"
|
|
19
19
|
},
|
|
@@ -810,13 +810,14 @@ function renderEditorAssets() {
|
|
|
810
810
|
|
|
811
811
|
const downloadBtn = document.createElement("button");
|
|
812
812
|
downloadBtn.type = "button";
|
|
813
|
+
downloadBtn.className = "playlist-item-btn";
|
|
813
814
|
downloadBtn.textContent = "Download";
|
|
814
815
|
downloadBtn.title = "Download asset";
|
|
815
816
|
downloadBtn.addEventListener("click", () => void downloadMediaAsset(item));
|
|
816
817
|
|
|
817
818
|
const removeBtn = document.createElement("button");
|
|
818
819
|
removeBtn.type = "button";
|
|
819
|
-
removeBtn.className = "danger";
|
|
820
|
+
removeBtn.className = "danger playlist-item-btn";
|
|
820
821
|
removeBtn.textContent = "Remove";
|
|
821
822
|
removeBtn.addEventListener("click", () => {
|
|
822
823
|
editorItems = editorItems.filter((x) => x.id !== item.id);
|
|
@@ -1708,32 +1709,46 @@ function sanitizeDownloadFilename(name) {
|
|
|
1708
1709
|
}
|
|
1709
1710
|
|
|
1710
1711
|
async function downloadMediaAsset(item) {
|
|
1711
|
-
|
|
1712
|
+
const candidates = [];
|
|
1713
|
+
const sameOriginPath = resolveVerificationMediaUrl(item.url);
|
|
1714
|
+
if (sameOriginPath) candidates.push(sameOriginPath);
|
|
1712
1715
|
try {
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
+
const absolute = absoluteMediaUrl(item.url);
|
|
1717
|
+
if (absolute && !candidates.includes(absolute)) candidates.push(absolute);
|
|
1718
|
+
} catch (_) {}
|
|
1719
|
+
|
|
1720
|
+
if (candidates.length === 0) {
|
|
1721
|
+
openDownloadFailedModal("Media URL is not available.");
|
|
1716
1722
|
return;
|
|
1717
1723
|
}
|
|
1718
1724
|
|
|
1719
1725
|
const filename = sanitizeDownloadFilename(item.name || item.url.split("/").pop() || "asset");
|
|
1720
1726
|
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1727
|
+
let lastError = "Network or browser error.";
|
|
1728
|
+
for (const url of candidates) {
|
|
1729
|
+
try {
|
|
1730
|
+
const res = await fetch(url);
|
|
1731
|
+
if (!res.ok) {
|
|
1732
|
+
lastError = `HTTP ${res.status}`;
|
|
1733
|
+
continue;
|
|
1734
|
+
}
|
|
1735
|
+
const blob = await res.blob();
|
|
1736
|
+
const objectUrl = URL.createObjectURL(blob);
|
|
1737
|
+
const anchor = document.createElement("a");
|
|
1738
|
+
anchor.href = objectUrl;
|
|
1739
|
+
anchor.download = filename;
|
|
1740
|
+
anchor.style.display = "none";
|
|
1741
|
+
document.body.appendChild(anchor);
|
|
1742
|
+
anchor.click();
|
|
1743
|
+
anchor.remove();
|
|
1744
|
+
URL.revokeObjectURL(objectUrl);
|
|
1745
|
+
return;
|
|
1746
|
+
} catch (err) {
|
|
1747
|
+
lastError = err?.message || lastError;
|
|
1748
|
+
}
|
|
1736
1749
|
}
|
|
1750
|
+
|
|
1751
|
+
openDownloadFailedModal(lastError);
|
|
1737
1752
|
}
|
|
1738
1753
|
|
|
1739
1754
|
function startDevicePolling() {
|
|
@@ -430,8 +430,10 @@ button.danger {
|
|
|
430
430
|
}
|
|
431
431
|
|
|
432
432
|
.playlist-assets-hint {
|
|
433
|
-
margin: 0
|
|
433
|
+
margin: 0;
|
|
434
|
+
padding: 0.65rem 1rem 0.75rem;
|
|
434
435
|
font-size: 0.78rem;
|
|
436
|
+
line-height: 1.45;
|
|
435
437
|
}
|
|
436
438
|
|
|
437
439
|
.playlist-item {
|
|
@@ -441,6 +443,8 @@ button.danger {
|
|
|
441
443
|
margin-bottom: 0.5rem;
|
|
442
444
|
background: #fafaf9;
|
|
443
445
|
position: relative;
|
|
446
|
+
min-width: 0;
|
|
447
|
+
overflow: hidden;
|
|
444
448
|
}
|
|
445
449
|
|
|
446
450
|
.playlist-item--dragging {
|
|
@@ -501,19 +505,34 @@ button.danger {
|
|
|
501
505
|
}
|
|
502
506
|
|
|
503
507
|
.playlist-item-actions {
|
|
504
|
-
display:
|
|
508
|
+
display: grid;
|
|
509
|
+
grid-template-columns: minmax(0, 4.25rem) minmax(0, 1fr) minmax(0, 1fr);
|
|
505
510
|
gap: 0.35rem;
|
|
506
|
-
align-items:
|
|
511
|
+
align-items: stretch;
|
|
512
|
+
width: 100%;
|
|
513
|
+
min-width: 0;
|
|
507
514
|
}
|
|
508
515
|
|
|
509
516
|
.playlist-item-actions input[type="number"] {
|
|
510
|
-
width:
|
|
517
|
+
width: 100%;
|
|
518
|
+
min-width: 0;
|
|
511
519
|
font: inherit;
|
|
512
|
-
padding: 0.
|
|
520
|
+
padding: 0.28rem 0.35rem;
|
|
513
521
|
border: 1px solid #d6d2cb;
|
|
514
522
|
border-radius: 4px;
|
|
515
523
|
}
|
|
516
524
|
|
|
525
|
+
.playlist-item-actions button {
|
|
526
|
+
min-width: 0;
|
|
527
|
+
padding: 0.28rem 0.35rem;
|
|
528
|
+
font-size: 0.72rem;
|
|
529
|
+
line-height: 1.2;
|
|
530
|
+
border-radius: 4px;
|
|
531
|
+
white-space: nowrap;
|
|
532
|
+
overflow: hidden;
|
|
533
|
+
text-overflow: ellipsis;
|
|
534
|
+
}
|
|
535
|
+
|
|
517
536
|
.publish-bar {
|
|
518
537
|
padding: 1rem 0 0;
|
|
519
538
|
}
|