@acorex/connectivity 20.2.0-next.0 → 20.2.0-next.1
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.
@@ -9,9 +9,10 @@ import { AXP_APPLICATION_LOADER, AXP_FEATURE_LOADER, AXP_PERMISSION_LOADER, AXP_
|
|
9
9
|
import { of, delay, firstValueFrom, filter, throttleTime, take } from 'rxjs';
|
10
10
|
import { AXMPermissionsKeys, AXMFormTemplateTypes, RootConfig as RootConfig$5, AXMFormTemplateManagementCategoryEntityServiceImpl, AXMFormTemplateManagementCategoryEntityService } from '@acorex/modules/form-template-management';
|
11
11
|
import { AXMPermissionsKeys as AXMPermissionsKeys$1, RootConfig as RootConfig$6 } from '@acorex/modules/issue-management';
|
12
|
-
import { AXPRegionalService, AXP_SEARCH_PROVIDER, AXPLockService,
|
12
|
+
import { AXPRegionalService, AXPFileStorageStatus, AXP_SEARCH_PROVIDER, AXPLockService, AXPFileStorageService } from '@acorex/platform/common';
|
13
13
|
import Dexie from 'dexie';
|
14
14
|
import { AXTranslationService } from '@acorex/core/translation';
|
15
|
+
import { AXFileService } from '@acorex/core/file';
|
15
16
|
import { RootConfig } from '@acorex/modules/contact-management';
|
16
17
|
import { AXMChatService, AXMCommentService, RootConfig as RootConfig$1 } from '@acorex/modules/conversation';
|
17
18
|
import { AXMUsersEntityService, RootConfig as RootConfig$8 } from '@acorex/modules/security-management';
|
@@ -27,7 +28,6 @@ import { AXPRuntimeModule, provideCommandSetups, AXPQueryService } from '@acorex
|
|
27
28
|
import { RootConfig as RootConfig$a } from '@acorex/modules/report-management';
|
28
29
|
import { AXPWidgetsList } from '@acorex/modules/common';
|
29
30
|
import { RootConfig as RootConfig$b, AXMMetaDataDefinitionCategoryServiceImpl, AXMMetaDataDefinitionService, AXMMetaDataDefinitionCategoryService } from '@acorex/modules/platform-management';
|
30
|
-
import { AXFileService } from '@acorex/core/file';
|
31
31
|
import { RootConfig as RootConfig$c } from '@acorex/modules/text-template-management';
|
32
32
|
import { RootConfig as RootConfig$d } from '@acorex/modules/scheduler-job-management';
|
33
33
|
import { RootConfig as RootConfig$f } from '@acorex/modules/training-management';
|
@@ -790,6 +790,133 @@ class AXCRegionalServiceImpl extends AXPRegionalService {
|
|
790
790
|
}
|
791
791
|
}
|
792
792
|
|
793
|
+
class FileStorageDatabase extends Dexie {
|
794
|
+
constructor() {
|
795
|
+
super('FileStorageDatabase');
|
796
|
+
this.version(1).stores({
|
797
|
+
files: 'fileId,refId,refType,category,isPrimary,status',
|
798
|
+
});
|
799
|
+
}
|
800
|
+
}
|
801
|
+
const db = new FileStorageDatabase();
|
802
|
+
class AXCFileStorageService {
|
803
|
+
async mapToFileStorageInfo(record) {
|
804
|
+
if (!record) {
|
805
|
+
throw new Error('Record not found');
|
806
|
+
}
|
807
|
+
const { binary, ...fileInfo } = record;
|
808
|
+
const url = await this.fileService.blobToBase64(binary);
|
809
|
+
return { ...record, url };
|
810
|
+
}
|
811
|
+
async save(request) {
|
812
|
+
const fileId = crypto.randomUUID();
|
813
|
+
const fileInfo = {
|
814
|
+
fileId,
|
815
|
+
refId: request.refId,
|
816
|
+
refType: request.refType,
|
817
|
+
category: request.category,
|
818
|
+
size: request.file.size,
|
819
|
+
mimeType: request.file.type,
|
820
|
+
uploadedAt: new Date(),
|
821
|
+
isPublic: request.metadata?.['isPublic'] || true,
|
822
|
+
isPrimary: request.isPrimary || false,
|
823
|
+
status: request.status ?? AXPFileStorageStatus.Temporary, // Use enum
|
824
|
+
name: request.name,
|
825
|
+
binary: request.file,
|
826
|
+
};
|
827
|
+
// Save the binary content along with metadata in Dexie
|
828
|
+
await db.files.add({ ...fileInfo, binary: request.file });
|
829
|
+
return fileInfo;
|
830
|
+
}
|
831
|
+
async commit(fileId) {
|
832
|
+
const file = await db.files.get(fileId);
|
833
|
+
if (!file) {
|
834
|
+
throw new Error('File not found');
|
835
|
+
}
|
836
|
+
file.status = AXPFileStorageStatus.Committed; // Use enum
|
837
|
+
await db.files.put(file);
|
838
|
+
}
|
839
|
+
async markForDeletion(fileId) {
|
840
|
+
const file = await db.files.get(fileId);
|
841
|
+
if (!file) {
|
842
|
+
throw new Error('File not found');
|
843
|
+
}
|
844
|
+
file.status = AXPFileStorageStatus.PendingDeletion; // Use enum
|
845
|
+
await db.files.put(file);
|
846
|
+
}
|
847
|
+
async update(request) {
|
848
|
+
const file = await db.files.get(request.fileId);
|
849
|
+
if (!file) {
|
850
|
+
throw new Error('File not found');
|
851
|
+
}
|
852
|
+
const updatedFileInfo = {
|
853
|
+
...file,
|
854
|
+
...request.metadata,
|
855
|
+
isPrimary: request.isPrimary !== undefined ? request.isPrimary : file.isPrimary,
|
856
|
+
};
|
857
|
+
await db.files.put(updatedFileInfo);
|
858
|
+
return this.mapToFileStorageInfo(updatedFileInfo);
|
859
|
+
}
|
860
|
+
async find(request) {
|
861
|
+
const files = await db.files.toArray();
|
862
|
+
const filteredFiles = files.filter((file) => {
|
863
|
+
return ((!request.refId || file.refId === request.refId) &&
|
864
|
+
(!request.refType || file.refType === request.refType) &&
|
865
|
+
(!request.category || file.category === request.category) &&
|
866
|
+
(!request.isPrimary || file.isPrimary === request.isPrimary) &&
|
867
|
+
(!request.isPublic || file.isPublic === request.isPublic) &&
|
868
|
+
(!request.mimeType || file.mimeType === request.mimeType) &&
|
869
|
+
(!request.uploadedAtRange ||
|
870
|
+
(file.uploadedAt >= request.uploadedAtRange.from && file.uploadedAt <= request.uploadedAtRange.to)) &&
|
871
|
+
file.status === AXPFileStorageStatus.Committed // Use enum
|
872
|
+
);
|
873
|
+
});
|
874
|
+
// Map all filtered files to `AXPFileStorageInfo`
|
875
|
+
return Promise.all(filteredFiles.map((file) => this.mapToFileStorageInfo(file)));
|
876
|
+
}
|
877
|
+
async getInfo(fileId) {
|
878
|
+
// Simulate a delay of 2 seconds (2000 milliseconds)
|
879
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
880
|
+
const file = await db.files.get(fileId);
|
881
|
+
return this.mapToFileStorageInfo(file);
|
882
|
+
}
|
883
|
+
async remove(fileId) {
|
884
|
+
await db.files.delete(fileId);
|
885
|
+
}
|
886
|
+
async cleanupTemporaryFiles() {
|
887
|
+
const files = await db.files.toArray();
|
888
|
+
const temporaryFiles = files.filter((file) => file.status === AXPFileStorageStatus.Temporary);
|
889
|
+
for (const file of temporaryFiles) {
|
890
|
+
await db.files.delete(file.fileId);
|
891
|
+
}
|
892
|
+
}
|
893
|
+
async cleanupMarkedFiles(gracePeriod) {
|
894
|
+
const now = new Date();
|
895
|
+
const files = await db.files.toArray();
|
896
|
+
for (const file of files) {
|
897
|
+
if (file.status === AXPFileStorageStatus.PendingDeletion &&
|
898
|
+
now.getTime() - file.uploadedAt.getTime() > gracePeriod) {
|
899
|
+
await db.files.delete(file.fileId);
|
900
|
+
}
|
901
|
+
}
|
902
|
+
}
|
903
|
+
// Semi-background cleanup job
|
904
|
+
constructor() {
|
905
|
+
this.fileService = inject(AXFileService);
|
906
|
+
setInterval(() => {
|
907
|
+
this.cleanupMarkedFiles(5 * 60 * 1000) // Grace period: 5 minutes in milliseconds
|
908
|
+
.catch((error) => console.error('Error during cleanup:', error));
|
909
|
+
this.cleanupTemporaryFiles() // Ensure temporary files are cleaned
|
910
|
+
.catch((error) => console.error('Error during cleanup:', error));
|
911
|
+
}, 5 * 60 * 1000); // Runs every 5 minutes
|
912
|
+
}
|
913
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCFileStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
914
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCFileStorageService }); }
|
915
|
+
}
|
916
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCFileStorageService, decorators: [{
|
917
|
+
type: Injectable
|
918
|
+
}], ctorParameters: () => [] });
|
919
|
+
|
793
920
|
class AXCCommonMockModule {
|
794
921
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCCommonMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
795
922
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.3", ngImport: i0, type: AXCCommonMockModule }); }
|
@@ -811,7 +938,11 @@ class AXCCommonMockModule {
|
|
811
938
|
{
|
812
939
|
provide: AXPRegionalService,
|
813
940
|
useClass: AXCRegionalServiceImpl
|
814
|
-
}
|
941
|
+
},
|
942
|
+
{
|
943
|
+
provide: AXPFileStorageService,
|
944
|
+
useClass: AXCFileStorageService,
|
945
|
+
},
|
815
946
|
] }); }
|
816
947
|
}
|
817
948
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCCommonMockModule, decorators: [{
|
@@ -838,7 +969,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
|
|
838
969
|
{
|
839
970
|
provide: AXPRegionalService,
|
840
971
|
useClass: AXCRegionalServiceImpl
|
841
|
-
}
|
972
|
+
},
|
973
|
+
{
|
974
|
+
provide: AXPFileStorageService,
|
975
|
+
useClass: AXCFileStorageService,
|
976
|
+
},
|
842
977
|
],
|
843
978
|
}]
|
844
979
|
}] });
|
@@ -8589,133 +8724,6 @@ class AXCMetaDataDefinitionCategoryMockService extends AXMMetaDataDefinitionCate
|
|
8589
8724
|
}
|
8590
8725
|
}
|
8591
8726
|
|
8592
|
-
class FileStorageDatabase extends Dexie {
|
8593
|
-
constructor() {
|
8594
|
-
super('FileStorageDatabase');
|
8595
|
-
this.version(1).stores({
|
8596
|
-
files: 'fileId,refId,refType,category,isPrimary,status',
|
8597
|
-
});
|
8598
|
-
}
|
8599
|
-
}
|
8600
|
-
const db = new FileStorageDatabase();
|
8601
|
-
class AXCFileStorageService {
|
8602
|
-
async mapToFileStorageInfo(record) {
|
8603
|
-
if (!record) {
|
8604
|
-
throw new Error('Record not found');
|
8605
|
-
}
|
8606
|
-
const { binary, ...fileInfo } = record;
|
8607
|
-
const url = await this.fileService.blobToBase64(binary);
|
8608
|
-
return { ...record, url };
|
8609
|
-
}
|
8610
|
-
async save(request) {
|
8611
|
-
const fileId = crypto.randomUUID();
|
8612
|
-
const fileInfo = {
|
8613
|
-
fileId,
|
8614
|
-
refId: request.refId,
|
8615
|
-
refType: request.refType,
|
8616
|
-
category: request.category,
|
8617
|
-
size: request.file.size,
|
8618
|
-
mimeType: request.file.type,
|
8619
|
-
uploadedAt: new Date(),
|
8620
|
-
isPublic: request.metadata?.['isPublic'] || true,
|
8621
|
-
isPrimary: request.isPrimary || false,
|
8622
|
-
status: request.status ?? AXPFileStorageStatus.Temporary, // Use enum
|
8623
|
-
name: request.name,
|
8624
|
-
binary: request.file,
|
8625
|
-
};
|
8626
|
-
// Save the binary content along with metadata in Dexie
|
8627
|
-
await db.files.add({ ...fileInfo, binary: request.file });
|
8628
|
-
return fileInfo;
|
8629
|
-
}
|
8630
|
-
async commit(fileId) {
|
8631
|
-
const file = await db.files.get(fileId);
|
8632
|
-
if (!file) {
|
8633
|
-
throw new Error('File not found');
|
8634
|
-
}
|
8635
|
-
file.status = AXPFileStorageStatus.Committed; // Use enum
|
8636
|
-
await db.files.put(file);
|
8637
|
-
}
|
8638
|
-
async markForDeletion(fileId) {
|
8639
|
-
const file = await db.files.get(fileId);
|
8640
|
-
if (!file) {
|
8641
|
-
throw new Error('File not found');
|
8642
|
-
}
|
8643
|
-
file.status = AXPFileStorageStatus.PendingDeletion; // Use enum
|
8644
|
-
await db.files.put(file);
|
8645
|
-
}
|
8646
|
-
async update(request) {
|
8647
|
-
const file = await db.files.get(request.fileId);
|
8648
|
-
if (!file) {
|
8649
|
-
throw new Error('File not found');
|
8650
|
-
}
|
8651
|
-
const updatedFileInfo = {
|
8652
|
-
...file,
|
8653
|
-
...request.metadata,
|
8654
|
-
isPrimary: request.isPrimary !== undefined ? request.isPrimary : file.isPrimary,
|
8655
|
-
};
|
8656
|
-
await db.files.put(updatedFileInfo);
|
8657
|
-
return this.mapToFileStorageInfo(updatedFileInfo);
|
8658
|
-
}
|
8659
|
-
async find(request) {
|
8660
|
-
const files = await db.files.toArray();
|
8661
|
-
const filteredFiles = files.filter((file) => {
|
8662
|
-
return ((!request.refId || file.refId === request.refId) &&
|
8663
|
-
(!request.refType || file.refType === request.refType) &&
|
8664
|
-
(!request.category || file.category === request.category) &&
|
8665
|
-
(!request.isPrimary || file.isPrimary === request.isPrimary) &&
|
8666
|
-
(!request.isPublic || file.isPublic === request.isPublic) &&
|
8667
|
-
(!request.mimeType || file.mimeType === request.mimeType) &&
|
8668
|
-
(!request.uploadedAtRange ||
|
8669
|
-
(file.uploadedAt >= request.uploadedAtRange.from && file.uploadedAt <= request.uploadedAtRange.to)) &&
|
8670
|
-
file.status === AXPFileStorageStatus.Committed // Use enum
|
8671
|
-
);
|
8672
|
-
});
|
8673
|
-
// Map all filtered files to `AXPFileStorageInfo`
|
8674
|
-
return Promise.all(filteredFiles.map((file) => this.mapToFileStorageInfo(file)));
|
8675
|
-
}
|
8676
|
-
async getInfo(fileId) {
|
8677
|
-
// Simulate a delay of 2 seconds (2000 milliseconds)
|
8678
|
-
await new Promise((resolve) => setTimeout(resolve, 2000));
|
8679
|
-
const file = await db.files.get(fileId);
|
8680
|
-
return this.mapToFileStorageInfo(file);
|
8681
|
-
}
|
8682
|
-
async remove(fileId) {
|
8683
|
-
await db.files.delete(fileId);
|
8684
|
-
}
|
8685
|
-
async cleanupTemporaryFiles() {
|
8686
|
-
const files = await db.files.toArray();
|
8687
|
-
const temporaryFiles = files.filter((file) => file.status === AXPFileStorageStatus.Temporary);
|
8688
|
-
for (const file of temporaryFiles) {
|
8689
|
-
await db.files.delete(file.fileId);
|
8690
|
-
}
|
8691
|
-
}
|
8692
|
-
async cleanupMarkedFiles(gracePeriod) {
|
8693
|
-
const now = new Date();
|
8694
|
-
const files = await db.files.toArray();
|
8695
|
-
for (const file of files) {
|
8696
|
-
if (file.status === AXPFileStorageStatus.PendingDeletion &&
|
8697
|
-
now.getTime() - file.uploadedAt.getTime() > gracePeriod) {
|
8698
|
-
await db.files.delete(file.fileId);
|
8699
|
-
}
|
8700
|
-
}
|
8701
|
-
}
|
8702
|
-
// Semi-background cleanup job
|
8703
|
-
constructor() {
|
8704
|
-
this.fileService = inject(AXFileService);
|
8705
|
-
setInterval(() => {
|
8706
|
-
this.cleanupMarkedFiles(5 * 60 * 1000) // Grace period: 5 minutes in milliseconds
|
8707
|
-
.catch((error) => console.error('Error during cleanup:', error));
|
8708
|
-
this.cleanupTemporaryFiles() // Ensure temporary files are cleaned
|
8709
|
-
.catch((error) => console.error('Error during cleanup:', error));
|
8710
|
-
}, 5 * 60 * 1000); // Runs every 5 minutes
|
8711
|
-
}
|
8712
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCFileStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
8713
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCFileStorageService }); }
|
8714
|
-
}
|
8715
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCFileStorageService, decorators: [{
|
8716
|
-
type: Injectable
|
8717
|
-
}], ctorParameters: () => [] });
|
8718
|
-
|
8719
8727
|
class AXCPlatformManagementMockModule {
|
8720
8728
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCPlatformManagementMockModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
8721
8729
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.3", ngImport: i0, type: AXCPlatformManagementMockModule }); }
|
@@ -8744,10 +8752,6 @@ class AXCPlatformManagementMockModule {
|
|
8744
8752
|
provide: AXMMetaDataDefinitionCategoryService,
|
8745
8753
|
useClass: AXCMetaDataDefinitionCategoryMockService,
|
8746
8754
|
},
|
8747
|
-
{
|
8748
|
-
provide: AXPFileStorageService,
|
8749
|
-
useClass: AXCFileStorageService,
|
8750
|
-
},
|
8751
8755
|
] }); }
|
8752
8756
|
}
|
8753
8757
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: AXCPlatformManagementMockModule, decorators: [{
|
@@ -8781,10 +8785,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
|
|
8781
8785
|
provide: AXMMetaDataDefinitionCategoryService,
|
8782
8786
|
useClass: AXCMetaDataDefinitionCategoryMockService,
|
8783
8787
|
},
|
8784
|
-
{
|
8785
|
-
provide: AXPFileStorageService,
|
8786
|
-
useClass: AXCFileStorageService,
|
8787
|
-
},
|
8788
8788
|
],
|
8789
8789
|
}]
|
8790
8790
|
}] });
|
@@ -11010,5 +11010,5 @@ var execute_command = /*#__PURE__*/Object.freeze({
|
|
11010
11010
|
* Generated bundle index. Do not edit.
|
11011
11011
|
*/
|
11012
11012
|
|
11013
|
-
export { APPLICATIONS, APPLICATIONS_MODULES, AXCApplicationManagementMockModule, AXCApplicationTemplateDataSeeder, AXCAuthMockModule, AXCCommonMockModule, AXCContactManagementMockModule, AXCConversationMockModule, AXCDashboardManagementMockModule, AXCDataManagementMockModule, AXCDocumentManagementMockModule, AXCFOrganizationManagementMockModule, AXCFormTemplateManagementMockModule, AXCIssueManagementMockModule, AXCLockService, AXCLogManagementMockModule, AXCMockModule, AXCNotificationManagementMockModule, AXCProjectManagementMockModule, AXCReportManagementMockModule, AXCSchedulerJobDataSeeder, AXCSchedulerJobManagementMockModule, AXCSecurityManagementMockModule, AXCTextTemplateCategoryDataSeeder, AXCTextTemplateDataSeeder, AXCTextTemplateManagementMockModule, AXCTrainingManagementMockModule, AXMAiResponderService, AXMReportExecuteCommand, AXPDashboardDataSeeder, AXPDexieEntityStorageService, AXPMessageDataSeeder, AXPReportManagementDataSeeder, AXPRoomDataSeeder, AXPSecurityManagementRoleDataSeeder, AXPSecurityManagementUserDataSeeder, CATEGORY_REPORT_MAPPING, DASHBOARDS, EDITIONS, ENTITIES, FEATURES, MOCKStrategy, MODULES, PERMISSIONS, PROPERTIES, REPORT_CATEGORIES, REPORT_DEFINITIONS, TEXT_TEMPLATES, TEXT_TEMPLATE_CATEGORY, generateRandomDashboard };
|
11013
|
+
export { APPLICATIONS, APPLICATIONS_MODULES, AXCApplicationManagementMockModule, AXCApplicationTemplateDataSeeder, AXCAuthMockModule, AXCCommonMockModule, AXCContactManagementMockModule, AXCConversationMockModule, AXCDashboardManagementMockModule, AXCDataManagementMockModule, AXCDocumentManagementMockModule, AXCFOrganizationManagementMockModule, AXCFileStorageService, AXCFormTemplateManagementMockModule, AXCIssueManagementMockModule, AXCLockService, AXCLogManagementMockModule, AXCMockModule, AXCNotificationManagementMockModule, AXCProjectManagementMockModule, AXCReportManagementMockModule, AXCSchedulerJobDataSeeder, AXCSchedulerJobManagementMockModule, AXCSecurityManagementMockModule, AXCTextTemplateCategoryDataSeeder, AXCTextTemplateDataSeeder, AXCTextTemplateManagementMockModule, AXCTrainingManagementMockModule, AXMAiResponderService, AXMReportExecuteCommand, AXPDashboardDataSeeder, AXPDexieEntityStorageService, AXPMessageDataSeeder, AXPReportManagementDataSeeder, AXPRoomDataSeeder, AXPSecurityManagementRoleDataSeeder, AXPSecurityManagementUserDataSeeder, CATEGORY_REPORT_MAPPING, DASHBOARDS, EDITIONS, ENTITIES, FEATURES, MOCKStrategy, MODULES, PERMISSIONS, PROPERTIES, REPORT_CATEGORIES, REPORT_DEFINITIONS, TEXT_TEMPLATES, TEXT_TEMPLATE_CATEGORY, generateRandomDashboard };
|
11014
11014
|
//# sourceMappingURL=acorex-connectivity-mock.mjs.map
|