@mentra/engine 3.4.0-dev.1207 → 3.4.0-dev.1209
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/facades/glasses.d.ts.map +1 -1
- package/build/facades/glasses.js +5 -3
- package/build/facades/glasses.js.map +1 -1
- package/build/generated/releaseMetadata.js +5 -5
- package/build/generated/releaseMetadata.js.map +1 -1
- package/build/services/AppRegistry.d.ts +2 -0
- package/build/services/AppRegistry.d.ts.map +1 -1
- package/build/services/AppRegistry.js.map +1 -1
- package/build/services/LocalMiniappRuntime.d.ts +2 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -1
- package/build/services/LocalMiniappRuntime.js +18 -1
- package/build/services/LocalMiniappRuntime.js.map +1 -1
- package/build/services/MentraJSCrashController.d.ts +2 -0
- package/build/services/MentraJSCrashController.d.ts.map +1 -1
- package/build/services/MentraJSCrashController.js +4 -0
- package/build/services/MentraJSCrashController.js.map +1 -1
- package/build/services/MentraJSRouter.d.ts.map +1 -1
- package/build/services/MentraJSRouter.js +14 -3
- package/build/services/MentraJSRouter.js.map +1 -1
- package/build/services/MiniappLauncher.d.ts +6 -0
- package/build/services/MiniappLauncher.d.ts.map +1 -1
- package/build/services/MiniappLauncher.js +20 -3
- package/build/services/MiniappLauncher.js.map +1 -1
- package/build/services/fleet/FleetReporter.d.ts.map +1 -1
- package/build/services/fleet/FleetReporter.js +43 -0
- package/build/services/fleet/FleetReporter.js.map +1 -1
- package/build/services/fleet/fleetCollector.d.ts +1 -1
- package/build/services/fleet/fleetCollector.d.ts.map +1 -1
- package/build/services/fleet/fleetCollector.js +146 -5
- package/build/services/fleet/fleetCollector.js.map +1 -1
- package/build/services/fleet/fleetEvents.d.ts +39 -3
- package/build/services/fleet/fleetEvents.d.ts.map +1 -1
- package/build/services/fleet/fleetEvents.js +66 -22
- package/build/services/fleet/fleetEvents.js.map +1 -1
- package/build/services/fleet/fleetQueue.d.ts +26 -0
- package/build/services/fleet/fleetQueue.d.ts.map +1 -1
- package/build/services/fleet/fleetQueue.js +94 -8
- package/build/services/fleet/fleetQueue.js.map +1 -1
- package/build/services/fleet/telemetryLimits.d.ts +16 -0
- package/build/services/fleet/telemetryLimits.d.ts.map +1 -0
- package/build/services/fleet/telemetryLimits.js +69 -0
- package/build/services/fleet/telemetryLimits.js.map +1 -0
- package/build/services/installMiniapp.d.ts +13 -0
- package/build/services/installMiniapp.d.ts.map +1 -1
- package/build/services/installMiniapp.js +64 -1
- package/build/services/installMiniapp.js.map +1 -1
- package/build/services/miniappReleaseInstall.js +1 -1
- package/build/services/miniappReleaseInstall.js.map +1 -1
- package/build/stores/apps.d.ts.map +1 -1
- package/build/stores/apps.js +16 -1
- package/build/stores/apps.js.map +1 -1
- package/package.json +8 -8
- package/src/facades/glasses.ts +5 -3
- package/src/generated/releaseMetadata.ts +5 -5
- package/src/services/AppRegistry.ts +2 -0
- package/src/services/LocalMiniappRuntime.ts +20 -1
- package/src/services/MentraJSCrashController.ts +5 -0
- package/src/services/MentraJSRouter.ts +15 -3
- package/src/services/MiniappLauncher.ts +18 -2
- package/src/services/fleet/FleetReporter.ts +40 -0
- package/src/services/fleet/fleetCollector.ts +160 -6
- package/src/services/fleet/fleetEvents.ts +104 -20
- package/src/services/fleet/fleetQueue.ts +100 -7
- package/src/services/fleet/telemetryLimits.ts +78 -0
- package/src/services/installMiniapp.ts +78 -2
- package/src/services/miniappReleaseInstall.ts +1 -1
- package/src/stores/apps.ts +19 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installMiniapp.js","sourceRoot":"","sources":["../../src/services/installMiniapp.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `installMiniapp(url)`: the one engine call for every install from a miniapp URL, whichever way it came in (a link,\n * the scanner, the paste box, a system miniapp, a Fleet assignment).\n *\n * 1. Fetch `<url>/miniapp.json`, answering a sign-in challenge. A miniapp already installed from that URL opens.\n * 2. The domain rule: the URL's domain, and the domain it was served from, must own the package name.\n * 3. Register the URL in Core's registry. `archived` and `not_a_miniapp` stop the install; when the registry can't\n * be reached, or Core refuses the call, the install goes on, as for an entry only the phone can reach.\n * 4. Ask the person, unless the install is headless. First the age gate: a miniapp rated above the host app's own\n * rating needs the person's declared age to be old enough. A headless install meets the gate when it first opens.\n * 5. Check the phone can run it: `minHostVersion` and `sdkVersion`. `hardwareRequirements` describe the glasses, which\n * may not be paired yet, so they never refuse an install: the sheet says what the paired glasses lack.\n * 6. Download the ZIP (answering its server's challenge), check its SHA-256, and install it through the shared\n * installer, which checks the ZIP's own package name and version and applies the signing and version rules.\n *\n * A local-network address (spec, \"Local-network miniapps\") has no domain to own a package name, so it installs as a\n * development build of the name it serves, over HTTP or HTTPS: never registered, never updated from its URL, with\n * its own data, tokens marked as a local build's, and no system privileges ({@link installLocalBuild}).\n */\nimport type {RegistryRegisterRequest, RegistryRegisterResponse} from \"@mentra/cloud-protocol\"\nimport {\n isLocalNetworkHost,\n normalizeMiniappUrl,\n ServedMiniappManifestSchema,\n type ServedMiniappManifest,\n} from \"@mentra/cloud-protocol/miniapp-url\"\n\nimport type {HardwareType} from \"../types\"\nimport {getConfigValues, isDevMiniappAllowed, isInstalledMiniappAllowed} from \"../runtime/bootstrap\"\nimport {MiniappRunningError} from \"../utils/storeInstallRuntime\"\nimport appRegistry, {type InstallableReleaseIdentity, type MiniappReleaseIdentity} from \"./AppRegistry\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport type {ManagedAssignment} from \"./fleet/assignmentReconciler\"\nimport localMiniappRuntime from \"./LocalMiniappRuntime\"\nimport {checkMiniappAge, type AgeGateVerdict, type AgeRatedMiniapp} from \"./miniappAgeGate\"\nimport {isPackageNameAllowedForUrl} from \"./miniappDomainRule\"\nimport {fetchMiniappBundle, fetchMiniappJson, MiniappFetchError, type MiniappJsonResult} from \"./miniappFetch\"\nimport {\n checkMiniappRunsOnPhone,\n missingRequiredHardware,\n type MiniappVersionPolicy,\n} from \"./miniappInstallCompatibility\"\nimport {\n installLocalBuild,\n restoreInstalledRelease,\n type LocalBuildInstall,\n type LocalBuildServer,\n} from \"./localBuildInstall\"\nimport {installMiniappRelease, MiniappInstallCancelledError, type ReleaseInstallOptions} from \"./miniappReleaseInstall\"\nimport {miniappUpdateUrl} from \"./miniappUrlUpdates\"\nimport {isSystemMiniappPackage} from \"./SystemMiniappPolicy\"\nimport {firstPartyMiniappUrl} from \"./systemMiniappTrust\"\n\nexport type {ManagedAssignment}\n\n/** How the install came in. `confirm` decides whether the person is asked; `assignment` installs for Fleet. */\nexport type InstallMiniappSource = \"link\" | \"scanner\" | \"paste\" | \"system\" | \"assignment\" | \"local\"\n\n/** What the install sheet shows. */\nexport interface MiniappInstallPreview {\n /** The miniapp URL, normalized: it ends in `/`. */\n url: string\n host: string\n /** A local-network address: the sheet says \"From your local network\", with the address. */\n local: boolean\n packageName: string\n name: string\n /** The icon `miniapp.json` names, as an absolute HTTPS URL. */\n iconUrl: string | null\n ageRating: string | null\n /** Its server asked for sign-in. */\n private: boolean\n /** The package is installed already, from another source; installing replaces it. */\n alreadyInstalled: boolean\n /** Required hardware the paired glasses lack (all of it with none paired). The sheet says so; the install goes on. */\n missingHardware: HardwareType[]\n}\n\nexport interface InstallMiniappOptions {\n source: InstallMiniappSource\n /** Show the install sheet; resolve true to install. Omitted: headless. */\n confirm?: (preview: MiniappInstallPreview) => Promise<boolean>\n /** Fleet only: the assignment the install records with the release. */\n assignment?: ManagedAssignment\n /**\n * The package the caller resolved the URL to (Fleet's reconciler). A URL that serves another package by now is\n * `not_a_miniapp`, before anything is registered or downloaded.\n */\n expectedPackageName?: string\n /** True once the install should stop. Nothing commits after that. */\n isCancelled?: () => boolean\n /**\n * Headless only: called when the update of a running miniapp is staged and waits for the person's answer to its\n * update prompt. The call resolves once they answer: `installed`, or `deferred` for Not now.\n */\n onAsking?: () => void\n}\n\nexport interface InstallMiniappResult {\n /**\n * `installed`: this release installed. `opened`: nothing installed, because the package is installed from this URL\n * already, or a newer release of it is; the caller opens it, if it opens anything. `deferred`: a headless update of\n * a running miniapp waits for it to stop, or for the person's answer to the update prompt.\n */\n status: \"installed\" | \"opened\" | \"deferred\"\n packageName: string\n /** The installed version: the new release, or the one that stays. */\n version: string\n}\n\n/**\n * Why an install stopped. `age_restricted`: the age gate stopped it, because the person's declared age is below the\n * miniapp's rating, or couldn't be read, kept or asked for. In the first two cases the engine has already told them\n * why, through the host's `showAgeRestricted` seam. `cancelled`: the install was cancelled, or the person declined\n * the sheet or closed the age question.\n */\nexport type InstallMiniappErrorCode =\n | \"not_a_miniapp\"\n | \"domain_mismatch\"\n | \"archived\"\n | \"needs_newer_app\"\n | \"access_denied\"\n | \"age_restricted\"\n | \"network\"\n | \"cancelled\"\n | \"integrity\"\n | \"signature_invalid\"\n\nexport class InstallMiniappError extends Error {\n readonly code: InstallMiniappErrorCode\n\n constructor(code: InstallMiniappErrorCode, message: string, options: {cause?: unknown} = {}) {\n super(message)\n this.name = \"InstallMiniappError\"\n this.code = code\n if (options.cause !== undefined) (this as {cause?: unknown}).cause = options.cause\n }\n}\n\n// ---- The installer ------------------------------------------------------------------------------------------\n\nexport interface InstallMiniappDependencies {\n /**\n * `miniapp.json`, answering a sign-in challenge for whichever package the asking URL's domain owns. A local-network\n * address owns no domain: with `local`, a challenge comes back unanswered.\n */\n fetchManifest(url: string, options: {local: boolean}): Promise<MiniappJsonResult>\n /** The ZIP's bytes with this SHA-256, answering a sign-in challenge for this package only (never with `local`). */\n fetchBundle(\n url: string,\n options: {packageName: string; sha256: string; onChallenge: () => void; local?: boolean},\n ): Promise<Uint8Array>\n /** Register every install's URL (the engine's `requireRegistry`). */\n requireRegistry(): boolean\n /** Core's answer (`POST /api/client/registry/register`). Rejects when Core can't be reached or refuses the call. */\n register(request: RegistryRegisterRequest): Promise<RegistryRegisterResponse>\n /** The active installed release (not a development build), or null. */\n activeRelease(packageName: string): {version: string; identity: MiniappReleaseIdentity | null} | null\n /** A development build (a local-network install, a development server or snapshot) runs instead of the release. */\n hasDevelopmentSelection(packageName: string): boolean\n /** The deployment allows development builds of the package, local-network builds included. */\n developmentAllowed(packageName: string): boolean\n /** The URL an installed release updates from, or undefined. */\n updateUrl(packageName: string, identity: MiniappReleaseIdentity | null): string | undefined\n /** Throws when a newer release of the package is installed. */\n assertCanInstallVersion(packageName: string, version: string): void\n /** The deployment lets this release run once it is installed, for an install that came in this way. */\n allowsRelease(\n packageName: string,\n version: string,\n identity: MiniappReleaseIdentity,\n source: InstallMiniappSource,\n ): boolean\n /**\n * The age gate for an install with a sheet (`miniappAgeGate.ts`): the person may be asked their age, and is told why\n * when the gate stops the install.\n */\n checkAge(miniapp: AgeRatedMiniapp): Promise<AgeGateVerdict>\n /** What the phone can run (its Mentra App and SDK versions), or null when the host configured none. */\n compatibilityPolicy(): MiniappVersionPolicy | null\n /** The required hardware of these `hardwareRequirements` that the paired glasses (or none) lack. */\n missingHardware(hardwareRequirements: unknown): HardwareType[]\n install(bundleUrl: string, options: ReleaseInstallOptions): Promise<void>\n /** Install a local-network build of the package ({@link installLocalBuild}). */\n installLocal(bundleUrl: string, install: LocalBuildInstall): Promise<void>\n /** Run the installed release again in place of a development build of its name ({@link restoreInstalledRelease}). */\n restoreRelease(packageName: string, isCancelled: () => boolean): Promise<void>\n /** Keep only these releases of the package. */\n keepVersions(packageName: string, versions: string[]): Promise<void>\n /** Changes when the engine session ends; an install started before then never commits. */\n installSession(): number\n warn(message: string, error?: unknown): void\n}\n\n/** Build `installMiniapp` over its dependencies. */\nexport function createMiniappInstaller(\n deps: InstallMiniappDependencies,\n): (url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult> {\n return async (url, options) => {\n if (options.source === \"assignment\" && !options.assignment) {\n throw new Error(\"An assignment install must name its assignment\")\n }\n const session = deps.installSession()\n const cancelled = () => options.isCancelled?.() === true || deps.installSession() !== session\n const assertCurrent = () => {\n if (cancelled()) throw new InstallMiniappError(\"cancelled\", `The install of ${url} was cancelled`)\n }\n\n const target = normalizeMiniappUrl(url)\n if (!target) throw new InstallMiniappError(\"not_a_miniapp\", `${url} is not an HTTPS miniapp URL`)\n if (target.kind === \"local\") return installFromLocalNetwork(deps, target, options, cancelled, assertCurrent)\n const served = await readServedManifest(deps, target.url, false)\n assertCurrent()\n const {manifest} = served\n const packageName = manifest.packageName\n if (options.expectedPackageName !== undefined && packageName !== options.expectedPackageName) {\n throw new InstallMiniappError(\n \"not_a_miniapp\",\n `${target.url} serves ${packageName} now, not ${options.expectedPackageName}`,\n )\n }\n\n // A miniapp installed from this URL opens, unless a development build of its name runs in its place: installing\n // it again replaces that build. Fleet's reconciler decides for itself what an assignment installs.\n const active = deps.activeRelease(packageName)\n if (options.source !== \"assignment\" && active && !deps.hasDevelopmentSelection(packageName)) {\n const installedFrom = deps.updateUrl(packageName, active.identity)\n if (installedFrom && normalizeMiniappUrl(installedFrom)?.url === target.url) {\n return {status: \"opened\", packageName, version: active.version}\n }\n }\n\n if (!isPackageNameAllowedForUrl(packageName, target.url) || !isPackageNameAllowedForUrl(packageName, served.url)) {\n throw new InstallMiniappError(\"domain_mismatch\", `${target.host} can't serve ${packageName}`)\n }\n if (served.challenge && served.challenge.packageName !== packageName) {\n throw new InstallMiniappError(\n \"not_a_miniapp\",\n `${target.url} asked for sign-in as ${served.challenge.packageName} but serves ${packageName}`,\n )\n }\n\n if (deps.requireRegistry()) await register(deps, target.url, manifest)\n assertCurrent()\n\n const preview: MiniappInstallPreview = {\n url: target.url,\n host: target.host,\n local: false,\n packageName,\n name: manifest.name,\n iconUrl: served.iconUrl,\n ageRating: manifest.ageRating ?? null,\n private: Boolean(served.challenge),\n alreadyInstalled: active !== null,\n missingHardware: deps.missingHardware(manifest.hardwareRequirements),\n }\n\n // A newer release is installed already: it stays, and opens. Where a development build of its name runs in its\n // place, installing the URL again brings that release back.\n try {\n deps.assertCanInstallVersion(packageName, manifest.version)\n } catch (error) {\n if (!isNewerInstalled(error)) throw installError(error, packageName)\n if (options.source !== \"assignment\" && deps.hasDevelopmentSelection(packageName)) {\n if (options.confirm) {\n await askToInstall(deps, options.confirm, preview, assertCurrent)\n assertCurrent()\n }\n try {\n await deps.restoreRelease(packageName, cancelled)\n } catch (restoreError) {\n if (restoreError instanceof MiniappInstallCancelledError || cancelled()) {\n throw new InstallMiniappError(\"cancelled\", `The install of ${packageName} was cancelled`, {\n cause: restoreError,\n })\n }\n throw installError(restoreError, packageName)\n }\n }\n return {status: \"opened\", packageName, version: active?.version ?? manifest.version}\n }\n\n const identity: InstallableReleaseIdentity = {\n source: \"url\",\n sourceUrl: target.url,\n bundleSha256: manifest.bundle.sha256,\n ...(served.challenge ? {private: true} : {}),\n }\n if (!deps.allowsRelease(packageName, manifest.version, identity, options.source)) {\n throw new InstallMiniappError(\n \"access_denied\",\n `This deployment doesn't allow installing ${packageName} from a URL`,\n )\n }\n\n if (options.confirm) {\n await askToInstall(deps, options.confirm, preview, assertCurrent)\n assertCurrent()\n }\n\n const policy = assertCompatible(deps, manifest)\n\n const headless = !options.confirm\n try {\n await deps.install(served.bundleUrl, {\n expectedPackageName: packageName,\n expectedVersion: manifest.version,\n expectedBundleSha256: manifest.bundle.sha256,\n ...(policy ? {compatibilityPolicy: policy} : {}),\n releaseIdentity: identity,\n // The installer reads the identity after the download, so a ZIP whose server alone asked for sign-in is\n // recorded as private too.\n downloadBundle: (bundleUrl) =>\n deps.fetchBundle(bundleUrl, {\n packageName,\n sha256: manifest.bundle.sha256,\n onChallenge: () => {\n identity.private = true\n },\n }),\n installReason: options.assignment ? \"assignment\" : \"explicit\",\n ...(options.assignment ? {assignment: options.assignment} : {}),\n isCancelled: cancelled,\n // A headless install never closes a running miniapp: its update waits, or asks.\n ...(headless ? {onlyIfStopped: true, askIfRunning: true, firstInstall: true} : {}),\n ...(headless && options.onAsking ? {onAsking: options.onAsking} : {}),\n })\n } catch (error) {\n if (error instanceof MiniappRunningError) {\n return {status: \"deferred\", packageName, version: active?.version ?? manifest.version}\n }\n if (error instanceof MiniappInstallCancelledError || cancelled()) {\n throw new InstallMiniappError(\"cancelled\", `The install of ${packageName} was cancelled`, {cause: error})\n }\n // Another install of a newer release committed first.\n if (isNewerInstalled(error)) {\n return {status: \"opened\", packageName, version: deps.activeRelease(packageName)?.version ?? manifest.version}\n }\n throw installError(error, packageName)\n }\n\n await deps\n .keepVersions(packageName, [manifest.version, ...(active ? [active.version] : [])])\n .catch((error) => deps.warn(`Could not remove older releases of ${packageName}`, error))\n return {status: \"installed\", packageName, version: manifest.version}\n }\n}\n\n/**\n * A miniapp at a local-network address: a development build of the name it serves. Only the person installs one\n * (never Fleet or a system miniapp), and nothing registers it or checks its name against a domain. It installs beside\n * any release of that name, which it stands in for until that release is installed again or the package is\n * uninstalled; the signing rule still applies.\n */\nasync function installFromLocalNetwork(\n deps: InstallMiniappDependencies,\n target: {url: string; host: string},\n options: InstallMiniappOptions,\n cancelled: () => boolean,\n assertCurrent: () => void,\n): Promise<InstallMiniappResult> {\n if (options.source === \"assignment\" || options.source === \"system\") {\n throw new InstallMiniappError(\n \"not_a_miniapp\",\n `${target.url} is on the local network, which only the person's own link, scan or paste installs from`,\n )\n }\n const served = await readServedManifest(deps, target.url, true)\n assertCurrent()\n const {manifest} = served\n const packageName = manifest.packageName\n if (!deps.developmentAllowed(packageName)) {\n throw new InstallMiniappError(\n \"access_denied\",\n `This deployment doesn't allow local-network builds of ${packageName}`,\n )\n }\n\n if (options.confirm) {\n await askToInstall(\n deps,\n options.confirm,\n {\n url: target.url,\n host: target.host,\n local: true,\n packageName,\n name: manifest.name,\n iconUrl: served.iconUrl,\n ageRating: manifest.ageRating ?? null,\n private: false,\n alreadyInstalled: deps.activeRelease(packageName) !== null || deps.hasDevelopmentSelection(packageName),\n missingHardware: deps.missingHardware(manifest.hardwareRequirements),\n },\n assertCurrent,\n )\n assertCurrent()\n }\n\n const policy = assertCompatible(deps, manifest)\n const server = developmentServer(manifest, target.url, served.iconUrl)\n try {\n await deps.installLocal(served.bundleUrl, {\n packageName,\n version: manifest.version,\n sourceUrl: target.url,\n sha256: manifest.bundle.sha256,\n ...(server ? {server} : {}),\n ...(policy ? {compatibilityPolicy: policy} : {}),\n downloadBundle: (bundleUrl) =>\n deps.fetchBundle(bundleUrl, {packageName, sha256: manifest.bundle.sha256, onChallenge: () => {}, local: true}),\n isCancelled: cancelled,\n })\n } catch (error) {\n if (error instanceof MiniappInstallCancelledError || cancelled()) {\n throw new InstallMiniappError(\"cancelled\", `The install of ${packageName} was cancelled`, {cause: error})\n }\n throw installError(error, packageName)\n }\n return {status: \"installed\", packageName, version: manifest.version}\n}\n\n/**\n * Ask the person to install: first the age gate, so nobody is offered a miniapp they're too young for, then the install\n * sheet. A headless install meets the age gate when the miniapp first opens (`MiniappLauncher`).\n */\nasync function askToInstall(\n deps: InstallMiniappDependencies,\n confirm: (preview: MiniappInstallPreview) => Promise<boolean>,\n preview: MiniappInstallPreview,\n assertCurrent: () => void,\n): Promise<void> {\n const {packageName, name, ageRating} = preview\n const verdict = await deps.checkAge({packageName, name, ageRating})\n assertCurrent()\n if (verdict === \"cancelled\") {\n throw new InstallMiniappError(\"cancelled\", `The age question for ${packageName} was closed`)\n }\n if (verdict !== \"allowed\") {\n throw new InstallMiniappError(\"age_restricted\", `${packageName} is rated ${String(ageRating)} (${verdict})`)\n }\n await confirmInstall(confirm, preview)\n}\n\n/** Show the install sheet. A sheet that fails, or that the person declines, cancels the install. */\nasync function confirmInstall(\n confirm: (preview: MiniappInstallPreview) => Promise<boolean>,\n preview: MiniappInstallPreview,\n): Promise<void> {\n let accepted: boolean\n try {\n accepted = await confirm(preview)\n } catch (error) {\n throw new InstallMiniappError(\"cancelled\", `The install sheet for ${preview.packageName} failed`, {cause: error})\n }\n if (!accepted) throw new InstallMiniappError(\"cancelled\", `The install of ${preview.packageName} was declined`)\n}\n\n/** The phone's compatibility policy, once the manifest is known to pass it; null when none. */\nfunction assertCompatible(\n deps: InstallMiniappDependencies,\n manifest: ServedMiniappManifest,\n): MiniappVersionPolicy | null {\n const policy = deps.compatibilityPolicy()\n if (!policy) return null\n const compatibility = checkMiniappRunsOnPhone(manifest, policy)\n if (!compatibility.compatible) {\n throw new InstallMiniappError(\n \"needs_newer_app\",\n `${manifest.name} can't run on this phone: ${compatibility.reason}`,\n )\n }\n return policy\n}\n\n/**\n * The development server a local-network build's `miniapp.json` names in `development` (as `mentra dev` serves it):\n * the build then loads live from its URL, and the server reloads it over `development.reload`, on the same host.\n * Read for local-network URLs only. Undefined when it names none: the installed snapshot is the build.\n */\nfunction developmentServer(\n manifest: ServedMiniappManifest,\n url: string,\n iconUrl: string | null,\n): LocalBuildServer | undefined {\n const raw = manifest as ServedMiniappManifest & Record<string, unknown>\n const development = raw.development\n if (!development || typeof development !== \"object\" || Array.isArray(development)) return undefined\n const {reload, mdns} = development as {reload?: unknown; mdns?: unknown}\n let devPort: number | undefined\n if (typeof reload === \"string\") {\n try {\n const parsed = new URL(reload)\n const port = Number(parsed.port)\n if ((parsed.protocol === \"ws:\" || parsed.protocol === \"wss:\") && Number.isInteger(port) && port > 0) {\n devPort = port\n }\n } catch {\n // No reload channel: the build runs live without hot reload.\n }\n }\n // A `.local` name the phone may reach the same server by after its address changes.\n const mdnsHost =\n typeof mdns === \"string\" && /\\.local$/i.test(mdns.trim()) && isLocalNetworkHost(mdns.trim()) ? mdns.trim() : \"\"\n const devUrl = url.replace(/\\/+$/, \"\")\n return {\n name: manifest.name,\n iconUrl: iconUrl ?? `${devUrl}/icon.png`,\n devUrl,\n ...(devPort ? {devPort} : {}),\n mdnsHost,\n ...(typeof raw.type === \"string\" ? {type: raw.type as LocalBuildServer[\"type\"]} : {}),\n ...(Array.isArray(raw.permissions) ? {permissions: raw.permissions as LocalBuildServer[\"permissions\"]} : {}),\n ...(Array.isArray(raw.hardwareRequirements)\n ? {hardwareRequirements: raw.hardwareRequirements as LocalBuildServer[\"hardwareRequirements\"]}\n : {}),\n ...(Array.isArray(raw.actions) ? {actions: raw.actions as LocalBuildServer[\"actions\"]} : {}),\n }\n}\n\ninterface ServedRelease {\n manifest: ServedMiniappManifest\n /** Where `miniapp.json` was served from, after redirects. */\n url: string\n bundleUrl: string\n iconUrl: string | null\n /** The sign-in challenge its server answered with. */\n challenge?: {packageName: string}\n}\n\n/**\n * `<url>/miniapp.json`: fetched, valid, and naming a ZIP over HTTPS (or, from a local-network address, over HTTP on the\n * local network too).\n */\nasync function readServedManifest(\n deps: InstallMiniappDependencies,\n url: string,\n local: boolean,\n): Promise<ServedRelease> {\n const manifestUrl = new URL(\"miniapp.json\", url).href\n let response: MiniappJsonResult\n try {\n response = await deps.fetchManifest(manifestUrl, {local})\n } catch (error) {\n if (error instanceof MiniappFetchError) {\n switch (error.code) {\n case \"challenge_domain\":\n throw new InstallMiniappError(\"domain_mismatch\", error.message, {cause: error})\n case \"challenge_package\":\n case \"too_large\":\n throw new InstallMiniappError(\"not_a_miniapp\", error.message, {cause: error})\n default:\n throw new InstallMiniappError(\"network\", error.message, {cause: error})\n }\n }\n throw new InstallMiniappError(\"network\", `Could not fetch ${manifestUrl}`, {cause: error})\n }\n const {status} = response\n if (status === 401 || status === 403) {\n throw new InstallMiniappError(\"access_denied\", `${manifestUrl} answered ${status}`)\n }\n if (status === 404) throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} answered 404`)\n if (status === 410) throw new InstallMiniappError(\"archived\", `${manifestUrl} answered 410`)\n if (status < 200 || status >= 300 || response.body === undefined) {\n throw new InstallMiniappError(\"network\", `${manifestUrl} answered ${status}`)\n }\n // Nothing checks a local build's name against a domain, so it must come from the local network.\n if (local && !isLocalNetworkUrl(response.url)) {\n throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} redirected off the local network`)\n }\n let raw: unknown\n try {\n raw = JSON.parse(response.body)\n } catch {\n throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} is not JSON`)\n }\n const parsed = ServedMiniappManifestSchema.safeParse(raw)\n if (!parsed.success) throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} is not a valid miniapp.json`)\n const manifest = parsed.data\n const bundleUrl = servedFileUrl(manifest.bundle.url, response.url, local)\n if (!bundleUrl) throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} names no bundle it may serve`)\n return {\n manifest,\n url: response.url,\n bundleUrl,\n iconUrl: manifest.icon ? servedFileUrl(manifest.icon, response.url, local) : null,\n ...(response.challenge ? {challenge: response.challenge} : {}),\n }\n}\n\n/**\n * A path relative to where `miniapp.json` was served from, or an absolute URL: HTTPS, or for a local-network build,\n * HTTP on the local network too.\n */\nfunction servedFileUrl(path: string, base: string, local: boolean): string | null {\n try {\n const resolved = new URL(path.trim(), base)\n if (resolved.protocol === \"https:\") return resolved.href\n return local && resolved.protocol === \"http:\" && isLocalNetworkUrl(resolved.href) ? resolved.href : null\n } catch {\n return null\n }\n}\n\nfunction isLocalNetworkUrl(url: string): boolean {\n try {\n return isLocalNetworkHost(new URL(url).hostname)\n } catch {\n return false\n }\n}\n\nconst REGISTRY_RESULTS = new Set([\"accepted\", \"accepted_unverified\", \"not_a_miniapp\", \"archived\"])\n\n/** Register the URL. Only Core's own answer can stop the install; without one, it goes on. */\nasync function register(deps: InstallMiniappDependencies, url: string, manifest: ServedMiniappManifest): Promise<void> {\n let answer: RegistryRegisterResponse\n try {\n answer = await deps.register({\n url,\n reported: {\n packageName: manifest.packageName,\n name: manifest.name,\n version: manifest.version,\n ...(manifest.ageRating ? {ageRating: manifest.ageRating} : {}),\n },\n })\n } catch (error) {\n deps.warn(`Could not register ${url}; installing it as only this phone can reach it`, error)\n return\n }\n if (!answer || typeof answer !== \"object\" || !REGISTRY_RESULTS.has(answer.result)) {\n deps.warn(`The registry's answer for ${url} is not usable; installing it as only this phone can reach it`)\n return\n }\n if (answer.result === \"archived\") throw new InstallMiniappError(\"archived\", `${url} is archived`)\n if (answer.result === \"not_a_miniapp\") {\n if (answer.reason === \"domain_mismatch\") {\n throw new InstallMiniappError(\"domain_mismatch\", `Core found ${url} can't serve ${manifest.packageName}`)\n }\n throw new InstallMiniappError(\"not_a_miniapp\", `Core found ${url} is not a miniapp (${String(answer.reason)})`)\n }\n}\n\n/** The version rule refused the release because a newer one is installed (`assertMiniappUpdateVersion`). */\nfunction isNewerInstalled(error: unknown): boolean {\n return error instanceof Error && /^Cannot install .+: version .+ is already installed$/.test(error.message)\n}\n\n/** Map an installer or download failure to its code. Never the error text. */\nfunction installError(error: unknown, packageName: string): InstallMiniappError {\n const message = error instanceof Error ? error.message : String(error)\n const fail = (code: InstallMiniappErrorCode) =>\n new InstallMiniappError(code, `${packageName} did not install: ${message}`, {cause: error})\n if (error instanceof MiniappFetchError) {\n switch (error.code) {\n case \"integrity\":\n return fail(\"integrity\")\n case \"challenge_domain\":\n return fail(\"domain_mismatch\")\n case \"challenge_package\":\n case \"too_large\":\n return fail(\"not_a_miniapp\")\n case \"http\":\n return fail(error.status === 401 || error.status === 403 ? \"access_denied\" : \"network\")\n default:\n return fail(\"network\")\n }\n }\n if (/SHA-256 mismatch|bundle (package|version) mismatch/i.test(message)) return fail(\"integrity\")\n if (/does not allow miniapp development/i.test(message)) return fail(\"access_denied\")\n if (/signature|signer|unsigned bundle|publisher/i.test(message)) return fail(\"signature_invalid\")\n if (\n /Requires Mentra App|Built for SDK|Invalid minimum Mentra App version|Invalid Mentra Miniapp SDK version/i.test(\n message,\n )\n )\n return fail(\"needs_newer_app\")\n if (/^bundle |miniapp\\.json|UNZIP_FAILED|READ_MANIFEST_FAILED|invalid miniapp version/i.test(message)) {\n return fail(\"not_a_miniapp\")\n }\n return fail(\"network\")\n}\n\n/** A miniapp URL at a local-network address: it installs as a local build (see the module comment). */\nexport function isLocalNetworkMiniappUrl(url: string): boolean {\n return normalizeMiniappUrl(url)?.kind === \"local\"\n}\n\n// ---- The engine's installer -----------------------------------------------------------------------------------\n\nconst engineDependencies: InstallMiniappDependencies = {\n fetchManifest: (url, {local}) => fetchMiniappJson(url, local ? {} : {packageForChallenge: true}),\n fetchBundle: (url, {packageName, sha256, onChallenge, local}) =>\n fetchMiniappBundle(url, {packageName, sha256, onChallenge, ...(local ? {answerChallenge: false} : {})}),\n requireRegistry: () => getConfigValues().requireRegistry !== false,\n register: (request) => cloudClientService.core.registry.register(request),\n activeRelease: (packageName) => {\n const version = appRegistry.getActiveReleaseVersion(packageName)\n return version ? {version, identity: appRegistry.getReleaseIdentity(packageName, version)} : null\n },\n hasDevelopmentSelection: (packageName) => appRegistry.hasDevelopmentSelection(packageName),\n developmentAllowed: (packageName) => isDevMiniappAllowed(packageName),\n updateUrl: (packageName, identity) =>\n miniappUpdateUrl(packageName, identity, {\n isSystemPackage: isSystemMiniappPackage,\n firstPartyUrl: (name) => firstPartyMiniappUrl(getConfigValues(), name),\n }),\n assertCanInstallVersion: (packageName, version) => appRegistry.assertCanInstallVersion(packageName, version),\n // A Fleet assignment is its workspace's administration, which the deployment's policy weighs apart from development.\n allowsRelease: (packageName, version, identity, source) =>\n isInstalledMiniappAllowed(packageName, version, identity, {assigned: source === \"assignment\"}),\n checkAge: (miniapp) => checkMiniappAge(miniapp, {interactive: true}),\n compatibilityPolicy: () => {\n const policy = localMiniappRuntime.currentInstallCompatibilityPolicy()\n return policy ? {hostVersion: policy.hostVersion, supportedSdkRange: policy.supportedSdkRange} : null\n },\n missingHardware: (hardwareRequirements) => {\n const capabilities = localMiniappRuntime.currentInstallCompatibilityPolicy()?.hardwareCapabilities\n return capabilities ? missingRequiredHardware(hardwareRequirements, capabilities) : []\n },\n install: (bundleUrl, options) => installMiniappRelease(bundleUrl, options),\n installLocal: (bundleUrl, install) => installLocalBuild(bundleUrl, install),\n restoreRelease: (packageName, isCancelled) => restoreInstalledRelease(packageName, {isCancelled}),\n keepVersions: (packageName, versions) => appRegistry.gcReleaseVersions(packageName, versions),\n installSession: () => localMiniappRuntime.installSession(),\n warn: (message, error) => console.warn(`installMiniapp: ${message}`, error ?? \"\"),\n}\n\nlet engineInstaller: ((url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult>) | null = null\n\n/**\n * Install the miniapp at a miniapp URL (see the module comment). Throws {@link InstallMiniappError}.\n */\nexport function installMiniapp(url: string, options: InstallMiniappOptions): Promise<InstallMiniappResult> {\n engineInstaller ??= createMiniappInstaller(engineDependencies)\n return engineInstaller(url, options)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"installMiniapp.js","sourceRoot":"","sources":["../../src/services/installMiniapp.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `installMiniapp(url)`: the one engine call for every install from a miniapp URL, whichever way it came in (a link,\n * the scanner, the paste box, a system miniapp, a Fleet assignment).\n *\n * 1. Fetch `<url>/miniapp.json`, answering a sign-in challenge. A miniapp already installed from that URL opens.\n * 2. The domain rule: the URL's domain, and the domain it was served from, must own the package name.\n * 3. Register the URL in Core's registry. `archived` and `not_a_miniapp` stop the install; when the registry can't\n * be reached, or Core refuses the call, the install goes on, as for an entry only the phone can reach.\n * 4. Ask the person, unless the install is headless. First the age gate: a miniapp rated above the host app's own\n * rating needs the person's declared age to be old enough. A headless install meets the gate when it first opens.\n * 5. Check the phone can run it: `minHostVersion` and `sdkVersion`. `hardwareRequirements` describe the glasses, which\n * may not be paired yet, so they never refuse an install: the sheet says what the paired glasses lack.\n * 6. Download the ZIP (answering its server's challenge), check its SHA-256, and install it through the shared\n * installer, which checks the ZIP's own package name and version and applies the signing and version rules.\n *\n * A local-network address (spec, \"Local-network miniapps\") has no domain to own a package name, so it installs as a\n * development build of the name it serves, over HTTP or HTTPS: never registered, never updated from its URL, with\n * its own data, tokens marked as a local build's, and no system privileges ({@link installLocalBuild}).\n */\nimport type {FleetInstallFailureReason, RegistryRegisterRequest, RegistryRegisterResponse} from \"@mentra/cloud-protocol\"\nimport {\n isLocalNetworkHost,\n normalizeMiniappUrl,\n ServedMiniappManifestSchema,\n type ServedMiniappManifest,\n} from \"@mentra/cloud-protocol/miniapp-url\"\n\nimport type {HardwareType} from \"../types\"\nimport {getConfigValues, isDevMiniappAllowed, isInstalledMiniappAllowed} from \"../runtime/bootstrap\"\nimport {MiniappRunningError} from \"../utils/storeInstallRuntime\"\nimport appRegistry, {type InstallableReleaseIdentity, type MiniappReleaseIdentity} from \"./AppRegistry\"\nimport {cloudClientService} from \"./CloudClientService\"\nimport type {ManagedAssignment} from \"./fleet/assignmentReconciler\"\nimport {fleetEvents, type FleetInstallEvent} from \"./fleet/fleetEvents\"\nimport localMiniappRuntime from \"./LocalMiniappRuntime\"\nimport {checkMiniappAge, type AgeGateVerdict, type AgeRatedMiniapp} from \"./miniappAgeGate\"\nimport {isPackageNameAllowedForUrl} from \"./miniappDomainRule\"\nimport {fetchMiniappBundle, fetchMiniappJson, MiniappFetchError, type MiniappJsonResult} from \"./miniappFetch\"\nimport {\n checkMiniappRunsOnPhone,\n missingRequiredHardware,\n type MiniappVersionPolicy,\n} from \"./miniappInstallCompatibility\"\nimport {\n installLocalBuild,\n restoreInstalledRelease,\n type LocalBuildInstall,\n type LocalBuildServer,\n} from \"./localBuildInstall\"\nimport {installMiniappRelease, MiniappInstallCancelledError, type ReleaseInstallOptions} from \"./miniappReleaseInstall\"\nimport {miniappUpdateUrl} from \"./miniappUrlUpdates\"\nimport {isSystemMiniappPackage} from \"./SystemMiniappPolicy\"\nimport {firstPartyMiniappUrl} from \"./systemMiniappTrust\"\n\nexport type {ManagedAssignment}\n\n/** How the install came in. `confirm` decides whether the person is asked; `assignment` installs for Fleet. */\nexport type InstallMiniappSource = \"link\" | \"scanner\" | \"paste\" | \"system\" | \"assignment\" | \"local\"\n\n/** What the install sheet shows. */\nexport interface MiniappInstallPreview {\n /** The miniapp URL, normalized: it ends in `/`. */\n url: string\n host: string\n /** A local-network address: the sheet says \"From your local network\", with the address. */\n local: boolean\n packageName: string\n name: string\n /** The icon `miniapp.json` names, as an absolute HTTPS URL. */\n iconUrl: string | null\n ageRating: string | null\n /** Its server asked for sign-in. */\n private: boolean\n /** The package is installed already, from another source; installing replaces it. */\n alreadyInstalled: boolean\n /** Required hardware the paired glasses lack (all of it with none paired). The sheet says so; the install goes on. */\n missingHardware: HardwareType[]\n}\n\nexport interface InstallMiniappOptions {\n source: InstallMiniappSource\n /** Show the install sheet; resolve true to install. Omitted: headless. */\n confirm?: (preview: MiniappInstallPreview) => Promise<boolean>\n /** Fleet only: the assignment the install records with the release. */\n assignment?: ManagedAssignment\n /**\n * The package the caller resolved the URL to (Fleet's reconciler). A URL that serves another package by now is\n * `not_a_miniapp`, before anything is registered or downloaded.\n */\n expectedPackageName?: string\n /** True once the install should stop. Nothing commits after that. */\n isCancelled?: () => boolean\n /**\n * Called once the installer knows the package, the release it would replace (null for none) and the version it would\n * install, before anything is downloaded or asked: how Fleet reports the attempt whatever comes after\n * (`installMiniapp`).\n */\n onResolved?: (packageName: string, previousVersion: string | null, version: string) => void\n /**\n * Headless only: called when the update of a running miniapp is staged and waits for the person's answer to its\n * update prompt. The call resolves once they answer: `installed`, or `deferred` for Not now.\n */\n onAsking?: () => void\n}\n\nexport interface InstallMiniappResult {\n /**\n * `installed`: this release installed. `opened`: nothing installed, because the package is installed from this URL\n * already, or a newer release of it is; the caller opens it, if it opens anything. `deferred`: a headless update of\n * a running miniapp waits for it to stop, or for the person's answer to the update prompt.\n */\n status: \"installed\" | \"opened\" | \"deferred\"\n packageName: string\n /** The installed version: the new release, or the one that stays. */\n version: string\n}\n\n/**\n * Why an install stopped. `age_restricted`: the age gate stopped it, because the person's declared age is below the\n * miniapp's rating, or couldn't be read, kept or asked for. In the first two cases the engine has already told them\n * why, through the host's `showAgeRestricted` seam. `cancelled`: the install was cancelled, or the person declined\n * the sheet or closed the age question.\n */\nexport type InstallMiniappErrorCode =\n | \"not_a_miniapp\"\n | \"domain_mismatch\"\n | \"archived\"\n | \"needs_newer_app\"\n | \"access_denied\"\n | \"age_restricted\"\n | \"network\"\n | \"cancelled\"\n | \"integrity\"\n | \"signature_invalid\"\n\nexport class InstallMiniappError extends Error {\n readonly code: InstallMiniappErrorCode\n\n constructor(code: InstallMiniappErrorCode, message: string, options: {cause?: unknown} = {}) {\n super(message)\n this.name = \"InstallMiniappError\"\n this.code = code\n if (options.cause !== undefined) (this as {cause?: unknown}).cause = options.cause\n }\n}\n\n// ---- The installer ------------------------------------------------------------------------------------------\n\nexport interface InstallMiniappDependencies {\n /**\n * `miniapp.json`, answering a sign-in challenge for whichever package the asking URL's domain owns. A local-network\n * address owns no domain: with `local`, a challenge comes back unanswered.\n */\n fetchManifest(url: string, options: {local: boolean}): Promise<MiniappJsonResult>\n /** The ZIP's bytes with this SHA-256, answering a sign-in challenge for this package only (never with `local`). */\n fetchBundle(\n url: string,\n options: {packageName: string; sha256: string; onChallenge: () => void; local?: boolean},\n ): Promise<Uint8Array>\n /** Register every install's URL (the engine's `requireRegistry`). */\n requireRegistry(): boolean\n /** Core's answer (`POST /api/client/registry/register`). Rejects when Core can't be reached or refuses the call. */\n register(request: RegistryRegisterRequest): Promise<RegistryRegisterResponse>\n /** The active installed release (not a development build), or null. */\n activeRelease(packageName: string): {version: string; identity: MiniappReleaseIdentity | null} | null\n /** A development build (a local-network install, a development server or snapshot) runs instead of the release. */\n hasDevelopmentSelection(packageName: string): boolean\n /** The deployment allows development builds of the package, local-network builds included. */\n developmentAllowed(packageName: string): boolean\n /** The URL an installed release updates from, or undefined. */\n updateUrl(packageName: string, identity: MiniappReleaseIdentity | null): string | undefined\n /** Throws when a newer release of the package is installed. */\n assertCanInstallVersion(packageName: string, version: string): void\n /** The deployment lets this release run once it is installed, for an install that came in this way. */\n allowsRelease(\n packageName: string,\n version: string,\n identity: MiniappReleaseIdentity,\n source: InstallMiniappSource,\n ): boolean\n /**\n * The age gate for an install with a sheet (`miniappAgeGate.ts`): the person may be asked their age, and is told why\n * when the gate stops the install.\n */\n checkAge(miniapp: AgeRatedMiniapp): Promise<AgeGateVerdict>\n /** What the phone can run (its Mentra App and SDK versions), or null when the host configured none. */\n compatibilityPolicy(): MiniappVersionPolicy | null\n /** The required hardware of these `hardwareRequirements` that the paired glasses (or none) lack. */\n missingHardware(hardwareRequirements: unknown): HardwareType[]\n install(bundleUrl: string, options: ReleaseInstallOptions): Promise<void>\n /** Install a local-network build of the package ({@link installLocalBuild}). */\n installLocal(bundleUrl: string, install: LocalBuildInstall): Promise<void>\n /** Run the installed release again in place of a development build of its name ({@link restoreInstalledRelease}). */\n restoreRelease(packageName: string, isCancelled: () => boolean): Promise<void>\n /** Keep only these releases of the package. */\n keepVersions(packageName: string, versions: string[]): Promise<void>\n /** Changes when the engine session ends; an install started before then never commits. */\n installSession(): number\n warn(message: string, error?: unknown): void\n}\n\n/** Build `installMiniapp` over its dependencies. */\nexport function createMiniappInstaller(\n deps: InstallMiniappDependencies,\n): (url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult> {\n return async (url, options) => {\n if (options.source === \"assignment\" && !options.assignment) {\n throw new Error(\"An assignment install must name its assignment\")\n }\n const session = deps.installSession()\n const cancelled = () => options.isCancelled?.() === true || deps.installSession() !== session\n const assertCurrent = () => {\n if (cancelled()) throw new InstallMiniappError(\"cancelled\", `The install of ${url} was cancelled`)\n }\n\n const target = normalizeMiniappUrl(url)\n if (!target) throw new InstallMiniappError(\"not_a_miniapp\", `${url} is not an HTTPS miniapp URL`)\n if (target.kind === \"local\") return installFromLocalNetwork(deps, target, options, cancelled, assertCurrent)\n const served = await readServedManifest(deps, target.url, false)\n assertCurrent()\n const {manifest} = served\n const packageName = manifest.packageName\n if (options.expectedPackageName !== undefined && packageName !== options.expectedPackageName) {\n throw new InstallMiniappError(\n \"not_a_miniapp\",\n `${target.url} serves ${packageName} now, not ${options.expectedPackageName}`,\n )\n }\n\n // A miniapp installed from this URL opens, unless a development build of its name runs in its place: installing\n // it again replaces that build. Fleet's reconciler decides for itself what an assignment installs.\n const active = deps.activeRelease(packageName)\n options.onResolved?.(packageName, active?.version ?? null, manifest.version)\n if (options.source !== \"assignment\" && active && !deps.hasDevelopmentSelection(packageName)) {\n const installedFrom = deps.updateUrl(packageName, active.identity)\n if (installedFrom && normalizeMiniappUrl(installedFrom)?.url === target.url) {\n return {status: \"opened\", packageName, version: active.version}\n }\n }\n\n if (!isPackageNameAllowedForUrl(packageName, target.url) || !isPackageNameAllowedForUrl(packageName, served.url)) {\n throw new InstallMiniappError(\"domain_mismatch\", `${target.host} can't serve ${packageName}`)\n }\n if (served.challenge && served.challenge.packageName !== packageName) {\n throw new InstallMiniappError(\n \"not_a_miniapp\",\n `${target.url} asked for sign-in as ${served.challenge.packageName} but serves ${packageName}`,\n )\n }\n\n if (deps.requireRegistry()) await register(deps, target.url, manifest)\n assertCurrent()\n\n const preview: MiniappInstallPreview = {\n url: target.url,\n host: target.host,\n local: false,\n packageName,\n name: manifest.name,\n iconUrl: served.iconUrl,\n ageRating: manifest.ageRating ?? null,\n private: Boolean(served.challenge),\n alreadyInstalled: active !== null,\n missingHardware: deps.missingHardware(manifest.hardwareRequirements),\n }\n\n // A newer release is installed already: it stays, and opens. Where a development build of its name runs in its\n // place, installing the URL again brings that release back.\n try {\n deps.assertCanInstallVersion(packageName, manifest.version)\n } catch (error) {\n if (!isNewerInstalled(error)) throw installError(error, packageName)\n if (options.source !== \"assignment\" && deps.hasDevelopmentSelection(packageName)) {\n if (options.confirm) {\n await askToInstall(deps, options.confirm, preview, assertCurrent)\n assertCurrent()\n }\n try {\n await deps.restoreRelease(packageName, cancelled)\n } catch (restoreError) {\n if (restoreError instanceof MiniappInstallCancelledError || cancelled()) {\n throw new InstallMiniappError(\"cancelled\", `The install of ${packageName} was cancelled`, {\n cause: restoreError,\n })\n }\n throw installError(restoreError, packageName)\n }\n }\n return {status: \"opened\", packageName, version: active?.version ?? manifest.version}\n }\n\n const identity: InstallableReleaseIdentity = {\n source: \"url\",\n sourceUrl: target.url,\n bundleSha256: manifest.bundle.sha256,\n ...(served.challenge ? {private: true} : {}),\n }\n if (!deps.allowsRelease(packageName, manifest.version, identity, options.source)) {\n throw new InstallMiniappError(\n \"access_denied\",\n `This deployment doesn't allow installing ${packageName} from a URL`,\n )\n }\n\n if (options.confirm) {\n await askToInstall(deps, options.confirm, preview, assertCurrent)\n assertCurrent()\n }\n\n const policy = assertCompatible(deps, manifest)\n\n const headless = !options.confirm\n try {\n await deps.install(served.bundleUrl, {\n expectedPackageName: packageName,\n expectedVersion: manifest.version,\n expectedBundleSha256: manifest.bundle.sha256,\n ...(policy ? {compatibilityPolicy: policy} : {}),\n releaseIdentity: identity,\n // The installer reads the identity after the download, so a ZIP whose server alone asked for sign-in is\n // recorded as private too.\n downloadBundle: (bundleUrl) =>\n deps.fetchBundle(bundleUrl, {\n packageName,\n sha256: manifest.bundle.sha256,\n onChallenge: () => {\n identity.private = true\n },\n }),\n installReason: options.assignment ? \"assignment\" : \"explicit\",\n ...(options.assignment ? {assignment: options.assignment} : {}),\n isCancelled: cancelled,\n // A headless install never closes a running miniapp: its update waits, or asks.\n ...(headless ? {onlyIfStopped: true, askIfRunning: true, firstInstall: true} : {}),\n ...(headless && options.onAsking ? {onAsking: options.onAsking} : {}),\n })\n } catch (error) {\n if (error instanceof MiniappRunningError) {\n return {status: \"deferred\", packageName, version: active?.version ?? manifest.version}\n }\n if (error instanceof MiniappInstallCancelledError || cancelled()) {\n throw new InstallMiniappError(\"cancelled\", `The install of ${packageName} was cancelled`, {cause: error})\n }\n // Another install of a newer release committed first.\n if (isNewerInstalled(error)) {\n return {status: \"opened\", packageName, version: deps.activeRelease(packageName)?.version ?? manifest.version}\n }\n throw installError(error, packageName)\n }\n\n await deps\n .keepVersions(packageName, [manifest.version, ...(active ? [active.version] : [])])\n .catch((error) => deps.warn(`Could not remove older releases of ${packageName}`, error))\n return {status: \"installed\", packageName, version: manifest.version}\n }\n}\n\n/**\n * A miniapp at a local-network address: a development build of the name it serves. Only the person installs one\n * (never Fleet or a system miniapp), and nothing registers it or checks its name against a domain. It installs beside\n * any release of that name, which it stands in for until that release is installed again or the package is\n * uninstalled; the signing rule still applies.\n */\nasync function installFromLocalNetwork(\n deps: InstallMiniappDependencies,\n target: {url: string; host: string},\n options: InstallMiniappOptions,\n cancelled: () => boolean,\n assertCurrent: () => void,\n): Promise<InstallMiniappResult> {\n if (options.source === \"assignment\" || options.source === \"system\") {\n throw new InstallMiniappError(\n \"not_a_miniapp\",\n `${target.url} is on the local network, which only the person's own link, scan or paste installs from`,\n )\n }\n const served = await readServedManifest(deps, target.url, true)\n assertCurrent()\n const {manifest} = served\n const packageName = manifest.packageName\n options.onResolved?.(packageName, deps.activeRelease(packageName)?.version ?? null, manifest.version)\n if (!deps.developmentAllowed(packageName)) {\n throw new InstallMiniappError(\n \"access_denied\",\n `This deployment doesn't allow local-network builds of ${packageName}`,\n )\n }\n\n if (options.confirm) {\n await askToInstall(\n deps,\n options.confirm,\n {\n url: target.url,\n host: target.host,\n local: true,\n packageName,\n name: manifest.name,\n iconUrl: served.iconUrl,\n ageRating: manifest.ageRating ?? null,\n private: false,\n alreadyInstalled: deps.activeRelease(packageName) !== null || deps.hasDevelopmentSelection(packageName),\n missingHardware: deps.missingHardware(manifest.hardwareRequirements),\n },\n assertCurrent,\n )\n assertCurrent()\n }\n\n const policy = assertCompatible(deps, manifest)\n const server = developmentServer(manifest, target.url, served.iconUrl)\n try {\n await deps.installLocal(served.bundleUrl, {\n packageName,\n version: manifest.version,\n sourceUrl: target.url,\n sha256: manifest.bundle.sha256,\n ...(server ? {server} : {}),\n ...(policy ? {compatibilityPolicy: policy} : {}),\n downloadBundle: (bundleUrl) =>\n deps.fetchBundle(bundleUrl, {packageName, sha256: manifest.bundle.sha256, onChallenge: () => {}, local: true}),\n isCancelled: cancelled,\n })\n } catch (error) {\n if (error instanceof MiniappInstallCancelledError || cancelled()) {\n throw new InstallMiniappError(\"cancelled\", `The install of ${packageName} was cancelled`, {cause: error})\n }\n throw installError(error, packageName)\n }\n return {status: \"installed\", packageName, version: manifest.version}\n}\n\n/**\n * Ask the person to install: first the age gate, so nobody is offered a miniapp they're too young for, then the install\n * sheet. A headless install meets the age gate when the miniapp first opens (`MiniappLauncher`).\n */\nasync function askToInstall(\n deps: InstallMiniappDependencies,\n confirm: (preview: MiniappInstallPreview) => Promise<boolean>,\n preview: MiniappInstallPreview,\n assertCurrent: () => void,\n): Promise<void> {\n const {packageName, name, ageRating} = preview\n const verdict = await deps.checkAge({packageName, name, ageRating})\n assertCurrent()\n if (verdict === \"cancelled\") {\n throw new InstallMiniappError(\"cancelled\", `The age question for ${packageName} was closed`)\n }\n if (verdict !== \"allowed\") {\n throw new InstallMiniappError(\"age_restricted\", `${packageName} is rated ${String(ageRating)} (${verdict})`)\n }\n await confirmInstall(confirm, preview)\n}\n\n/** Show the install sheet. A sheet that fails, or that the person declines, cancels the install. */\nasync function confirmInstall(\n confirm: (preview: MiniappInstallPreview) => Promise<boolean>,\n preview: MiniappInstallPreview,\n): Promise<void> {\n let accepted: boolean\n try {\n accepted = await confirm(preview)\n } catch (error) {\n throw new InstallMiniappError(\"cancelled\", `The install sheet for ${preview.packageName} failed`, {cause: error})\n }\n if (!accepted) throw new InstallMiniappError(\"cancelled\", `The install of ${preview.packageName} was declined`)\n}\n\n/** The phone's compatibility policy, once the manifest is known to pass it; null when none. */\nfunction assertCompatible(\n deps: InstallMiniappDependencies,\n manifest: ServedMiniappManifest,\n): MiniappVersionPolicy | null {\n const policy = deps.compatibilityPolicy()\n if (!policy) return null\n const compatibility = checkMiniappRunsOnPhone(manifest, policy)\n if (!compatibility.compatible) {\n throw new InstallMiniappError(\n \"needs_newer_app\",\n `${manifest.name} can't run on this phone: ${compatibility.reason}`,\n )\n }\n return policy\n}\n\n/**\n * The development server a local-network build's `miniapp.json` names in `development` (as `mentra dev` serves it):\n * the build then loads live from its URL, and the server reloads it over `development.reload`, on the same host.\n * Read for local-network URLs only. Undefined when it names none: the installed snapshot is the build.\n */\nfunction developmentServer(\n manifest: ServedMiniappManifest,\n url: string,\n iconUrl: string | null,\n): LocalBuildServer | undefined {\n const raw = manifest as ServedMiniappManifest & Record<string, unknown>\n const development = raw.development\n if (!development || typeof development !== \"object\" || Array.isArray(development)) return undefined\n const {reload, mdns} = development as {reload?: unknown; mdns?: unknown}\n let devPort: number | undefined\n if (typeof reload === \"string\") {\n try {\n const parsed = new URL(reload)\n const port = Number(parsed.port)\n if ((parsed.protocol === \"ws:\" || parsed.protocol === \"wss:\") && Number.isInteger(port) && port > 0) {\n devPort = port\n }\n } catch {\n // No reload channel: the build runs live without hot reload.\n }\n }\n // A `.local` name the phone may reach the same server by after its address changes.\n const mdnsHost =\n typeof mdns === \"string\" && /\\.local$/i.test(mdns.trim()) && isLocalNetworkHost(mdns.trim()) ? mdns.trim() : \"\"\n const devUrl = url.replace(/\\/+$/, \"\")\n return {\n name: manifest.name,\n iconUrl: iconUrl ?? `${devUrl}/icon.png`,\n devUrl,\n ...(devPort ? {devPort} : {}),\n mdnsHost,\n ...(typeof raw.type === \"string\" ? {type: raw.type as LocalBuildServer[\"type\"]} : {}),\n ...(Array.isArray(raw.permissions) ? {permissions: raw.permissions as LocalBuildServer[\"permissions\"]} : {}),\n ...(Array.isArray(raw.hardwareRequirements)\n ? {hardwareRequirements: raw.hardwareRequirements as LocalBuildServer[\"hardwareRequirements\"]}\n : {}),\n ...(Array.isArray(raw.actions) ? {actions: raw.actions as LocalBuildServer[\"actions\"]} : {}),\n }\n}\n\ninterface ServedRelease {\n manifest: ServedMiniappManifest\n /** Where `miniapp.json` was served from, after redirects. */\n url: string\n bundleUrl: string\n iconUrl: string | null\n /** The sign-in challenge its server answered with. */\n challenge?: {packageName: string}\n}\n\n/**\n * `<url>/miniapp.json`: fetched, valid, and naming a ZIP over HTTPS (or, from a local-network address, over HTTP on the\n * local network too).\n */\nasync function readServedManifest(\n deps: InstallMiniappDependencies,\n url: string,\n local: boolean,\n): Promise<ServedRelease> {\n const manifestUrl = new URL(\"miniapp.json\", url).href\n let response: MiniappJsonResult\n try {\n response = await deps.fetchManifest(manifestUrl, {local})\n } catch (error) {\n if (error instanceof MiniappFetchError) {\n switch (error.code) {\n case \"challenge_domain\":\n throw new InstallMiniappError(\"domain_mismatch\", error.message, {cause: error})\n case \"challenge_package\":\n case \"too_large\":\n throw new InstallMiniappError(\"not_a_miniapp\", error.message, {cause: error})\n default:\n throw new InstallMiniappError(\"network\", error.message, {cause: error})\n }\n }\n throw new InstallMiniappError(\"network\", `Could not fetch ${manifestUrl}`, {cause: error})\n }\n const {status} = response\n if (status === 401 || status === 403) {\n throw new InstallMiniappError(\"access_denied\", `${manifestUrl} answered ${status}`)\n }\n if (status === 404) throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} answered 404`)\n if (status === 410) throw new InstallMiniappError(\"archived\", `${manifestUrl} answered 410`)\n if (status < 200 || status >= 300 || response.body === undefined) {\n throw new InstallMiniappError(\"network\", `${manifestUrl} answered ${status}`)\n }\n // Nothing checks a local build's name against a domain, so it must come from the local network.\n if (local && !isLocalNetworkUrl(response.url)) {\n throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} redirected off the local network`)\n }\n let raw: unknown\n try {\n raw = JSON.parse(response.body)\n } catch {\n throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} is not JSON`)\n }\n const parsed = ServedMiniappManifestSchema.safeParse(raw)\n if (!parsed.success) throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} is not a valid miniapp.json`)\n const manifest = parsed.data\n const bundleUrl = servedFileUrl(manifest.bundle.url, response.url, local)\n if (!bundleUrl) throw new InstallMiniappError(\"not_a_miniapp\", `${manifestUrl} names no bundle it may serve`)\n return {\n manifest,\n url: response.url,\n bundleUrl,\n iconUrl: manifest.icon ? servedFileUrl(manifest.icon, response.url, local) : null,\n ...(response.challenge ? {challenge: response.challenge} : {}),\n }\n}\n\n/**\n * A path relative to where `miniapp.json` was served from, or an absolute URL: HTTPS, or for a local-network build,\n * HTTP on the local network too.\n */\nfunction servedFileUrl(path: string, base: string, local: boolean): string | null {\n try {\n const resolved = new URL(path.trim(), base)\n if (resolved.protocol === \"https:\") return resolved.href\n return local && resolved.protocol === \"http:\" && isLocalNetworkUrl(resolved.href) ? resolved.href : null\n } catch {\n return null\n }\n}\n\nfunction isLocalNetworkUrl(url: string): boolean {\n try {\n return isLocalNetworkHost(new URL(url).hostname)\n } catch {\n return false\n }\n}\n\nconst REGISTRY_RESULTS = new Set([\"accepted\", \"accepted_unverified\", \"not_a_miniapp\", \"archived\"])\n\n/** Register the URL. Only Core's own answer can stop the install; without one, it goes on. */\nasync function register(deps: InstallMiniappDependencies, url: string, manifest: ServedMiniappManifest): Promise<void> {\n let answer: RegistryRegisterResponse\n try {\n answer = await deps.register({\n url,\n reported: {\n packageName: manifest.packageName,\n name: manifest.name,\n version: manifest.version,\n ...(manifest.ageRating ? {ageRating: manifest.ageRating} : {}),\n },\n })\n } catch (error) {\n deps.warn(`Could not register ${url}; installing it as only this phone can reach it`, error)\n return\n }\n if (!answer || typeof answer !== \"object\" || !REGISTRY_RESULTS.has(answer.result)) {\n deps.warn(`The registry's answer for ${url} is not usable; installing it as only this phone can reach it`)\n return\n }\n if (answer.result === \"archived\") throw new InstallMiniappError(\"archived\", `${url} is archived`)\n if (answer.result === \"not_a_miniapp\") {\n if (answer.reason === \"domain_mismatch\") {\n throw new InstallMiniappError(\"domain_mismatch\", `Core found ${url} can't serve ${manifest.packageName}`)\n }\n throw new InstallMiniappError(\"not_a_miniapp\", `Core found ${url} is not a miniapp (${String(answer.reason)})`)\n }\n}\n\n/** The version rule refused the release because a newer one is installed (`assertMiniappUpdateVersion`). */\nfunction isNewerInstalled(error: unknown): boolean {\n return error instanceof Error && /^Cannot install .+: version .+ is already installed$/.test(error.message)\n}\n\n/** Map an installer or download failure to its code. Never the error text. */\nfunction installError(error: unknown, packageName: string): InstallMiniappError {\n const message = error instanceof Error ? error.message : String(error)\n const fail = (code: InstallMiniappErrorCode) =>\n new InstallMiniappError(code, `${packageName} did not install: ${message}`, {cause: error})\n if (error instanceof MiniappFetchError) {\n switch (error.code) {\n case \"integrity\":\n return fail(\"integrity\")\n case \"challenge_domain\":\n return fail(\"domain_mismatch\")\n case \"challenge_package\":\n case \"too_large\":\n return fail(\"not_a_miniapp\")\n case \"http\":\n return fail(error.status === 401 || error.status === 403 ? \"access_denied\" : \"network\")\n default:\n return fail(\"network\")\n }\n }\n if (/SHA-256 mismatch|bundle (package|version) mismatch/i.test(message)) return fail(\"integrity\")\n if (/does not allow miniapp development/i.test(message)) return fail(\"access_denied\")\n if (/signature|signer|unsigned bundle|publisher/i.test(message)) return fail(\"signature_invalid\")\n if (\n /Requires Mentra App|Built for SDK|Invalid minimum Mentra App version|Invalid Mentra Miniapp SDK version/i.test(\n message,\n )\n )\n return fail(\"needs_newer_app\")\n if (/^bundle |miniapp\\.json|UNZIP_FAILED|READ_MANIFEST_FAILED|invalid miniapp version/i.test(message)) {\n return fail(\"not_a_miniapp\")\n }\n return fail(\"network\")\n}\n\n/** A miniapp URL at a local-network address: it installs as a local build (see the module comment). */\nexport function isLocalNetworkMiniappUrl(url: string): boolean {\n return normalizeMiniappUrl(url)?.kind === \"local\"\n}\n\n// ---- The engine's installer -----------------------------------------------------------------------------------\n\nconst engineDependencies: InstallMiniappDependencies = {\n fetchManifest: (url, {local}) => fetchMiniappJson(url, local ? {} : {packageForChallenge: true}),\n fetchBundle: (url, {packageName, sha256, onChallenge, local}) =>\n fetchMiniappBundle(url, {packageName, sha256, onChallenge, ...(local ? {answerChallenge: false} : {})}),\n requireRegistry: () => getConfigValues().requireRegistry !== false,\n register: (request) => cloudClientService.core.registry.register(request),\n activeRelease: (packageName) => {\n const version = appRegistry.getActiveReleaseVersion(packageName)\n return version ? {version, identity: appRegistry.getReleaseIdentity(packageName, version)} : null\n },\n hasDevelopmentSelection: (packageName) => appRegistry.hasDevelopmentSelection(packageName),\n developmentAllowed: (packageName) => isDevMiniappAllowed(packageName),\n updateUrl: (packageName, identity) =>\n miniappUpdateUrl(packageName, identity, {\n isSystemPackage: isSystemMiniappPackage,\n firstPartyUrl: (name) => firstPartyMiniappUrl(getConfigValues(), name),\n }),\n assertCanInstallVersion: (packageName, version) => appRegistry.assertCanInstallVersion(packageName, version),\n // A Fleet assignment is its workspace's administration, which the deployment's policy weighs apart from development.\n allowsRelease: (packageName, version, identity, source) =>\n isInstalledMiniappAllowed(packageName, version, identity, {assigned: source === \"assignment\"}),\n checkAge: (miniapp) => checkMiniappAge(miniapp, {interactive: true}),\n compatibilityPolicy: () => {\n const policy = localMiniappRuntime.currentInstallCompatibilityPolicy()\n return policy ? {hostVersion: policy.hostVersion, supportedSdkRange: policy.supportedSdkRange} : null\n },\n missingHardware: (hardwareRequirements) => {\n const capabilities = localMiniappRuntime.currentInstallCompatibilityPolicy()?.hardwareCapabilities\n return capabilities ? missingRequiredHardware(hardwareRequirements, capabilities) : []\n },\n install: (bundleUrl, options) => installMiniappRelease(bundleUrl, options),\n installLocal: (bundleUrl, install) => installLocalBuild(bundleUrl, install),\n restoreRelease: (packageName, isCancelled) => restoreInstalledRelease(packageName, {isCancelled}),\n keepVersions: (packageName, versions) => appRegistry.gcReleaseVersions(packageName, versions),\n installSession: () => localMiniappRuntime.installSession(),\n warn: (message, error) => console.warn(`installMiniapp: ${message}`, error ?? \"\"),\n}\n\nlet engineInstaller: ((url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult>) | null = null\n\n/** Fleet's install reason for an install that stopped (Phase 12): `assignment_outcome`'s reasons where they apply. */\nconst FLEET_INSTALL_REASON: Record<InstallMiniappErrorCode, FleetInstallFailureReason> = {\n not_a_miniapp: \"not_a_miniapp\",\n domain_mismatch: \"not_a_miniapp\",\n archived: \"archived\",\n needs_newer_app: \"incompatible_host\",\n access_denied: \"access_denied\",\n age_restricted: \"access_denied\",\n network: \"network\",\n cancelled: \"user_cancelled\",\n integrity: \"download_failed\",\n signature_invalid: \"signature_invalid\",\n}\n\n/**\n * Install the miniapp at a miniapp URL (see the module comment). Throws {@link InstallMiniappError}.\n *\n * Every attempt whose package the installer resolved is reported to Fleet (`miniapp_install`): an update when it\n * replaces an installed release, an install otherwise; installed, deferred, or failed with its reason. One the person\n * declined is deferred, not failed. An attempt that stopped before its package was known (an unreachable URL) cannot be\n * attributed, and is not reported.\n */\nexport function installMiniapp(url: string, options: InstallMiniappOptions): Promise<InstallMiniappResult> {\n engineInstaller ??= withFleetReport(createMiniappInstaller(engineDependencies))\n return engineInstaller(url, options)\n}\n\n/** `installer`, reporting each attempt to Fleet as `installMiniapp` describes. Exported for tests. */\nexport function withFleetReport(\n installer: (url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult>,\n): (url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult> {\n return (url, options) => reportAttempt(installer, url, options)\n}\n\nasync function reportAttempt(\n installer: (url: string, options: InstallMiniappOptions) => Promise<InstallMiniappResult>,\n url: string,\n options: InstallMiniappOptions,\n): Promise<InstallMiniappResult> {\n const source = options.source === \"assignment\" ? \"assignment\" : options.source === \"local\" ? \"local\" : \"url\"\n // What the installer resolved: the package and the release it replaces, for an update and for a failure.\n type Attempt = {packageName: string; previousVersion: string | null; version: string}\n let attempt: Attempt | null = null\n const resolved: InstallMiniappOptions = {\n ...options,\n onResolved: (packageName, previousVersion, version) => {\n attempt = {packageName, previousVersion, version}\n options.onResolved?.(packageName, previousVersion, version)\n },\n }\n // Every report names the version the attempt was installing, whatever is installed when it is made.\n const report = (fields: Pick<FleetInstallEvent, \"outcome\" | \"reason\">) => {\n const known = attempt as Attempt | null\n if (known === null) return\n fleetEvents.install({\n packageName: known.packageName,\n operation: known.previousVersion ? \"update\" : \"install\",\n source,\n ...(known.previousVersion ? {fromVersion: known.previousVersion} : {}),\n toVersion: known.version,\n ...fields,\n } as FleetInstallEvent)\n }\n try {\n const result = await installer(url, resolved)\n if (result.status === \"installed\") report({outcome: \"succeeded\"})\n else if (result.status === \"deferred\") report({outcome: \"deferred\", reason: \"unknown\"})\n return result\n } catch (error) {\n const reason = error instanceof InstallMiniappError ? FLEET_INSTALL_REASON[error.code] : \"unknown\"\n report({outcome: reason === \"user_cancelled\" ? \"deferred\" : \"failed\", reason})\n throw error\n }\n}\n"]}
|
|
@@ -257,7 +257,7 @@ export function classifyManagedInstallError(error) {
|
|
|
257
257
|
}
|
|
258
258
|
/** Uninstall a withdrawn miniapp. Its data stays in its partition for a later reinstall. */
|
|
259
259
|
export async function uninstallManagedMiniapp(packageName) {
|
|
260
|
-
const result = await useAppStatusStore.getState().uninstall(packageName);
|
|
260
|
+
const result = await useAppStatusStore.getState().uninstall(packageName, undefined, { fleetSource: "assignment" });
|
|
261
261
|
if (result.is_error())
|
|
262
262
|
throw result.error;
|
|
263
263
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"miniappReleaseInstall.js","sourceRoot":"","sources":["../../src/services/miniappReleaseInstall.ts"],"names":[],"mappings":"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","sourcesContent":["import type {FleetAssignmentReason} from \"@mentra/cloud-protocol\"\nimport {useAppStatusStore} from \"../stores/apps\"\nimport {invalidateDevSnapshotRequests} from \"../utils/devSnapshotRequests\"\nimport {installWithRuntimeReload, MiniappRunningError} from \"../utils/storeInstallRuntime\"\nimport appRegistry, {\n type InstallBundleOptions,\n type LocalZipInstallOptions,\n type MiniappInstallReason,\n} from \"./AppRegistry\"\nimport {markMiniappUpdateDeferred} from \"./deferredMiniappUpdates\"\nimport {miniappLauncher} from \"./MiniappLauncher\"\nimport {\n canShowRunningUpdatePrompt,\n emitRunningUpdateFailed,\n forgetRunningUpdateDecline,\n requestRunningUpdatePrompt,\n} from \"./runningUpdatePrompt\"\n\n/**\n * A release archive: a URL the installer downloads, or a ZIP its caller already\n * downloaded and verified (a workspace's managed release).\n */\nexport type MiniappReleaseArchive =\n | string\n | ({localZipPath: string} & Pick<LocalZipInstallOptions, \"adoptIdenticalInstalledVersion\">)\n\ntype ArchiveInstaller = (options: InstallBundleOptions) => Promise<void>\n\nfunction archiveInstaller(archive: MiniappReleaseArchive): ArchiveInstaller {\n return async (options) => {\n const result =\n typeof archive === \"string\"\n ? await appRegistry.installFromUrl(archive, options)\n : await appRegistry.installFromLocalZip(archive.localZipPath, {\n ...options,\n ...(archive.adoptIdenticalInstalledVersion !== undefined\n ? {adoptIdenticalInstalledVersion: archive.adoptIdenticalInstalledVersion}\n : {}),\n })\n if (result.is_error()) throw result.error\n }\n}\n\nexport interface ReleaseInstallOptions extends InstallBundleOptions {\n expectedPackageName: string\n expectedVersion: string\n /**\n * An automatic update: replace only an installed miniapp and never stop a\n * running one. It shows nothing: no updating state, and opens are not\n * refused. A running or starting miniapp defers it with\n * {@link MiniappRunningError}; it resumes when the miniapp stops.\n */\n onlyIfStopped?: boolean\n /**\n * With `onlyIfStopped`: when the miniapp is running, stage the release and\n * ask whether to update now. Only for a miniapp a person just opened.\n * Declined or unshown prompts defer.\n */\n askIfRunning?: boolean\n /**\n * True once the session that requested the install has ended (sign-out or a\n * deployment switch). The release is then never activated, no prompt is\n * shown, and nothing restarts into the ended session.\n */\n isCancelled?: () => boolean\n /** With `askIfRunning`: called when the staged release waits for the person's answer to its update prompt. */\n onAsking?: () => void\n /**\n * With `onlyIfStopped`: a package that is not installed may be installed\n * (a managed first install). It is silent: no updating state, no prompt.\n * Launches still wait while its files activate. An installed package\n * updates as usual.\n */\n firstInstall?: boolean\n}\n\n/** The session that requested an install ended before the release activated. */\nexport class MiniappInstallCancelledError extends Error {\n constructor(packageName: string) {\n super(`The update of ${packageName} was cancelled because its session ended`)\n this.name = \"MiniappInstallCancelledError\"\n }\n}\n\n/**\n * Shared release installation for QR, URL and workspace callers. The caller\n * authorizes the source; the archive goes through the one AppRegistry installer, which\n * binds it to the expected package and version and applies the signer and\n * version rules again inside its serialized transaction.\n *\n * - Explicit installs stop a running miniapp, install, and restart it; its\n * launches wait until the install commits or rolls back.\n * - Automatic updates of an idle miniapp are silent: nothing shows it as\n * updating, and launches wait only while its files change. A launch before\n * then wins, and the update waits for the miniapp to stop.\n * - Automatic updates of a running miniapp with `askIfRunning` download,\n * verify and unpack first, then ask; on Update the miniapp closes, the\n * release commits, and the miniapp restarts silently (not at all when the\n * glasses it needs are not connected).\n * - A managed first install (`firstInstall`) of a package that is not\n * installed shows nothing and holds launches only while its files change.\n */\nexport async function installMiniappRelease(\n archive: MiniappReleaseArchive,\n options: ReleaseInstallOptions,\n): Promise<void> {\n const {onlyIfStopped, askIfRunning, isCancelled, onAsking, firstInstall, ...requestedOptions} = options\n const packageName = options.expectedPackageName\n const install = archiveInstaller(archive)\n const assertCurrent = () => {\n if (isCancelled?.()) throw new MiniappInstallCancelledError(packageName)\n }\n // An explicit install is the user's choice; an automatic update changes no reason.\n const installReason =\n requestedOptions.installReason ?? (onlyIfStopped ? undefined : explicitInstallReason(requestedOptions))\n const reasonOptions: InstallBundleOptions = installReason ? {...requestedOptions, installReason} : requestedOptions\n // Only the activation hook is wrapped: a `whenStaged` hook moves unpacking\n // out of the serialized install queue, so it is never added here.\n const installOptions: InstallBundleOptions = isCancelled\n ? {\n ...reasonOptions,\n beforeActivate: () => {\n assertCurrent()\n reasonOptions.beforeActivate?.()\n },\n }\n : reasonOptions\n assertCurrent()\n // An early check avoids stopping or reserving an app for a known downgrade.\n // AppRegistry checks again in its serialized filesystem transaction.\n appRegistry.assertCanInstallVersion(packageName, options.expectedVersion)\n\n if (!onlyIfStopped) {\n await useAppStatusStore.getState().runUpdate(packageName, () =>\n installWithRuntimeReload(miniappLauncher, packageName, async () => {\n // A dev probe or snapshot started before this release must not\n // reactivate development code after it commits.\n invalidateDevSnapshotRequests(packageName)\n await install(installOptions)\n }),\n )\n await useAppStatusStore.getState().refresh()\n return\n }\n\n const installsFirst = firstInstall === true && appRegistry.getInstalledVersions(packageName).length === 0\n if (!installsFirst) assertStillInstalled(packageName)\n try {\n if (installsFirst) {\n await installFirstWhenIdle(install, installOptions, packageName)\n } else if (askIfRunning && miniappLauncher.isProjectedRunning(packageName)) {\n await installRunningUpdate(install, installOptions, packageName, options.expectedVersion, isCancelled, onAsking)\n } else {\n await installIdleUpdate(install, installOptions, packageName)\n }\n } catch (error) {\n if (error instanceof MiniappRunningError) markMiniappUpdateDeferred(packageName)\n throw error\n }\n // The update the person put off has installed: a later one asks afresh.\n forgetRunningUpdateDecline(packageName)\n await useAppStatusStore.getState().refresh()\n}\n\n/** Automatic updates replace an installed miniapp; they never bring back one the user removed. */\nfunction assertStillInstalled(packageName: string): void {\n if (appRegistry.getInstalledVersions(packageName).length === 0) {\n throw new Error(`${packageName} is no longer installed`)\n }\n}\n\nfunction explicitInstallReason(options: InstallBundleOptions): Exclude<MiniappInstallReason, \"assignment\"> {\n switch (options.releaseIdentity?.source) {\n case \"bundled_asset\":\n return \"bundled\"\n case \"deployment_manifest\":\n return \"manifest\"\n default:\n return \"explicit\"\n }\n}\n\n/** A managed first install shows nothing: no updating state and no prompt. A launch waits only while it activates. */\nfunction installFirstWhenIdle(\n install: ArchiveInstaller,\n options: InstallBundleOptions,\n packageName: string,\n): Promise<void> {\n return miniappLauncher.installWhenIdle(packageName, (reserveActivation) =>\n install({\n ...options,\n beforeActivate: () => {\n options.beforeActivate?.()\n reserveActivation()\n },\n }),\n )\n}\n\n/**\n * A background update shows nothing. Uninstall is serialized with the\n * installer, and the launcher holds launches only while files change.\n */\nfunction installIdleUpdate(\n install: ArchiveInstaller,\n options: InstallBundleOptions,\n packageName: string,\n): Promise<void> {\n return miniappLauncher.installWhenIdle(packageName, (reserveActivation) =>\n install({\n ...options,\n beforeActivate: () => {\n options.beforeActivate?.()\n assertStillInstalled(packageName)\n reserveActivation()\n },\n }),\n )\n}\n\nasync function installRunningUpdate(\n install: ArchiveInstaller,\n options: InstallBundleOptions,\n packageName: string,\n version: string,\n isCancelled: (() => boolean) | undefined,\n onAsking: (() => void) | undefined,\n): Promise<void> {\n const assertCurrent = () => {\n if (isCancelled?.()) throw new MiniappInstallCancelledError(packageName)\n }\n // Do not download a release the user would not be asked about.\n if (!canShowRunningUpdatePrompt(packageName)) throw new MiniappRunningError(packageName)\n const displayName =\n useAppStatusStore.getState().apps.find((app) => app.packageName === packageName)?.name ?? packageName\n const installedVersion = (await appRegistry.getActiveVersion(packageName)) ?? \"\"\n\n let accepted = false\n let committed = false\n let endUpdate: (() => void) | undefined\n let resumeLaunches: (() => void) | undefined\n let stopped: {reopen: boolean} | undefined\n let failure: unknown\n try {\n await install({\n ...options,\n whenStaged: async () => {\n assertCurrent()\n await options.whenStaged?.()\n // The download, signer, version and compatibility checks have passed\n // and the files are unpacked; nothing is reserved yet. If the user\n // closed the miniapp meanwhile, it updates like an idle one.\n if (miniappLauncher.isRunning(packageName)) {\n if (canShowRunningUpdatePrompt(packageName)) onAsking?.()\n const answer = await requestRunningUpdatePrompt({packageName, displayName, version})\n if (answer !== \"update\") throw new MiniappRunningError(packageName)\n assertCurrent()\n accepted = true\n }\n endUpdate = useAppStatusStore.getState().beginUpdate(packageName)\n resumeLaunches = await miniappLauncher.pauseLaunches(packageName)\n if (miniappLauncher.isRunning(packageName)) {\n // Started again without the user's consent to close it: defer.\n if (!accepted) throw new MiniappRunningError(packageName)\n const state = useAppStatusStore.getState()\n stopped = {reopen: state.foregroundedPackage === packageName}\n if (stopped.reopen) state.clearForeground()\n await state.stop(packageName)\n if (miniappLauncher.isRunning(packageName)) await miniappLauncher.stop(packageName)\n }\n },\n beforeActivate: () => {\n options.beforeActivate?.()\n assertStillInstalled(packageName)\n if (miniappLauncher.isRunning(packageName)) throw new Error(`${packageName} did not stop for its update`)\n },\n })\n committed = true\n } catch (error) {\n failure = error\n } finally {\n resumeLaunches?.()\n endUpdate?.()\n }\n\n // Reopen what the user had: the new release after a commit, otherwise the\n // version that is still installed. Nothing restarts into an ended session.\n // The restart is automatic: refused silently when its glasses aren't connected.\n const cancelled = isCancelled?.() === true\n if (stopped && !cancelled) await restartAfterUpdate(packageName, stopped.reopen)\n if (!committed && accepted && !cancelled) emitRunningUpdateFailed({packageName, displayName, installedVersion})\n if (!committed) throw failure\n}\n\nasync function restartAfterUpdate(packageName: string, reopen: boolean): Promise<void> {\n try {\n await useAppStatusStore.getState().refresh()\n const app = useAppStatusStore.getState().apps.find((candidate) => candidate.packageName === packageName)\n if (!app) return\n const started = await useAppStatusStore.getState().start(app, {skipNavigation: true, trigger: \"automatic\"})\n if (started && reopen) await useAppStatusStore.getState().setForeground(packageName)\n } catch (error) {\n // A launch error is reported by the runtime; it does not undo a committed release.\n console.warn(`Miniapp ${packageName} could not restart after its update`, error)\n }\n}\n\n// ---- Managed (Fleet) installs -----------------------------------------------------------------------------------\n\n/** Why a managed install did not commit: an assignment reason, or it waits (`running`) or was superseded. */\nexport type ManagedInstallFailure = FleetAssignmentReason | \"running\" | \"cancelled\"\n\n/** Map an installer error to a stable reason. Never error text. */\nexport function classifyManagedInstallError(error: unknown): {kind: ManagedInstallFailure; retryable: boolean} {\n if (error instanceof MiniappRunningError) return {kind: \"running\", retryable: true}\n if (error instanceof MiniappInstallCancelledError) return {kind: \"cancelled\", retryable: true}\n const message = error instanceof Error ? error.message : String(error)\n if (/ENOSPC|no space|not enough space|disk is full|storage (is )?full|quota/i.test(message))\n return {kind: \"storage_full\", retryable: true}\n if (/signature|signer|unsigned bundle|publisher/i.test(message)) return {kind: \"signature_invalid\", retryable: false}\n if (/is already installed/.test(message)) return {kind: \"newer_version_installed\", retryable: false}\n if (/Requires Mentra App|Built for SDK|Mentra App version|Miniapp SDK version|not compatible/i.test(message))\n return {kind: \"incompatible_host\", retryable: false}\n if (/bundle version mismatch|SHA-256 mismatch/i.test(message)) return {kind: \"download_failed\", retryable: true}\n if (\n /package mismatch|miniapp\\.json|UNZIP_FAILED|READ_MANIFEST_FAILED|invalid miniapp version|bundle (exceeds|must be|contains)/i.test(\n message,\n )\n )\n return {kind: \"not_a_miniapp\", retryable: false}\n return {kind: \"download_failed\", retryable: true}\n}\n\n/** Uninstall a withdrawn miniapp. Its data stays in its partition for a later reinstall. */\nexport async function uninstallManagedMiniapp(packageName: string): Promise<void> {\n const result = await useAppStatusStore.getState().uninstall(packageName)\n if (result.is_error()) throw result.error\n}\n\n/**\n * The miniapp's server stopped admitting this account: block its launch and stop its running code now, whatever\n * its reasons. Not deferred like an update. Nothing is uninstalled.\n */\nexport async function stopMiniappForRevocation(packageName: string): Promise<void> {\n appRegistry.revokeMiniappAccess(packageName)\n const state = useAppStatusStore.getState()\n if (state.foregroundedPackage === packageName) state.clearForeground()\n await state.stop(packageName)\n if (miniappLauncher.isRunning(packageName)) await miniappLauncher.stop(packageName)\n await useAppStatusStore.getState().refresh()\n}\n"]}
|
|
1
|
+
{"version":3,"file":"miniappReleaseInstall.js","sourceRoot":"","sources":["../../src/services/miniappReleaseInstall.ts"],"names":[],"mappings":"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","sourcesContent":["import type {FleetAssignmentReason} from \"@mentra/cloud-protocol\"\nimport {useAppStatusStore} from \"../stores/apps\"\nimport {invalidateDevSnapshotRequests} from \"../utils/devSnapshotRequests\"\nimport {installWithRuntimeReload, MiniappRunningError} from \"../utils/storeInstallRuntime\"\nimport appRegistry, {\n type InstallBundleOptions,\n type LocalZipInstallOptions,\n type MiniappInstallReason,\n} from \"./AppRegistry\"\nimport {markMiniappUpdateDeferred} from \"./deferredMiniappUpdates\"\nimport {miniappLauncher} from \"./MiniappLauncher\"\nimport {\n canShowRunningUpdatePrompt,\n emitRunningUpdateFailed,\n forgetRunningUpdateDecline,\n requestRunningUpdatePrompt,\n} from \"./runningUpdatePrompt\"\n\n/**\n * A release archive: a URL the installer downloads, or a ZIP its caller already\n * downloaded and verified (a workspace's managed release).\n */\nexport type MiniappReleaseArchive =\n | string\n | ({localZipPath: string} & Pick<LocalZipInstallOptions, \"adoptIdenticalInstalledVersion\">)\n\ntype ArchiveInstaller = (options: InstallBundleOptions) => Promise<void>\n\nfunction archiveInstaller(archive: MiniappReleaseArchive): ArchiveInstaller {\n return async (options) => {\n const result =\n typeof archive === \"string\"\n ? await appRegistry.installFromUrl(archive, options)\n : await appRegistry.installFromLocalZip(archive.localZipPath, {\n ...options,\n ...(archive.adoptIdenticalInstalledVersion !== undefined\n ? {adoptIdenticalInstalledVersion: archive.adoptIdenticalInstalledVersion}\n : {}),\n })\n if (result.is_error()) throw result.error\n }\n}\n\nexport interface ReleaseInstallOptions extends InstallBundleOptions {\n expectedPackageName: string\n expectedVersion: string\n /**\n * An automatic update: replace only an installed miniapp and never stop a\n * running one. It shows nothing: no updating state, and opens are not\n * refused. A running or starting miniapp defers it with\n * {@link MiniappRunningError}; it resumes when the miniapp stops.\n */\n onlyIfStopped?: boolean\n /**\n * With `onlyIfStopped`: when the miniapp is running, stage the release and\n * ask whether to update now. Only for a miniapp a person just opened.\n * Declined or unshown prompts defer.\n */\n askIfRunning?: boolean\n /**\n * True once the session that requested the install has ended (sign-out or a\n * deployment switch). The release is then never activated, no prompt is\n * shown, and nothing restarts into the ended session.\n */\n isCancelled?: () => boolean\n /** With `askIfRunning`: called when the staged release waits for the person's answer to its update prompt. */\n onAsking?: () => void\n /**\n * With `onlyIfStopped`: a package that is not installed may be installed\n * (a managed first install). It is silent: no updating state, no prompt.\n * Launches still wait while its files activate. An installed package\n * updates as usual.\n */\n firstInstall?: boolean\n}\n\n/** The session that requested an install ended before the release activated. */\nexport class MiniappInstallCancelledError extends Error {\n constructor(packageName: string) {\n super(`The update of ${packageName} was cancelled because its session ended`)\n this.name = \"MiniappInstallCancelledError\"\n }\n}\n\n/**\n * Shared release installation for QR, URL and workspace callers. The caller\n * authorizes the source; the archive goes through the one AppRegistry installer, which\n * binds it to the expected package and version and applies the signer and\n * version rules again inside its serialized transaction.\n *\n * - Explicit installs stop a running miniapp, install, and restart it; its\n * launches wait until the install commits or rolls back.\n * - Automatic updates of an idle miniapp are silent: nothing shows it as\n * updating, and launches wait only while its files change. A launch before\n * then wins, and the update waits for the miniapp to stop.\n * - Automatic updates of a running miniapp with `askIfRunning` download,\n * verify and unpack first, then ask; on Update the miniapp closes, the\n * release commits, and the miniapp restarts silently (not at all when the\n * glasses it needs are not connected).\n * - A managed first install (`firstInstall`) of a package that is not\n * installed shows nothing and holds launches only while its files change.\n */\nexport async function installMiniappRelease(\n archive: MiniappReleaseArchive,\n options: ReleaseInstallOptions,\n): Promise<void> {\n const {onlyIfStopped, askIfRunning, isCancelled, onAsking, firstInstall, ...requestedOptions} = options\n const packageName = options.expectedPackageName\n const install = archiveInstaller(archive)\n const assertCurrent = () => {\n if (isCancelled?.()) throw new MiniappInstallCancelledError(packageName)\n }\n // An explicit install is the user's choice; an automatic update changes no reason.\n const installReason =\n requestedOptions.installReason ?? (onlyIfStopped ? undefined : explicitInstallReason(requestedOptions))\n const reasonOptions: InstallBundleOptions = installReason ? {...requestedOptions, installReason} : requestedOptions\n // Only the activation hook is wrapped: a `whenStaged` hook moves unpacking\n // out of the serialized install queue, so it is never added here.\n const installOptions: InstallBundleOptions = isCancelled\n ? {\n ...reasonOptions,\n beforeActivate: () => {\n assertCurrent()\n reasonOptions.beforeActivate?.()\n },\n }\n : reasonOptions\n assertCurrent()\n // An early check avoids stopping or reserving an app for a known downgrade.\n // AppRegistry checks again in its serialized filesystem transaction.\n appRegistry.assertCanInstallVersion(packageName, options.expectedVersion)\n\n if (!onlyIfStopped) {\n await useAppStatusStore.getState().runUpdate(packageName, () =>\n installWithRuntimeReload(miniappLauncher, packageName, async () => {\n // A dev probe or snapshot started before this release must not\n // reactivate development code after it commits.\n invalidateDevSnapshotRequests(packageName)\n await install(installOptions)\n }),\n )\n await useAppStatusStore.getState().refresh()\n return\n }\n\n const installsFirst = firstInstall === true && appRegistry.getInstalledVersions(packageName).length === 0\n if (!installsFirst) assertStillInstalled(packageName)\n try {\n if (installsFirst) {\n await installFirstWhenIdle(install, installOptions, packageName)\n } else if (askIfRunning && miniappLauncher.isProjectedRunning(packageName)) {\n await installRunningUpdate(install, installOptions, packageName, options.expectedVersion, isCancelled, onAsking)\n } else {\n await installIdleUpdate(install, installOptions, packageName)\n }\n } catch (error) {\n if (error instanceof MiniappRunningError) markMiniappUpdateDeferred(packageName)\n throw error\n }\n // The update the person put off has installed: a later one asks afresh.\n forgetRunningUpdateDecline(packageName)\n await useAppStatusStore.getState().refresh()\n}\n\n/** Automatic updates replace an installed miniapp; they never bring back one the user removed. */\nfunction assertStillInstalled(packageName: string): void {\n if (appRegistry.getInstalledVersions(packageName).length === 0) {\n throw new Error(`${packageName} is no longer installed`)\n }\n}\n\nfunction explicitInstallReason(options: InstallBundleOptions): Exclude<MiniappInstallReason, \"assignment\"> {\n switch (options.releaseIdentity?.source) {\n case \"bundled_asset\":\n return \"bundled\"\n case \"deployment_manifest\":\n return \"manifest\"\n default:\n return \"explicit\"\n }\n}\n\n/** A managed first install shows nothing: no updating state and no prompt. A launch waits only while it activates. */\nfunction installFirstWhenIdle(\n install: ArchiveInstaller,\n options: InstallBundleOptions,\n packageName: string,\n): Promise<void> {\n return miniappLauncher.installWhenIdle(packageName, (reserveActivation) =>\n install({\n ...options,\n beforeActivate: () => {\n options.beforeActivate?.()\n reserveActivation()\n },\n }),\n )\n}\n\n/**\n * A background update shows nothing. Uninstall is serialized with the\n * installer, and the launcher holds launches only while files change.\n */\nfunction installIdleUpdate(\n install: ArchiveInstaller,\n options: InstallBundleOptions,\n packageName: string,\n): Promise<void> {\n return miniappLauncher.installWhenIdle(packageName, (reserveActivation) =>\n install({\n ...options,\n beforeActivate: () => {\n options.beforeActivate?.()\n assertStillInstalled(packageName)\n reserveActivation()\n },\n }),\n )\n}\n\nasync function installRunningUpdate(\n install: ArchiveInstaller,\n options: InstallBundleOptions,\n packageName: string,\n version: string,\n isCancelled: (() => boolean) | undefined,\n onAsking: (() => void) | undefined,\n): Promise<void> {\n const assertCurrent = () => {\n if (isCancelled?.()) throw new MiniappInstallCancelledError(packageName)\n }\n // Do not download a release the user would not be asked about.\n if (!canShowRunningUpdatePrompt(packageName)) throw new MiniappRunningError(packageName)\n const displayName =\n useAppStatusStore.getState().apps.find((app) => app.packageName === packageName)?.name ?? packageName\n const installedVersion = (await appRegistry.getActiveVersion(packageName)) ?? \"\"\n\n let accepted = false\n let committed = false\n let endUpdate: (() => void) | undefined\n let resumeLaunches: (() => void) | undefined\n let stopped: {reopen: boolean} | undefined\n let failure: unknown\n try {\n await install({\n ...options,\n whenStaged: async () => {\n assertCurrent()\n await options.whenStaged?.()\n // The download, signer, version and compatibility checks have passed\n // and the files are unpacked; nothing is reserved yet. If the user\n // closed the miniapp meanwhile, it updates like an idle one.\n if (miniappLauncher.isRunning(packageName)) {\n if (canShowRunningUpdatePrompt(packageName)) onAsking?.()\n const answer = await requestRunningUpdatePrompt({packageName, displayName, version})\n if (answer !== \"update\") throw new MiniappRunningError(packageName)\n assertCurrent()\n accepted = true\n }\n endUpdate = useAppStatusStore.getState().beginUpdate(packageName)\n resumeLaunches = await miniappLauncher.pauseLaunches(packageName)\n if (miniappLauncher.isRunning(packageName)) {\n // Started again without the user's consent to close it: defer.\n if (!accepted) throw new MiniappRunningError(packageName)\n const state = useAppStatusStore.getState()\n stopped = {reopen: state.foregroundedPackage === packageName}\n if (stopped.reopen) state.clearForeground()\n await state.stop(packageName)\n if (miniappLauncher.isRunning(packageName)) await miniappLauncher.stop(packageName)\n }\n },\n beforeActivate: () => {\n options.beforeActivate?.()\n assertStillInstalled(packageName)\n if (miniappLauncher.isRunning(packageName)) throw new Error(`${packageName} did not stop for its update`)\n },\n })\n committed = true\n } catch (error) {\n failure = error\n } finally {\n resumeLaunches?.()\n endUpdate?.()\n }\n\n // Reopen what the user had: the new release after a commit, otherwise the\n // version that is still installed. Nothing restarts into an ended session.\n // The restart is automatic: refused silently when its glasses aren't connected.\n const cancelled = isCancelled?.() === true\n if (stopped && !cancelled) await restartAfterUpdate(packageName, stopped.reopen)\n if (!committed && accepted && !cancelled) emitRunningUpdateFailed({packageName, displayName, installedVersion})\n if (!committed) throw failure\n}\n\nasync function restartAfterUpdate(packageName: string, reopen: boolean): Promise<void> {\n try {\n await useAppStatusStore.getState().refresh()\n const app = useAppStatusStore.getState().apps.find((candidate) => candidate.packageName === packageName)\n if (!app) return\n const started = await useAppStatusStore.getState().start(app, {skipNavigation: true, trigger: \"automatic\"})\n if (started && reopen) await useAppStatusStore.getState().setForeground(packageName)\n } catch (error) {\n // A launch error is reported by the runtime; it does not undo a committed release.\n console.warn(`Miniapp ${packageName} could not restart after its update`, error)\n }\n}\n\n// ---- Managed (Fleet) installs -----------------------------------------------------------------------------------\n\n/** Why a managed install did not commit: an assignment reason, or it waits (`running`) or was superseded. */\nexport type ManagedInstallFailure = FleetAssignmentReason | \"running\" | \"cancelled\"\n\n/** Map an installer error to a stable reason. Never error text. */\nexport function classifyManagedInstallError(error: unknown): {kind: ManagedInstallFailure; retryable: boolean} {\n if (error instanceof MiniappRunningError) return {kind: \"running\", retryable: true}\n if (error instanceof MiniappInstallCancelledError) return {kind: \"cancelled\", retryable: true}\n const message = error instanceof Error ? error.message : String(error)\n if (/ENOSPC|no space|not enough space|disk is full|storage (is )?full|quota/i.test(message))\n return {kind: \"storage_full\", retryable: true}\n if (/signature|signer|unsigned bundle|publisher/i.test(message)) return {kind: \"signature_invalid\", retryable: false}\n if (/is already installed/.test(message)) return {kind: \"newer_version_installed\", retryable: false}\n if (/Requires Mentra App|Built for SDK|Mentra App version|Miniapp SDK version|not compatible/i.test(message))\n return {kind: \"incompatible_host\", retryable: false}\n if (/bundle version mismatch|SHA-256 mismatch/i.test(message)) return {kind: \"download_failed\", retryable: true}\n if (\n /package mismatch|miniapp\\.json|UNZIP_FAILED|READ_MANIFEST_FAILED|invalid miniapp version|bundle (exceeds|must be|contains)/i.test(\n message,\n )\n )\n return {kind: \"not_a_miniapp\", retryable: false}\n return {kind: \"download_failed\", retryable: true}\n}\n\n/** Uninstall a withdrawn miniapp. Its data stays in its partition for a later reinstall. */\nexport async function uninstallManagedMiniapp(packageName: string): Promise<void> {\n const result = await useAppStatusStore.getState().uninstall(packageName, undefined, {fleetSource: \"assignment\"})\n if (result.is_error()) throw result.error\n}\n\n/**\n * The miniapp's server stopped admitting this account: block its launch and stop its running code now, whatever\n * its reasons. Not deferred like an update. Nothing is uninstalled.\n */\nexport async function stopMiniappForRevocation(packageName: string): Promise<void> {\n appRegistry.revokeMiniappAccess(packageName)\n const state = useAppStatusStore.getState()\n if (state.foregroundedPackage === packageName) state.clearForeground()\n await state.stop(packageName)\n if (miniappLauncher.isRunning(packageName)) await miniappLauncher.stop(packageName)\n await useAppStatusStore.getState().refresh()\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/stores/apps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAC,WAAW,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../src/stores/apps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAC,WAAW,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAA;AAI9D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAA;AAK9C,OAAoB,EAAC,KAAK,gBAAgB,EAAC,MAAM,yBAAyB,CAAA;AAmB1E,MAAM,WAAW,YAAY;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAA;IAC1C;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAA;IAChD;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAA;IAC/C,6GAA6G;IAC7G,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAA;IAC1C;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;CAChE;AAiBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAKzF;AAgBD,UAAU,cAAc;IACtB,IAAI,EAAE,SAAS,EAAE,CAAA;IACjB,oGAAoG;IACpG,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACrC;;;OAGG;IACH,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,IAAI,CAAA;IAChD,wDAAwD;IACxD,SAAS,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3E;;;;;;OAMG;IACH,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,oHAAoH;IACpH,KAAK,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChE,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACvC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAC,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACrF,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC1G,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/D,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAA;IACjD,oFAAoF;IACpF,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;CACrC;AAED,eAAO,MAAM,YAAY,EAAE,SAe1B,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAG7C,eAAO,MAAM,aAAa,GAAI,UAAU,QAAQ,KAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAEpE,CAAA;AAED,eAAO,MAAM,YAAY,QAAO,MAAM,CAAC,QAAQ,EAAE,KAAK,CAErD,CAAA;AAeD,eAAO,MAAM,6BAA6B,GAAI,GAAG,SAAS,EAAE,GAAG,SAAS,KAAG,MAO1E,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,IAEtD,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,KAAG,MAIrD,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAU,CAAC,SAAS;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,EAAE,MAAM,CAAC,EAAE,KAAG,OAAO,CAAC,CAAC,EAAE,CAGpG,CAAA;AAwKD,eAAO,MAAM,iBAAiB,6EA+W3B,CAAA;AAqBH;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,GAAE,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAgC,GAChF,MAAM,GAAG,IAAI,CAEf;AA8ED,eAAO,MAAM,OAAO,mBAAiD,CAAA;AAMrE,iHAAiH;AACjH,eAAO,MAAM,QAAQ,cAttBN,SAAS,SAAS,YAAY,KAAK,OAAO,CAAC,OAAO,CAstBvB,CAAA;AAC1C,eAAO,MAAM,OAAO,sBAttBE,MAAM,KAAK,OAAO,CAAC,IAAI,CAstBwB,CAAA;AACrE,eAAO,MAAM,gBAAgB,sBAttBE,MAAM,KAAK,OAAO,CAAC,IAAI,CAstBiC,CAAA;AACvF,eAAO,MAAM,kBAAkB,cAttBN,IAstBkE,CAAA;AAC3F,eAAO,MAAM,UAAU,cA5tBN,OAAO,CAAC,IAAI,CA4tB8C,CAAA;AAC3E,eAAO,MAAM,UAAU,cAvtBN,WAAW,CAAC,IAAI,EAAE,KAAK,CAutBmC,CAAA;AAC3E,eAAO,MAAM,UAAU,cAvtBN,MAAM,SAAS;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAC,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAutBX,CAAA;AAC3E,eAAO,MAAM,YAAY,sBAvtBE,MAAM,YAAY,MAAM,YAAY,gBAAgB,KAAK,WAAW,CAAC,IAAI,EAAE,KAAK,CAutB5B,CAAA;AAE/E,eAAO,MAAM,aAAa,mBAGzB,CAAA;AAED,eAAO,MAAM,uBAAuB,mBAGnC,CAAA;AAED,eAAO,MAAM,iBAAiB;;;CAS7B,CAAA;AAED,eAAO,MAAM,sBAAsB,wBAGlC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,wBAG5B,CAAA;AAED,eAAO,MAAM,4BAA4B,cAGxC,CAAA;AAED,eAAO,MAAM,gBAAgB,mBAG5B,CAAA"}
|
package/build/stores/apps.js
CHANGED
|
@@ -265,6 +265,8 @@ function reportingLaunches(launch) {
|
|
|
265
265
|
return started;
|
|
266
266
|
}
|
|
267
267
|
finally {
|
|
268
|
+
// The launcher classified any spawn failure it held back for this start; this report carries it.
|
|
269
|
+
const failureReason = claim.release?.();
|
|
268
270
|
if (attempted) {
|
|
269
271
|
fleetEvents.launch({
|
|
270
272
|
packageName: clientApp.packageName,
|
|
@@ -272,9 +274,9 @@ function reportingLaunches(launch) {
|
|
|
272
274
|
versionName: clientApp.version,
|
|
273
275
|
start: opts?.trigger ?? "automatic",
|
|
274
276
|
outcome: started ? "started" : "failed",
|
|
277
|
+
...(!started && failureReason ? { failureReason } : {}),
|
|
275
278
|
});
|
|
276
279
|
}
|
|
277
|
-
claim.release?.();
|
|
278
280
|
}
|
|
279
281
|
};
|
|
280
282
|
}
|
|
@@ -572,7 +574,20 @@ export const useAppStatusStore = create((set, get) => ({
|
|
|
572
574
|
throw new Error(`${packageName} is already being uninstalled`);
|
|
573
575
|
uninstallingPackages.add(packageName);
|
|
574
576
|
try {
|
|
577
|
+
// Only for Fleet's record: a lookup that fails (or throws) never stops the removal.
|
|
578
|
+
const removed = version ??
|
|
579
|
+
(await Promise.resolve()
|
|
580
|
+
.then(() => appRegistry.getActiveVersion(packageName))
|
|
581
|
+
.catch(() => undefined));
|
|
575
582
|
const res = await appRegistry.uninstall(packageName, version, options);
|
|
583
|
+
// Fleet (Phase 12): every removal attempt, and how it went. The reason of a failed one is not known here.
|
|
584
|
+
fleetEvents.install({
|
|
585
|
+
packageName,
|
|
586
|
+
operation: "remove",
|
|
587
|
+
source: options?.fleetSource ?? "url",
|
|
588
|
+
...(removed ? { fromVersion: removed } : {}),
|
|
589
|
+
...(res.is_error() ? { outcome: "failed", reason: "unknown" } : { outcome: "succeeded" }),
|
|
590
|
+
});
|
|
576
591
|
if (res.is_error())
|
|
577
592
|
throw res.error;
|
|
578
593
|
set((s) => ({ apps: s.apps.filter((a) => a.packageName !== packageName) }));
|