@mentra/engine 3.2.0-dev.137 → 3.2.0-dev.154
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/build/engine.d.ts.map +1 -1
- package/build/engine.js +15 -9
- package/build/engine.js.map +1 -1
- package/build/facades/ota.d.ts +1 -0
- package/build/facades/ota.d.ts.map +1 -1
- package/build/facades/ota.js +1 -0
- package/build/facades/ota.js.map +1 -1
- package/build/facades/reports.d.ts.map +1 -1
- package/build/facades/reports.js +3 -0
- package/build/facades/reports.js.map +1 -1
- package/build/generated/releaseMetadata.js +5 -5
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js.map +1 -1
- package/build/react/MentraLiveOtaFlow.d.ts.map +1 -1
- package/build/react/MentraLiveOtaFlow.js +12 -0
- package/build/react/MentraLiveOtaFlow.js.map +1 -1
- package/build/react/useMentraLiveOta.d.ts +3 -1
- package/build/react/useMentraLiveOta.d.ts.map +1 -1
- package/build/react/useMentraLiveOta.js +19 -1
- package/build/react/useMentraLiveOta.js.map +1 -1
- package/build/runtime/bootstrap.d.ts +46 -3
- package/build/runtime/bootstrap.d.ts.map +1 -1
- package/build/runtime/bootstrap.js +60 -1
- package/build/runtime/bootstrap.js.map +1 -1
- package/build/runtime/config.d.ts +4 -0
- package/build/runtime/config.d.ts.map +1 -1
- package/build/runtime/config.js.map +1 -1
- package/build/runtime/streamConfig.d.ts.map +1 -1
- package/build/runtime/streamConfig.js +6 -0
- package/build/runtime/streamConfig.js.map +1 -1
- package/build/services/AppRegistry.d.ts +15 -1
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js +48 -12
- package/build/services/AppRegistry.js.map +1 -1
- package/build/services/CloudClientService.d.ts +3 -1
- package/build/services/CloudClientService.d.ts.map +1 -1
- package/build/services/CloudClientService.js +75 -18
- package/build/services/CloudClientService.js.map +1 -1
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +54 -12
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/MiniappLauncher.d.ts.map +1 -1
- package/build/services/MiniappLauncher.js +9 -1
- package/build/services/MiniappLauncher.js.map +1 -1
- package/build/services/NavigationHandlers.d.ts.map +1 -1
- package/build/services/NavigationHandlers.js +8 -0
- package/build/services/NavigationHandlers.js.map +1 -1
- package/build/services/OtaUpdateCheckService.d.ts +10 -1
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -1
- package/build/services/OtaUpdateCheckService.js +24 -5
- package/build/services/OtaUpdateCheckService.js.map +1 -1
- package/build/services/miniappInstallIdentity.d.ts +10 -0
- package/build/services/miniappInstallIdentity.d.ts.map +1 -0
- package/build/services/miniappInstallIdentity.js +10 -0
- package/build/services/miniappInstallIdentity.js.map +1 -0
- package/build/services/otaManifestPolicy.d.ts +3 -0
- package/build/services/otaManifestPolicy.d.ts.map +1 -1
- package/build/services/otaManifestPolicy.js +8 -0
- package/build/services/otaManifestPolicy.js.map +1 -1
- package/build/services/otaManifestUrl.d.ts.map +1 -1
- package/build/services/otaManifestUrl.js +10 -2
- package/build/services/otaManifestUrl.js.map +1 -1
- package/build/stores/glasses.d.ts.map +1 -1
- package/build/stores/glasses.js +6 -0
- package/build/stores/glasses.js.map +1 -1
- package/build/stores/settings.d.ts.map +1 -1
- package/build/stores/settings.js +20 -3
- package/build/stores/settings.js.map +1 -1
- package/package.json +7 -7
- package/src/engine.ts +22 -12
- package/src/facades/ota.ts +1 -0
- package/src/facades/reports.ts +4 -6
- package/src/generated/releaseMetadata.ts +5 -5
- package/src/index.ts +2 -0
- package/src/react/MentraLiveOtaFlow.tsx +21 -0
- package/src/react/useMentraLiveOta.ts +23 -2
- package/src/runtime/bootstrap.ts +117 -4
- package/src/runtime/config.ts +4 -0
- package/src/runtime/streamConfig.ts +4 -0
- package/src/services/AppRegistry.ts +94 -25
- package/src/services/CloudClientService.ts +70 -24
- package/src/services/LocalMiniappRuntime.ts +85 -26
- package/src/services/MiniappLauncher.ts +15 -1
- package/src/services/NavigationHandlers.ts +8 -0
- package/src/services/OtaUpdateCheckService.ts +32 -6
- package/src/services/miniappInstallIdentity.ts +18 -0
- package/src/services/otaManifestPolicy.ts +11 -0
- package/src/services/otaManifestUrl.ts +10 -2
- package/src/stores/glasses.ts +6 -0
- package/src/stores/settings.ts +20 -3
|
@@ -54,10 +54,12 @@ interface InstalledLma {
|
|
|
54
54
|
versions: Record<string, InstalledInfo>;
|
|
55
55
|
}
|
|
56
56
|
export interface MiniappReleaseIdentity {
|
|
57
|
-
source: "direct_download" | "bundled_asset" | "preinstalled_registry" | "dev_snapshot";
|
|
57
|
+
source: "direct_download" | "bundled_asset" | "preinstalled_registry" | "deployment_manifest" | "dev_snapshot";
|
|
58
58
|
releaseId?: string;
|
|
59
59
|
bundleSha256?: string;
|
|
60
60
|
channel?: string;
|
|
61
|
+
deploymentId?: string;
|
|
62
|
+
deploymentOrigin?: string;
|
|
61
63
|
}
|
|
62
64
|
type Listener = () => void;
|
|
63
65
|
declare class AppRegistry {
|
|
@@ -127,6 +129,9 @@ declare class AppRegistry {
|
|
|
127
129
|
installFromUrl(url: string, opts?: {
|
|
128
130
|
versionOverride?: string;
|
|
129
131
|
releaseIdentity?: MiniappReleaseIdentity;
|
|
132
|
+
expectedPackageName?: string;
|
|
133
|
+
expectedVersion?: string;
|
|
134
|
+
rejectExistingVersion?: boolean;
|
|
130
135
|
}): AsyncResult<void, Error>;
|
|
131
136
|
/**
|
|
132
137
|
* Install a miniapp from a zip already on local disk (e.g. a bundled asset
|
|
@@ -138,6 +143,9 @@ declare class AppRegistry {
|
|
|
138
143
|
installFromLocalZip(zipPath: string, opts?: {
|
|
139
144
|
versionOverride?: string;
|
|
140
145
|
releaseIdentity?: MiniappReleaseIdentity;
|
|
146
|
+
expectedPackageName?: string;
|
|
147
|
+
expectedVersion?: string;
|
|
148
|
+
rejectExistingVersion?: boolean;
|
|
141
149
|
}): AsyncResult<{
|
|
142
150
|
packageName: string;
|
|
143
151
|
version: string;
|
|
@@ -149,6 +157,12 @@ declare class AppRegistry {
|
|
|
149
157
|
*/
|
|
150
158
|
private finalizeInstall;
|
|
151
159
|
getReleaseIdentity(packageName: string, version: string): MiniappReleaseIdentity | null;
|
|
160
|
+
/** Enumerate installed releases carrying deployment ownership metadata. */
|
|
161
|
+
getDeploymentOwnedReleases(): Array<{
|
|
162
|
+
packageName: string;
|
|
163
|
+
version: string;
|
|
164
|
+
identity: MiniappReleaseIdentity;
|
|
165
|
+
}>;
|
|
152
166
|
installFromJsonUrl(baseUrl: string): AsyncResult<{
|
|
153
167
|
packageName: string;
|
|
154
168
|
version: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppRegistry.d.ts","sourceRoot":"","sources":["../../src/services/AppRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAC,WAAW,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAA;AAE9D,OAAO,KAAK,EAAC,gBAAgB,EAAqB,UAAU,EAAE,SAAS,EAAC,MAAM,iBAAiB,CAAA;AAC/F,OAAO,EAAC,mBAAmB,EAAyC,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"AppRegistry.d.ts","sourceRoot":"","sources":["../../src/services/AppRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,10 +25,18 @@ import { HardwareRequirementLevel, HardwareType } from "../types";
|
|
|
25
25
|
import { configuredDevHost } from "../utils/configuredDevHost";
|
|
26
26
|
import { storage } from "../utils/storage/storage";
|
|
27
27
|
import { printDirectory } from "../utils/storage/zip";
|
|
28
|
+
import { isInstalledMiniappAllowed, isOfflineSystemMiniappAllowed } from "../runtime/bootstrap";
|
|
28
29
|
import { checkManifestVersions } from "./manifestVersionGate";
|
|
29
30
|
import { normalizeManifestActions } from "./manifestActions";
|
|
31
|
+
import { miniappInstallIdentityError } from "./miniappInstallIdentity";
|
|
30
32
|
import { miniappRunningRegistry } from "./MiniappRunningRegistry";
|
|
31
33
|
export { normalizeManifestActions } from "./manifestActions";
|
|
34
|
+
let installQueue = Promise.resolve();
|
|
35
|
+
function serializeInstall(operation) {
|
|
36
|
+
const result = installQueue.then(operation, operation);
|
|
37
|
+
installQueue = result.then(() => undefined, () => undefined);
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
32
40
|
const ALLOWED_PERMISSION_TYPES = new Set([
|
|
33
41
|
"MICROPHONE",
|
|
34
42
|
"CAMERA",
|
|
@@ -170,7 +178,7 @@ async function downloadMiniAppZip(url) {
|
|
|
170
178
|
* so multiple snapshots can coexist alongside
|
|
171
179
|
* semver-installed versions.
|
|
172
180
|
*/
|
|
173
|
-
async function unpackMiniApp(zipPath, versionOverride) {
|
|
181
|
+
async function unpackMiniApp(zipPath, versionOverride, expected) {
|
|
174
182
|
const unzipDir = new Directory(Paths.cache, "lma_unzip");
|
|
175
183
|
try {
|
|
176
184
|
if (unzipDir.exists)
|
|
@@ -212,6 +220,9 @@ async function unpackMiniApp(zipPath, versionOverride) {
|
|
|
212
220
|
throw "READ_MANIFEST_FAILED";
|
|
213
221
|
}
|
|
214
222
|
const version = versionOverride ?? manifestVersion;
|
|
223
|
+
const identityError = miniappInstallIdentityError({ packageName, version: manifestVersion }, expected);
|
|
224
|
+
if (identityError)
|
|
225
|
+
throw new Error(identityError);
|
|
215
226
|
console.log(`ZIP: installing ${packageName} as version ${version}`);
|
|
216
227
|
const basePackageDir = new Directory(Paths.document, "lmas", packageName);
|
|
217
228
|
try {
|
|
@@ -225,6 +236,9 @@ async function unpackMiniApp(zipPath, versionOverride) {
|
|
|
225
236
|
}
|
|
226
237
|
const versionDir = new Directory(basePackageDir, version);
|
|
227
238
|
try {
|
|
239
|
+
if (expected?.rejectExistingVersion && versionDir.exists) {
|
|
240
|
+
throw new Error(`Miniapp ${packageName}@${version} is already installed`);
|
|
241
|
+
}
|
|
228
242
|
if (!versionDir.exists) {
|
|
229
243
|
versionDir.create();
|
|
230
244
|
}
|
|
@@ -261,10 +275,10 @@ async function unpackMiniApp(zipPath, versionOverride) {
|
|
|
261
275
|
* so multiple snapshots can coexist alongside
|
|
262
276
|
* semver-installed versions.
|
|
263
277
|
*/
|
|
264
|
-
async function downloadAndInstallMiniApp(url, versionOverride) {
|
|
278
|
+
async function downloadAndInstallMiniApp(url, versionOverride, expected) {
|
|
265
279
|
const downloadedZipPath = await downloadMiniAppZip(url);
|
|
266
280
|
console.log("ZIP: done downloading, starting unzip");
|
|
267
|
-
return unpackMiniApp(downloadedZipPath, versionOverride);
|
|
281
|
+
return unpackMiniApp(downloadedZipPath, versionOverride, expected);
|
|
268
282
|
}
|
|
269
283
|
class AppRegistry {
|
|
270
284
|
cachedApps = [];
|
|
@@ -388,11 +402,15 @@ class AppRegistry {
|
|
|
388
402
|
* snapshots can coexist alongside semver-installed versions.
|
|
389
403
|
*/
|
|
390
404
|
installFromUrl(url, opts) {
|
|
391
|
-
return Res.try_async(async () => {
|
|
392
|
-
const { packageName, version } = await downloadAndInstallMiniApp(url, opts?.versionOverride
|
|
405
|
+
return Res.try_async(() => serializeInstall(async () => {
|
|
406
|
+
const { packageName, version } = await downloadAndInstallMiniApp(url, opts?.versionOverride, {
|
|
407
|
+
packageName: opts?.expectedPackageName,
|
|
408
|
+
version: opts?.expectedVersion,
|
|
409
|
+
rejectExistingVersion: opts?.rejectExistingVersion,
|
|
410
|
+
});
|
|
393
411
|
console.log("APP_REGISTRY: Downloaded and installed mini app");
|
|
394
412
|
this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? { source: version.startsWith("dev-") ? "dev_snapshot" : "direct_download" });
|
|
395
|
-
});
|
|
413
|
+
}));
|
|
396
414
|
}
|
|
397
415
|
/**
|
|
398
416
|
* Install a miniapp from a zip already on local disk (e.g. a bundled asset
|
|
@@ -402,12 +420,16 @@ class AppRegistry {
|
|
|
402
420
|
* @param zipPath file:// URI of the local zip.
|
|
403
421
|
*/
|
|
404
422
|
installFromLocalZip(zipPath, opts) {
|
|
405
|
-
return Res.try_async(async () => {
|
|
406
|
-
const { packageName, version } = await unpackMiniApp(zipPath, opts?.versionOverride
|
|
423
|
+
return Res.try_async(() => serializeInstall(async () => {
|
|
424
|
+
const { packageName, version } = await unpackMiniApp(zipPath, opts?.versionOverride, {
|
|
425
|
+
packageName: opts?.expectedPackageName,
|
|
426
|
+
version: opts?.expectedVersion,
|
|
427
|
+
rejectExistingVersion: opts?.rejectExistingVersion,
|
|
428
|
+
});
|
|
407
429
|
console.log("APP_REGISTRY: Installed mini app from local zip");
|
|
408
430
|
this.finalizeInstall(packageName, version, opts?.releaseIdentity ?? { source: "bundled_asset" });
|
|
409
431
|
return { packageName, version };
|
|
410
|
-
});
|
|
432
|
+
}));
|
|
411
433
|
}
|
|
412
434
|
/**
|
|
413
435
|
* Post-install bookkeeping shared by every install path: clear stale dev
|
|
@@ -433,6 +455,18 @@ class AppRegistry {
|
|
|
433
455
|
const result = storage.load(releaseIdentityKey(packageName, version));
|
|
434
456
|
return result.is_ok() ? result.value : null;
|
|
435
457
|
}
|
|
458
|
+
/** Enumerate installed releases carrying deployment ownership metadata. */
|
|
459
|
+
getDeploymentOwnedReleases() {
|
|
460
|
+
const releases = [];
|
|
461
|
+
for (const packageName of this.getPackageNames()) {
|
|
462
|
+
for (const version of this.getInstalledVersions(packageName)) {
|
|
463
|
+
const identity = this.getReleaseIdentity(packageName, version);
|
|
464
|
+
if (identity?.source === "deployment_manifest")
|
|
465
|
+
releases.push({ packageName, version, identity });
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return releases;
|
|
469
|
+
}
|
|
436
470
|
installFromJsonUrl(baseUrl) {
|
|
437
471
|
return Res.try_async(async () => {
|
|
438
472
|
const trimmed = baseUrl.replace(/\/$/, "");
|
|
@@ -663,11 +697,13 @@ class AppRegistry {
|
|
|
663
697
|
* registration in finalizeInstall. Native offline apps keep top priority.
|
|
664
698
|
*/
|
|
665
699
|
mergeProjectedApps(diskApps) {
|
|
666
|
-
const offline = this.projectOfflineApps();
|
|
700
|
+
const offline = this.projectOfflineApps().filter((app) => isOfflineSystemMiniappAllowed(app.packageName));
|
|
667
701
|
const offlinePackages = new Set(offline.map((app) => app.packageName));
|
|
668
|
-
const dev = this.projectDevApps().filter((app) => !offlinePackages.has(app.packageName));
|
|
702
|
+
const dev = this.projectDevApps().filter((app) => isInstalledMiniappAllowed(app.packageName, undefined, null) && !offlinePackages.has(app.packageName));
|
|
669
703
|
const devPackages = new Set(dev.map((app) => app.packageName));
|
|
670
|
-
const installed = diskApps.filter((app) =>
|
|
704
|
+
const installed = diskApps.filter((app) => isInstalledMiniappAllowed(app.packageName, app.version, app.version ? this.getReleaseIdentity(app.packageName, app.version) : null) &&
|
|
705
|
+
!offlinePackages.has(app.packageName) &&
|
|
706
|
+
!devPackages.has(app.packageName));
|
|
671
707
|
return [...installed, ...dev, ...offline];
|
|
672
708
|
}
|
|
673
709
|
async getInstalledMiniapps() {
|