@tomorrowos/sdk 0.9.50 → 0.9.52
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/LOVABLE_SETUP.md +1 -1
- package/VERCEL_QUESTIONS.md +1 -1
- package/VERCEL_SETUP.md +1 -1
- package/dist/tomorrowos.d.ts +6 -0
- package/dist/tomorrowos.d.ts.map +1 -1
- package/dist/tomorrowos.js +51 -3
- package/package.json +1 -1
- package/templates/cms-starter/package.json +2 -2
- package/templates/cms-starter-v0/package.json +2 -2
package/LOVABLE_SETUP.md
CHANGED
package/VERCEL_QUESTIONS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Vercel / v0 閳?Verbatim question bank
|
|
2
2
|
|
|
3
|
-
> **Protocol:** `vercel-questions/1.0` (pairs with `VERCEL_SETUP.md` 1.9+ / `@tomorrowos/sdk` 0.9.
|
|
3
|
+
> **Protocol:** `vercel-questions/1.0` (pairs with `VERCEL_SETUP.md` 1.9+ / `@tomorrowos/sdk` 0.9.52+)
|
|
4
4
|
> **For Agents:** When asking the user a setup question, **copy-paste the block below for that step EXACTLY**.
|
|
5
5
|
> Do **not** paraphrase, reorder, rename options, or invent alternatives (no S3, no Supabase Storage, no 閳ユ窂lob recommended閳? no 閳ユ竸isable media閳?.
|
|
6
6
|
> After each answer, configure per `VERCEL_SETUP.md`, then paste the **next** block.
|
package/VERCEL_SETUP.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
>
|
|
6
6
|
> **On Vercel, this file is the setup questionnaire** (not `REPLIT_SETUP.md`, not `LLM_PROMPT.md`).
|
|
7
7
|
>
|
|
8
|
-
> Protocol id: `vercel-setup/1.9` — pairs with `@tomorrowos/sdk` **0.9.
|
|
8
|
+
> Protocol id: `vercel-setup/1.9` — pairs with `@tomorrowos/sdk` **0.9.52+** (`templates/cms-starter-v0`, Fluid Functions WebSockets).
|
|
9
9
|
>
|
|
10
10
|
> **Questions source of truth:** `VERCEL_QUESTIONS.md` ? Agents must **open that file and paste each Q block verbatim**. Do not paraphrase.
|
|
11
11
|
> **Copy questions verbatim from `VERCEL_QUESTIONS.md`.** Do not invent alternate Q2 options (no ?Supabase Storage?? no S3, no ?disable media?? no making Blob the recommended option).
|
package/dist/tomorrowos.d.ts
CHANGED
|
@@ -104,6 +104,9 @@ export declare class TomorrowOS extends EventEmitter {
|
|
|
104
104
|
private readonly devices;
|
|
105
105
|
private readonly pendingDeviceMeta;
|
|
106
106
|
private readonly deviceLogs;
|
|
107
|
+
/** Last device.ping (or bind) time — used to drop half-open sockets after power loss. */
|
|
108
|
+
private readonly deviceLastHeartbeatMs;
|
|
109
|
+
private heartbeatSweepTimer;
|
|
107
110
|
private httpServer;
|
|
108
111
|
private wss;
|
|
109
112
|
private staticRoot;
|
|
@@ -175,6 +178,9 @@ export declare class TomorrowOS extends EventEmitter {
|
|
|
175
178
|
* hello overwriting a healthy reconnect with a dead peer).
|
|
176
179
|
*/
|
|
177
180
|
private bindDeviceSocket;
|
|
181
|
+
private touchDeviceHeartbeat;
|
|
182
|
+
private startDeviceHeartbeatSweep;
|
|
183
|
+
private sweepStaleDeviceHeartbeats;
|
|
178
184
|
/** Wait briefly for the device WebSocket to appear (first-pair hello races). */
|
|
179
185
|
private waitForOpenDeviceSocket;
|
|
180
186
|
private sendPairingVerified;
|
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,EACV,gBAAgB,EAKhB,eAAe,EAEhB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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"}
|
package/dist/tomorrowos.js
CHANGED
|
@@ -13,6 +13,9 @@ import { probeVideoDurationMs } from "./media-probe.js";
|
|
|
13
13
|
import { contentHashHex, storeUploadIfNeeded } from "./upload-storage.js";
|
|
14
14
|
import { detectPrimaryLanIpv4 } from "./lan-address.js";
|
|
15
15
|
import { buildServerStatus } from "./server-status.js";
|
|
16
|
+
/** Mark offline if no device.ping within this window (power-loss / half-open TCP). */
|
|
17
|
+
const DEVICE_HEARTBEAT_TIMEOUT_MS = 30_000;
|
|
18
|
+
const DEVICE_HEARTBEAT_SWEEP_MS = 10_000;
|
|
16
19
|
function normalizeDevicePlatform(platform, system) {
|
|
17
20
|
const explicit = typeof platform === "string" ? platform.trim().toLowerCase() : "";
|
|
18
21
|
if (explicit)
|
|
@@ -165,9 +168,12 @@ function isAllowedWebSocketPath(pathname, allowed) {
|
|
|
165
168
|
const trimmed = p.replace(/\/+$/, "") || "/";
|
|
166
169
|
return allowed.has(trimmed) || allowed.has(`${trimmed}/`);
|
|
167
170
|
}
|
|
168
|
-
|
|
171
|
+
/** JSON API bodies stay capped; media uploads have no SDK size cap. */
|
|
172
|
+
const MAX_JSON_BODY_BYTES = 2 * 1024 * 1024;
|
|
173
|
+
/** `null` = no limit (host/Cloudinary may still enforce their own caps). */
|
|
174
|
+
const MAX_MEDIA_UPLOAD_BYTES = null;
|
|
169
175
|
async function readJsonBody(req) {
|
|
170
|
-
const buf = await readRawBody(req,
|
|
176
|
+
const buf = await readRawBody(req, MAX_JSON_BODY_BYTES);
|
|
171
177
|
const raw = buf.toString("utf8");
|
|
172
178
|
if (!raw.trim())
|
|
173
179
|
return {};
|
|
@@ -184,7 +190,7 @@ async function readRawBody(req, maxBytes) {
|
|
|
184
190
|
for await (const chunk of req) {
|
|
185
191
|
const buf = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
186
192
|
total += buf.length;
|
|
187
|
-
if (total > maxBytes) {
|
|
193
|
+
if (maxBytes != null && maxBytes > 0 && total > maxBytes) {
|
|
188
194
|
throw new Error(`Body too large (max ${maxBytes} bytes)`);
|
|
189
195
|
}
|
|
190
196
|
chunks.push(buf);
|
|
@@ -232,6 +238,9 @@ export class TomorrowOS extends EventEmitter {
|
|
|
232
238
|
devices = new Map();
|
|
233
239
|
pendingDeviceMeta = new Map();
|
|
234
240
|
deviceLogs = new Map();
|
|
241
|
+
/** Last device.ping (or bind) time — used to drop half-open sockets after power loss. */
|
|
242
|
+
deviceLastHeartbeatMs = new Map();
|
|
243
|
+
heartbeatSweepTimer = null;
|
|
235
244
|
httpServer = null;
|
|
236
245
|
wss = null;
|
|
237
246
|
staticRoot = null;
|
|
@@ -585,8 +594,43 @@ export class TomorrowOS extends EventEmitter {
|
|
|
585
594
|
return false;
|
|
586
595
|
ws.deviceId = deviceId;
|
|
587
596
|
this.devices.set(deviceId, ws);
|
|
597
|
+
this.touchDeviceHeartbeat(deviceId);
|
|
588
598
|
return true;
|
|
589
599
|
}
|
|
600
|
+
touchDeviceHeartbeat(deviceId) {
|
|
601
|
+
const id = String(deviceId || "").trim();
|
|
602
|
+
if (!id)
|
|
603
|
+
return;
|
|
604
|
+
this.deviceLastHeartbeatMs.set(id, Date.now());
|
|
605
|
+
}
|
|
606
|
+
startDeviceHeartbeatSweep() {
|
|
607
|
+
if (this.heartbeatSweepTimer)
|
|
608
|
+
return;
|
|
609
|
+
this.heartbeatSweepTimer = setInterval(() => {
|
|
610
|
+
this.sweepStaleDeviceHeartbeats();
|
|
611
|
+
}, DEVICE_HEARTBEAT_SWEEP_MS);
|
|
612
|
+
// Unref so the timer does not keep serverless/local processes alive alone.
|
|
613
|
+
const timer = this.heartbeatSweepTimer;
|
|
614
|
+
if (typeof timer.unref === "function")
|
|
615
|
+
timer.unref();
|
|
616
|
+
}
|
|
617
|
+
sweepStaleDeviceHeartbeats() {
|
|
618
|
+
const now = Date.now();
|
|
619
|
+
for (const [deviceId, ws] of this.devices) {
|
|
620
|
+
if (ws.readyState !== WebSocket.OPEN)
|
|
621
|
+
continue;
|
|
622
|
+
const last = this.deviceLastHeartbeatMs.get(deviceId);
|
|
623
|
+
// Not yet touched (should be rare) — give a full timeout window from now.
|
|
624
|
+
if (last == null) {
|
|
625
|
+
this.touchDeviceHeartbeat(deviceId);
|
|
626
|
+
continue;
|
|
627
|
+
}
|
|
628
|
+
if (now - last < DEVICE_HEARTBEAT_TIMEOUT_MS)
|
|
629
|
+
continue;
|
|
630
|
+
console.warn(`[TomorrowOS] device heartbeat timeout (${DEVICE_HEARTBEAT_TIMEOUT_MS}ms): ${deviceId}`);
|
|
631
|
+
this.forceDeviceOffline(deviceId);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
590
634
|
/** Wait briefly for the device WebSocket to appear (first-pair hello races). */
|
|
591
635
|
async waitForOpenDeviceSocket(deviceId, timeoutMs = 5000) {
|
|
592
636
|
const deadline = Date.now() + timeoutMs;
|
|
@@ -719,6 +763,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
719
763
|
this.devices.delete(deviceId);
|
|
720
764
|
}
|
|
721
765
|
}
|
|
766
|
+
this.deviceLastHeartbeatMs.delete(deviceId);
|
|
722
767
|
void this.touchPairedOffline(deviceId);
|
|
723
768
|
this.emit("device.offline", {
|
|
724
769
|
deviceId,
|
|
@@ -871,6 +916,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
871
916
|
this.handleConnection(ws);
|
|
872
917
|
});
|
|
873
918
|
this.serverStartedAt = new Date().toISOString();
|
|
919
|
+
this.startDeviceHeartbeatSweep();
|
|
874
920
|
const onVercel = Boolean(process.env.VERCEL);
|
|
875
921
|
const shouldListen = options.autoListen ?? !onVercel;
|
|
876
922
|
if (shouldListen) {
|
|
@@ -1728,6 +1774,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
1728
1774
|
}));
|
|
1729
1775
|
const deviceId = ws.deviceId;
|
|
1730
1776
|
if (deviceId) {
|
|
1777
|
+
this.touchDeviceHeartbeat(deviceId);
|
|
1731
1778
|
const timestamp = typeof msg.timestamp === "string" && msg.timestamp.trim()
|
|
1732
1779
|
? msg.timestamp
|
|
1733
1780
|
: new Date().toISOString();
|
|
@@ -1763,6 +1810,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
1763
1810
|
if (this.devices.get(id) !== ws)
|
|
1764
1811
|
return;
|
|
1765
1812
|
this.devices.delete(id);
|
|
1813
|
+
this.deviceLastHeartbeatMs.delete(id);
|
|
1766
1814
|
void this.touchPairedOffline(id);
|
|
1767
1815
|
this.emit("device.offline", {
|
|
1768
1816
|
deviceId: id,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomorrowos/sdk",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.52",
|
|
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.9.
|
|
3
|
+
"version": "0.9.52",
|
|
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.9.
|
|
16
|
+
"@tomorrowos/sdk": "^0.9.52",
|
|
17
17
|
"dotenv": "^17.2.3",
|
|
18
18
|
"tsx": "^4.19.0"
|
|
19
19
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "my-cms",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.52",
|
|
4
4
|
"description": "TomorrowOS CMS for Vercel / v0 Publish (Fluid Function + WebSockets + optional Next Preview).",
|
|
5
5
|
"private": true,
|
|
6
6
|
"type": "module",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"build-player": "tomorrowos build --platform tizen"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@tomorrowos/sdk": "^0.9.
|
|
20
|
+
"@tomorrowos/sdk": "^0.9.52",
|
|
21
21
|
"dotenv": "^17.2.3",
|
|
22
22
|
"tsx": "^4.19.0"
|
|
23
23
|
},
|