From 402732377abdb11dc7f5144142454bb2d6689b8f Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Fri, 12 Jun 2026 19:57:54 +0300 Subject: [PATCH] refactor(iot-hub): use blob object URLs for device package zip images Switch from base64 data URLs to URL.createObjectURL for images extracted from the device package zip. Revokes them in ngOnDestroy to avoid leaking memory, and avoids embedding multi-megabyte data URLs in the DOM. --- .../device-install-dialog.component.ts | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts b/ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts index e4df929fd2..c94bb477f3 100644 --- a/ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/iot-hub/device-install-dialog/device-install-dialog.component.ts @@ -14,7 +14,7 @@ /// limitations under the License. /// -import { ChangeDetectorRef, Component, Inject, OnInit, Type, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { Router } from '@angular/router'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; import { @@ -40,9 +40,6 @@ import { AttributeScope } from '@shared/models/telemetry/telemetry.models'; import { EntityId } from '@shared/models/id/entity-id'; import { generateSecret } from '@core/utils'; import { - installMethodIcons as INSTALL_METHOD_ICONS, - installMethodLabels as INSTALL_METHOD_LABELS, - peOnlyInstallMethods, DeviceInstallStep, DevicePackageInfo, ENTITY_STEP_TYPES, @@ -50,7 +47,10 @@ import { EntityStepProgress, FormFieldDefinition, FormFieldType, + installMethodIcons as INSTALL_METHOD_ICONS, + installMethodLabels as INSTALL_METHOD_LABELS, InstallStepType, + peOnlyInstallMethods, stepTypeAliasMap } from '@shared/models/iot-hub/device-package.models'; import { mergeMap } from 'rxjs/operators'; @@ -89,7 +89,7 @@ const DEFAULT_RANDOM_SIZE = 20; templateUrl: './device-install-dialog.component.html', styleUrls: ['./device-install-dialog.component.scss'] }) -export class TbDeviceInstallDialogComponent extends DialogComponent implements OnInit { +export class TbDeviceInstallDialogComponent extends DialogComponent implements OnInit, OnDestroy { @ViewChild('installStepper', {static: false}) stepper: MatStepper; @@ -148,9 +148,9 @@ export class TbDeviceInstallDialogComponent extends DialogComponent