@tomorrowos/sdk 0.8.7 → 0.8.9
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 +1 -1
- package/dist/store/postgres-store.d.ts.map +1 -1
- package/dist/store/postgres-store.js +12 -5
- package/dist/store/sqlite-store.d.ts.map +1 -1
- package/dist/store/sqlite-store.js +9 -5
- package/dist/store/types.d.ts +2 -0
- package/dist/store/types.d.ts.map +1 -1
- package/dist/tomorrowos.d.ts +5 -0
- package/dist/tomorrowos.d.ts.map +1 -1
- package/dist/tomorrowos.js +32 -6
- package/package.json +1 -1
- package/templates/cms-starter/package.json +2 -2
- package/templates/cms-starter/public/methods.js +68 -4
- package/templates/cms-starter/public/panel.css +14 -0
package/REPLIT_SETUP.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../src/store/postgres-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AAE3C,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAGjB,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"postgres-store.d.ts","sourceRoot":"","sources":["../../src/store/postgres-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -124,6 +124,9 @@ export class PostgresStore {
|
|
|
124
124
|
|
|
125
125
|
ALTER TABLE paired_devices
|
|
126
126
|
ADD COLUMN IF NOT EXISTS last_screenshot_captured_at TEXT;
|
|
127
|
+
|
|
128
|
+
ALTER TABLE device_registry
|
|
129
|
+
ADD COLUMN IF NOT EXISTS display_name TEXT;
|
|
127
130
|
`);
|
|
128
131
|
await this.migrateDropPlaylistVersionColumns();
|
|
129
132
|
await this.migrateDropUploadedAssetStorageProvider();
|
|
@@ -295,22 +298,25 @@ export class PostgresStore {
|
|
|
295
298
|
code_created_at,
|
|
296
299
|
serial_number,
|
|
297
300
|
first_seen_at,
|
|
298
|
-
last_hello_at
|
|
301
|
+
last_hello_at,
|
|
302
|
+
display_name
|
|
299
303
|
)
|
|
300
|
-
VALUES ($1, $2, $3, $4, $5, $6)
|
|
304
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
301
305
|
ON CONFLICT (device_id) DO UPDATE SET
|
|
302
306
|
permanent_pairing_code = EXCLUDED.permanent_pairing_code,
|
|
303
307
|
code_created_at = EXCLUDED.code_created_at,
|
|
304
308
|
serial_number = EXCLUDED.serial_number,
|
|
305
309
|
first_seen_at = EXCLUDED.first_seen_at,
|
|
306
|
-
last_hello_at = EXCLUDED.last_hello_at
|
|
310
|
+
last_hello_at = EXCLUDED.last_hello_at,
|
|
311
|
+
display_name = EXCLUDED.display_name
|
|
307
312
|
`, [
|
|
308
313
|
deviceId,
|
|
309
314
|
record.permanentPairingCode,
|
|
310
315
|
record.codeCreatedAt,
|
|
311
316
|
record.serialNumber ?? null,
|
|
312
317
|
record.firstSeenAt ?? null,
|
|
313
|
-
record.lastHelloAt ?? null
|
|
318
|
+
record.lastHelloAt ?? null,
|
|
319
|
+
record.displayName ?? null
|
|
314
320
|
]);
|
|
315
321
|
}
|
|
316
322
|
async getDeviceRegistryByCode(code) {
|
|
@@ -615,7 +621,8 @@ export class PostgresStore {
|
|
|
615
621
|
codeCreatedAt: Number(row.code_created_at),
|
|
616
622
|
serialNumber: optionalString(row.serial_number),
|
|
617
623
|
firstSeenAt: optionalNumber(row.first_seen_at),
|
|
618
|
-
lastHelloAt: optionalNumber(row.last_hello_at)
|
|
624
|
+
lastHelloAt: optionalNumber(row.last_hello_at),
|
|
625
|
+
displayName: optionalString(row.display_name)
|
|
619
626
|
};
|
|
620
627
|
}
|
|
621
628
|
mapPairedDeviceRow(row) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/store/sqlite-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAGjB,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAGpB,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../../src/store/sqlite-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAGjB,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAGpB,UAAU,kBAAkB;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA+ED;;;GAGG;AACH,qBAAa,WAAY,YAAW,yBAAyB;IAC3D,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;gBAE3B,OAAO,GAAE,kBAAkB,GAAG,MAAW;IAerD,IAAI,IAAI,IAAI;IA+FZ,OAAO,CAAC,uCAAuC;IAuF/C,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iCAAiC;IA4GzC,OAAO,CAAC,kBAAkB;IAS1B,KAAK,IAAI,IAAI;IAIP,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAUpE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAY/C,iBAAiB,CACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAStC,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC;IA8BV,uBAAuB,CAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,GAAG,SAAS,CAAC;IAapE,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAYpD,eAAe,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC;IAmDV,eAAe,CACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IASpC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAYjD,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAS1C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAS5D,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BlD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAcvE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAStE,wBAAwB,CAC5B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAUrC,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC5D,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASpD,oBAAoB,CACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAuBhC,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,wBAAwB,EAAE,GACtC,OAAO,CAAC,IAAI,CAAC;IA4BhB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,mBAAmB;CAc5B"}
|
|
@@ -122,6 +122,7 @@ export class SQLiteStore {
|
|
|
122
122
|
this.addColumnIfMissing("paired_devices", "system_version TEXT");
|
|
123
123
|
this.addColumnIfMissing("paired_devices", "last_screenshot_asset_id TEXT");
|
|
124
124
|
this.addColumnIfMissing("paired_devices", "last_screenshot_captured_at TEXT");
|
|
125
|
+
this.addColumnIfMissing("device_registry", "display_name TEXT");
|
|
125
126
|
this.migrateDropPlaylistVersionColumns();
|
|
126
127
|
this.migrateDropUploadedAssetStorageProvider();
|
|
127
128
|
}
|
|
@@ -359,16 +360,18 @@ export class SQLiteStore {
|
|
|
359
360
|
code_created_at,
|
|
360
361
|
serial_number,
|
|
361
362
|
first_seen_at,
|
|
362
|
-
last_hello_at
|
|
363
|
+
last_hello_at,
|
|
364
|
+
display_name
|
|
363
365
|
)
|
|
364
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
366
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
365
367
|
ON CONFLICT(device_id) DO UPDATE SET
|
|
366
368
|
permanent_pairing_code = excluded.permanent_pairing_code,
|
|
367
369
|
code_created_at = excluded.code_created_at,
|
|
368
370
|
serial_number = excluded.serial_number,
|
|
369
371
|
first_seen_at = excluded.first_seen_at,
|
|
370
|
-
last_hello_at = excluded.last_hello_at
|
|
371
|
-
|
|
372
|
+
last_hello_at = excluded.last_hello_at,
|
|
373
|
+
display_name = excluded.display_name
|
|
374
|
+
`).run(deviceId, record.permanentPairingCode, record.codeCreatedAt, record.serialNumber ?? null, record.firstSeenAt ?? null, record.lastHelloAt ?? null, record.displayName ?? null);
|
|
372
375
|
}
|
|
373
376
|
async getDeviceRegistryByCode(code) {
|
|
374
377
|
const row = this.db.prepare(`
|
|
@@ -598,7 +601,8 @@ export class SQLiteStore {
|
|
|
598
601
|
codeCreatedAt: row.code_created_at,
|
|
599
602
|
serialNumber: optionalString(row.serial_number),
|
|
600
603
|
firstSeenAt: optionalNumber(row.first_seen_at),
|
|
601
|
-
lastHelloAt: optionalNumber(row.last_hello_at)
|
|
604
|
+
lastHelloAt: optionalNumber(row.last_hello_at),
|
|
605
|
+
displayName: optionalString(row.display_name)
|
|
602
606
|
};
|
|
603
607
|
}
|
|
604
608
|
mapPairedDeviceRow(row) {
|
package/dist/store/types.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface DeviceRegistryRecord {
|
|
|
13
13
|
serialNumber?: string;
|
|
14
14
|
firstSeenAt?: number;
|
|
15
15
|
lastHelloAt?: number;
|
|
16
|
+
/** CMS operator display name — survives unpair / re-pair. */
|
|
17
|
+
displayName?: string;
|
|
16
18
|
}
|
|
17
19
|
export interface PairedDeviceRecord {
|
|
18
20
|
pairingToken: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wFAAwF;AACxF,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wGAAwG;AACxG,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,yBAAyB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IACrE,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAC/E,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,uBAAuB,CACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC3E,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC3E,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAClD,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAC7D,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IACvE,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IACnF,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAC5E,oBAAoB,CAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,wBAAwB,EAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,iBAAiB,EAAE,KAAK,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,wBAAwB,EAAE,CAAC;KACzC,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAChD,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACrD,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CACtD"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"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"}
|
package/dist/tomorrowos.d.ts
CHANGED
|
@@ -93,6 +93,8 @@ export declare class TomorrowOS extends EventEmitter {
|
|
|
93
93
|
private wss;
|
|
94
94
|
private staticRoot;
|
|
95
95
|
private staticIndexFile;
|
|
96
|
+
/** Set when listen() starts — exposed to CMS panel for post-restart reconnect grace. */
|
|
97
|
+
private serverStartedAt;
|
|
96
98
|
constructor(options: TomorrowOSOptions);
|
|
97
99
|
/** Push all device assignments using latest playlist definitions (e.g. after reboot). */
|
|
98
100
|
pushLatestPolicyToDevice(deviceId: string): Promise<{
|
|
@@ -124,6 +126,9 @@ export declare class TomorrowOS extends EventEmitter {
|
|
|
124
126
|
deviceId: string;
|
|
125
127
|
deviceName: string;
|
|
126
128
|
}>;
|
|
129
|
+
/** Prefer CMS-saved display name; fall back to handshake hardware model on first pair. */
|
|
130
|
+
private resolveDeviceNameForPairing;
|
|
131
|
+
private persistRegistryDisplayName;
|
|
127
132
|
private pushDeviceLog;
|
|
128
133
|
private getDeviceLogs;
|
|
129
134
|
private isDeviceConnected;
|
package/dist/tomorrowos.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tomorrowos.d.ts","sourceRoot":"","sources":["../src/tomorrowos.ts"],"names":[],"mappings":"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"}
|
package/dist/tomorrowos.js
CHANGED
|
@@ -193,6 +193,8 @@ export class TomorrowOS extends EventEmitter {
|
|
|
193
193
|
wss = null;
|
|
194
194
|
staticRoot = null;
|
|
195
195
|
staticIndexFile = "index.html";
|
|
196
|
+
/** Set when listen() starts — exposed to CMS panel for post-restart reconnect grace. */
|
|
197
|
+
serverStartedAt = null;
|
|
196
198
|
constructor(options) {
|
|
197
199
|
super();
|
|
198
200
|
this.brand = options.brand;
|
|
@@ -252,10 +254,11 @@ export class TomorrowOS extends EventEmitter {
|
|
|
252
254
|
const lastBootAt = meta?.bootUptimeSec != null
|
|
253
255
|
? resolveLastBootAt(bootAtFromUptimeSec(meta.bootUptimeSec), undefined)
|
|
254
256
|
: resolveLastBootAt(meta?.bootedAt, undefined);
|
|
257
|
+
const deviceName = await this.resolveDeviceNameForPairing(deviceId, meta?.deviceName);
|
|
255
258
|
await this.store.setPairedDevice(deviceId, {
|
|
256
259
|
pairingToken,
|
|
257
260
|
pairedAt,
|
|
258
|
-
deviceName
|
|
261
|
+
deviceName,
|
|
259
262
|
platform: meta?.platform,
|
|
260
263
|
system: meta?.system,
|
|
261
264
|
playerVersion: meta?.playerVersion,
|
|
@@ -291,6 +294,9 @@ export class TomorrowOS extends EventEmitter {
|
|
|
291
294
|
}
|
|
292
295
|
const paired = await this.store.getPairedDevice(id);
|
|
293
296
|
const screenshotAssetId = paired?.lastScreenshotAssetId;
|
|
297
|
+
if (paired?.deviceName?.trim()) {
|
|
298
|
+
await this.persistRegistryDisplayName(id, paired.deviceName);
|
|
299
|
+
}
|
|
294
300
|
await this.store.deletePairedDevice(id);
|
|
295
301
|
this.pendingDeviceMeta.delete(id);
|
|
296
302
|
if (screenshotAssetId) {
|
|
@@ -395,8 +401,27 @@ export class TomorrowOS extends EventEmitter {
|
|
|
395
401
|
...existing,
|
|
396
402
|
deviceName: normalized
|
|
397
403
|
});
|
|
404
|
+
await this.persistRegistryDisplayName(id, normalized);
|
|
398
405
|
return { deviceId: id, deviceName: normalized };
|
|
399
406
|
}
|
|
407
|
+
/** Prefer CMS-saved display name; fall back to handshake hardware model on first pair. */
|
|
408
|
+
async resolveDeviceNameForPairing(deviceId, handshakeName) {
|
|
409
|
+
const reg = await this.store.getDeviceRegistry(deviceId);
|
|
410
|
+
const saved = reg?.displayName?.trim();
|
|
411
|
+
if (saved)
|
|
412
|
+
return saved;
|
|
413
|
+
const fromHandshake = handshakeName?.trim();
|
|
414
|
+
return fromHandshake || undefined;
|
|
415
|
+
}
|
|
416
|
+
async persistRegistryDisplayName(deviceId, displayName) {
|
|
417
|
+
const reg = await this.store.getDeviceRegistry(deviceId);
|
|
418
|
+
if (!reg)
|
|
419
|
+
return;
|
|
420
|
+
await this.store.setDeviceRegistry(deviceId, {
|
|
421
|
+
...reg,
|
|
422
|
+
displayName: displayName.trim()
|
|
423
|
+
});
|
|
424
|
+
}
|
|
400
425
|
pushDeviceLog(deviceId, entry) {
|
|
401
426
|
const key = String(deviceId || "").trim();
|
|
402
427
|
if (!key)
|
|
@@ -485,8 +510,6 @@ export class TomorrowOS extends EventEmitter {
|
|
|
485
510
|
existing.systemVersion;
|
|
486
511
|
await this.store.setPairedDevice(deviceId, {
|
|
487
512
|
...existing,
|
|
488
|
-
deviceName: (typeof msg.deviceName === "string" ? msg.deviceName : undefined) ??
|
|
489
|
-
existing.deviceName,
|
|
490
513
|
platform,
|
|
491
514
|
system,
|
|
492
515
|
playerVersion,
|
|
@@ -542,7 +565,6 @@ export class TomorrowOS extends EventEmitter {
|
|
|
542
565
|
const result = await this.sendCommandToSocket(ws, deviceId, "device.info.get", {}, 15_000);
|
|
543
566
|
if (result.status !== "success" || !result.data)
|
|
544
567
|
return;
|
|
545
|
-
const model = typeof result.data.model === "string" ? result.data.model : undefined;
|
|
546
568
|
const firmware = typeof result.data.firmware === "string"
|
|
547
569
|
? result.data.firmware
|
|
548
570
|
: undefined;
|
|
@@ -552,7 +574,6 @@ export class TomorrowOS extends EventEmitter {
|
|
|
552
574
|
const platform = normalizeDevicePlatform(existing.platform, existing.system);
|
|
553
575
|
await this.store.setPairedDevice(deviceId, {
|
|
554
576
|
...existing,
|
|
555
|
-
deviceName: model ?? existing.deviceName,
|
|
556
577
|
system: formatDeviceSystemForFirmware(platform, firmware, existing.system),
|
|
557
578
|
platform: platform ?? existing.platform,
|
|
558
579
|
systemVersion: systemVersion ?? existing.systemVersion
|
|
@@ -661,6 +682,7 @@ export class TomorrowOS extends EventEmitter {
|
|
|
661
682
|
wss.on("connection", (ws) => {
|
|
662
683
|
this.handleConnection(ws);
|
|
663
684
|
});
|
|
685
|
+
this.serverStartedAt = new Date().toISOString();
|
|
664
686
|
server.listen(port, host, () => {
|
|
665
687
|
// eslint-disable-next-line no-console
|
|
666
688
|
console.log(`[TomorrowOS] listening on http://${host}:${port}`);
|
|
@@ -1026,7 +1048,11 @@ export class TomorrowOS extends EventEmitter {
|
|
|
1026
1048
|
}
|
|
1027
1049
|
if (req.method === "GET" && pathname === "/devices") {
|
|
1028
1050
|
const devices = await this.listDevices();
|
|
1029
|
-
sendJson(res, 200, {
|
|
1051
|
+
sendJson(res, 200, {
|
|
1052
|
+
status: "success",
|
|
1053
|
+
devices,
|
|
1054
|
+
serverStartedAt: this.serverStartedAt
|
|
1055
|
+
});
|
|
1030
1056
|
return;
|
|
1031
1057
|
}
|
|
1032
1058
|
const deviceNamePatch = /^\/device\/([^/]+)\/name$/.exec(pathname);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tomorrowos/sdk",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.9",
|
|
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.9",
|
|
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.9",
|
|
17
17
|
"dotenv": "^17.2.3",
|
|
18
18
|
"tsx": "^4.19.0"
|
|
19
19
|
},
|
|
@@ -27,10 +27,15 @@ let editingDeviceNameId = null;
|
|
|
27
27
|
let editingDeviceNameValue = "";
|
|
28
28
|
|
|
29
29
|
let devicePollTimer = null;
|
|
30
|
+
/** @type {number|null} CMS server boot time (ms) from GET /devices. */
|
|
31
|
+
let serverStartedAtMs = null;
|
|
32
|
+
/** @type {ReturnType<typeof setTimeout>|null} */
|
|
33
|
+
let reconnectGraceTimer = null;
|
|
30
34
|
let uploadQueue = [];
|
|
31
35
|
let uploadInProgress = false;
|
|
32
36
|
|
|
33
37
|
const UPLOAD_MAX_RETRIES = 3;
|
|
38
|
+
const DEVICE_RECONNECT_GRACE_MS = 60000;
|
|
34
39
|
const UPLOAD_TIMEOUT_MS = 120000;
|
|
35
40
|
|
|
36
41
|
function escapeHtml(value) {
|
|
@@ -71,8 +76,30 @@ function formatDateTimeSeconds(iso) {
|
|
|
71
76
|
});
|
|
72
77
|
}
|
|
73
78
|
|
|
74
|
-
function
|
|
75
|
-
if (
|
|
79
|
+
function resolveDeviceConnectionState(device) {
|
|
80
|
+
if (device.connected) return "online";
|
|
81
|
+
if (serverStartedAtMs != null) {
|
|
82
|
+
const elapsed = Date.now() - serverStartedAtMs;
|
|
83
|
+
if (elapsed >= 0 && elapsed < DEVICE_RECONNECT_GRACE_MS) return "loading";
|
|
84
|
+
}
|
|
85
|
+
return "offline";
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function statusLedClass(connectionState) {
|
|
89
|
+
if (connectionState === "online") return "status-led status-led--online";
|
|
90
|
+
if (connectionState === "loading") return "status-led status-led--loading";
|
|
91
|
+
return "status-led status-led--offline";
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function statusLedTitle(connectionState) {
|
|
95
|
+
if (connectionState === "online") return "Device connected";
|
|
96
|
+
if (connectionState === "loading") return "Waiting for device to reconnect";
|
|
97
|
+
return "Device not connected";
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function formatDeviceOnlineLabel(device, connectionState) {
|
|
101
|
+
if (connectionState === "loading") return "Reconnecting…";
|
|
102
|
+
if (connectionState !== "online") return "Not active";
|
|
76
103
|
const bootIso = device.lastBootAt;
|
|
77
104
|
if (!bootIso) return "Not active";
|
|
78
105
|
const bootMs = new Date(bootIso).getTime();
|
|
@@ -80,6 +107,30 @@ function formatDeviceOnlineLabel(device) {
|
|
|
80
107
|
return formatDurationMs(Date.now() - bootMs);
|
|
81
108
|
}
|
|
82
109
|
|
|
110
|
+
function scheduleReconnectGraceRerender() {
|
|
111
|
+
if (reconnectGraceTimer) {
|
|
112
|
+
clearTimeout(reconnectGraceTimer);
|
|
113
|
+
reconnectGraceTimer = null;
|
|
114
|
+
}
|
|
115
|
+
if (serverStartedAtMs == null) return;
|
|
116
|
+
|
|
117
|
+
const hasLoadingDevice = devicesCache.some(
|
|
118
|
+
(device) => resolveDeviceConnectionState(device) === "loading"
|
|
119
|
+
);
|
|
120
|
+
if (!hasLoadingDevice) return;
|
|
121
|
+
|
|
122
|
+
const remaining = DEVICE_RECONNECT_GRACE_MS - (Date.now() - serverStartedAtMs);
|
|
123
|
+
if (remaining <= 0) {
|
|
124
|
+
renderDeviceCards();
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
reconnectGraceTimer = setTimeout(() => {
|
|
129
|
+
reconnectGraceTimer = null;
|
|
130
|
+
renderDeviceCards();
|
|
131
|
+
}, remaining + 50);
|
|
132
|
+
}
|
|
133
|
+
|
|
83
134
|
function showResult(data) {
|
|
84
135
|
document.getElementById("result").textContent = JSON.stringify(data, null, 2);
|
|
85
136
|
}
|
|
@@ -942,9 +993,18 @@ async function fetchDevices() {
|
|
|
942
993
|
try {
|
|
943
994
|
const res = await fetch("/devices");
|
|
944
995
|
const data = await res.json();
|
|
996
|
+
if (typeof data.serverStartedAt === "string") {
|
|
997
|
+
const parsed = new Date(data.serverStartedAt).getTime();
|
|
998
|
+
if (!Number.isNaN(parsed)) {
|
|
999
|
+
const prev = serverStartedAtMs;
|
|
1000
|
+
serverStartedAtMs = parsed;
|
|
1001
|
+
if (prev !== parsed) scheduleReconnectGraceRerender();
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
945
1004
|
if (Array.isArray(data.devices)) {
|
|
946
1005
|
devicesCache = data.devices;
|
|
947
1006
|
renderDeviceCards();
|
|
1007
|
+
scheduleReconnectGraceRerender();
|
|
948
1008
|
}
|
|
949
1009
|
} catch (err) {
|
|
950
1010
|
showResult({ status: "failed", error: err.message });
|
|
@@ -1010,8 +1070,12 @@ function renderDeviceCards() {
|
|
|
1010
1070
|
header.className = "device-card-header";
|
|
1011
1071
|
const headerMain = document.createElement("div");
|
|
1012
1072
|
headerMain.className = "device-card-header-main";
|
|
1073
|
+
const connectionState = resolveDeviceConnectionState(device);
|
|
1013
1074
|
const led = document.createElement("span");
|
|
1014
|
-
led.className =
|
|
1075
|
+
led.className = statusLedClass(connectionState);
|
|
1076
|
+
led.title = statusLedTitle(connectionState);
|
|
1077
|
+
led.setAttribute("role", "status");
|
|
1078
|
+
led.setAttribute("aria-label", statusLedTitle(connectionState));
|
|
1015
1079
|
const title = document.createElement("h3");
|
|
1016
1080
|
title.className = "device-card-title";
|
|
1017
1081
|
const isEditingName = editingDeviceNameId === device.deviceId;
|
|
@@ -1124,7 +1188,7 @@ function renderDeviceCards() {
|
|
|
1124
1188
|
const metaSecondary = document.createElement("dl");
|
|
1125
1189
|
metaSecondary.className = "device-meta device-meta--secondary";
|
|
1126
1190
|
const secondaryRows = [
|
|
1127
|
-
["Device online", formatDeviceOnlineLabel(device)],
|
|
1191
|
+
["Device online", formatDeviceOnlineLabel(device, connectionState)],
|
|
1128
1192
|
["Last boot", formatDateTimeSeconds(device.lastBootAt)],
|
|
1129
1193
|
["Latest push", formatDateTimeSeconds(device.lastPolicyPushAt)],
|
|
1130
1194
|
["Latest error", device.latestErrorMessage || "—"],
|
|
@@ -200,6 +200,20 @@ body {
|
|
|
200
200
|
box-shadow: 0 0 8px rgba(240, 68, 56, 0.45);
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
+
.status-led--loading {
|
|
204
|
+
background: transparent;
|
|
205
|
+
border: 2px solid #dcd9d4;
|
|
206
|
+
border-top-color: #6e6b67;
|
|
207
|
+
box-shadow: none;
|
|
208
|
+
animation: status-led-spin 0.75s linear infinite;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
@keyframes status-led-spin {
|
|
212
|
+
to {
|
|
213
|
+
transform: rotate(360deg);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
203
217
|
.device-meta {
|
|
204
218
|
display: grid;
|
|
205
219
|
gap: 0.35rem;
|