@haex-space/vault-sdk 2.5.42 → 2.5.45

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/dist/index.mjs CHANGED
@@ -485,50 +485,19 @@ var HAEXTENSION_METHODS = {
485
485
  filesystem: {
486
486
  saveFile: "haextension:filesystem:save-file",
487
487
  openFile: "haextension:filesystem:open-file",
488
- showImage: "haextension:filesystem:show-image"
489
- },
490
- filesync: {
491
- // Spaces
492
- listSpaces: "haextension:filesync:list-spaces",
493
- createSpace: "haextension:filesync:create-space",
494
- deleteSpace: "haextension:filesync:delete-space",
495
- // Files
496
- listFiles: "haextension:filesync:list-files",
497
- getFile: "haextension:filesync:get-file",
498
- uploadFile: "haextension:filesync:upload-file",
499
- downloadFile: "haextension:filesync:download-file",
500
- deleteFile: "haextension:filesync:delete-file",
501
- // Backends
502
- listBackends: "haextension:filesync:list-backends",
503
- addBackend: "haextension:filesync:add-backend",
504
- removeBackend: "haextension:filesync:remove-backend",
505
- testBackend: "haextension:filesync:test-backend",
506
- // Sync Rules
507
- listSyncRules: "haextension:filesync:list-sync-rules",
508
- addSyncRule: "haextension:filesync:add-sync-rule",
509
- updateSyncRule: "haextension:filesync:update-sync-rule",
510
- removeSyncRule: "haextension:filesync:remove-sync-rule",
511
- // Sync Operations
512
- getSyncStatus: "haextension:filesync:get-sync-status",
513
- triggerSync: "haextension:filesync:trigger-sync",
514
- pauseSync: "haextension:filesync:pause-sync",
515
- resumeSync: "haextension:filesync:resume-sync",
516
- // Conflict Resolution
517
- resolveConflict: "haextension:filesync:resolve-conflict",
518
- // UI Helpers
519
- selectFolder: "haextension:filesync:select-folder",
520
- scanLocal: "haextension:filesync:scan-local",
521
- // Sync Queue (persistent upload/download queue)
522
- addToQueue: "haextension:filesync:add-to-queue",
523
- getQueue: "haextension:filesync:get-queue",
524
- getQueueSummary: "haextension:filesync:get-queue-summary",
525
- startQueueEntry: "haextension:filesync:start-queue-entry",
526
- completeQueueEntry: "haextension:filesync:complete-queue-entry",
527
- failQueueEntry: "haextension:filesync:fail-queue-entry",
528
- retryFailedQueue: "haextension:filesync:retry-failed-queue",
529
- removeQueueEntry: "haextension:filesync:remove-queue-entry",
530
- clearQueue: "haextension:filesync:clear-queue",
531
- recoverQueue: "haextension:filesync:recover-queue"
488
+ showImage: "haextension:filesystem:show-image",
489
+ // Generic FS operations (Phase 2)
490
+ readFile: "haextension:filesystem:read-file",
491
+ writeFile: "haextension:filesystem:write-file",
492
+ readDir: "haextension:filesystem:read-dir",
493
+ mkdir: "haextension:filesystem:mkdir",
494
+ remove: "haextension:filesystem:remove",
495
+ exists: "haextension:filesystem:exists",
496
+ stat: "haextension:filesystem:stat",
497
+ selectFolder: "haextension:filesystem:select-folder",
498
+ selectFile: "haextension:filesystem:select-file",
499
+ rename: "haextension:filesystem:rename",
500
+ copy: "haextension:filesystem:copy"
532
501
  },
533
502
  storage: {
534
503
  getItem: "haextension:storage:get-item",
@@ -674,406 +643,193 @@ var DatabaseAPI = class {
674
643
  }
675
644
  };
676
645
 
677
- // src/api/filesync.ts
678
- var FILE_SYNC_STATE = {
679
- SYNCED: "synced",
680
- SYNCING: "syncing",
681
- LOCAL_ONLY: "localOnly",
682
- REMOTE_ONLY: "remoteOnly",
683
- CONFLICT: "conflict",
684
- ERROR: "error"
685
- };
686
- var SYNC_DIRECTION = {
687
- UP: "up",
688
- DOWN: "down",
689
- BOTH: "both"
690
- };
691
- var STORAGE_BACKEND_TYPE = {
692
- S3: "s3",
693
- R2: "r2",
694
- MINIO: "minio",
695
- GDRIVE: "gdrive",
696
- DROPBOX: "dropbox"
697
- };
698
- var CONFLICT_STRATEGY = {
699
- /** Always prefer local version */
700
- LOCAL: "local",
701
- /** Always prefer remote version */
702
- REMOTE: "remote",
703
- /** Prefer newer version (Last-Writer-Wins) */
704
- NEWER: "newer",
705
- /** Ask user to resolve each conflict manually */
706
- ASK: "ask",
707
- /** Keep both versions (create conflict copy) */
708
- KEEP_BOTH: "keepBoth"
709
- };
710
- var QUEUE_OPERATION = {
711
- UPLOAD: "upload",
712
- DOWNLOAD: "download"
713
- };
714
- var QUEUE_STATUS = {
715
- PENDING: "pending",
716
- IN_PROGRESS: "inProgress",
717
- COMPLETED: "completed",
718
- FAILED: "failed"
719
- };
720
- var FileSyncAPI = class {
646
+ // src/api/filesystem.ts
647
+ var FilesystemAPI = class {
721
648
  constructor(client) {
722
649
  this.client = client;
723
650
  }
724
- // --------------------------------------------------------------------------
725
- // Spaces
726
- // --------------------------------------------------------------------------
727
- /**
728
- * List all file spaces
729
- */
730
- async listSpacesAsync() {
731
- return this.client.request(
732
- HAEXTENSION_METHODS.filesync.listSpaces
733
- );
734
- }
735
- /**
736
- * Create a new file space
737
- */
738
- async createSpaceAsync(options) {
739
- return this.client.request(
740
- HAEXTENSION_METHODS.filesync.createSpace,
741
- options
742
- );
743
- }
744
- /**
745
- * Delete a file space
746
- */
747
- async deleteSpaceAsync(spaceId) {
748
- await this.client.request(HAEXTENSION_METHODS.filesync.deleteSpace, {
749
- spaceId
750
- });
751
- }
752
- // --------------------------------------------------------------------------
753
- // Files
754
- // --------------------------------------------------------------------------
755
651
  /**
756
- * List files in a space
652
+ * Opens a save file dialog and saves the provided data to the selected location
653
+ * @param data The file data as Uint8Array
654
+ * @param options Options for the save dialog
655
+ * @returns The path where the file was saved, or null if cancelled
757
656
  */
758
- async listFilesAsync(options) {
759
- return this.client.request(
760
- HAEXTENSION_METHODS.filesync.listFiles,
761
- options
657
+ async saveFileAsync(data, options = {}) {
658
+ const result = await this.client.request(
659
+ HAEXTENSION_METHODS.filesystem.saveFile,
660
+ {
661
+ data: Array.from(data),
662
+ // Convert Uint8Array to regular array for postMessage
663
+ defaultPath: options.defaultPath,
664
+ title: options.title,
665
+ filters: options.filters
666
+ }
762
667
  );
668
+ return result;
763
669
  }
764
670
  /**
765
- * Scan local files in a sync rule folder
766
- * Returns unencrypted local files for display in the UI
671
+ * Opens a file with the system's default viewer
672
+ * @param data The file data as Uint8Array
673
+ * @param options Options for opening the file
674
+ * @returns The result of the operation
767
675
  */
768
- async scanLocalAsync(options) {
769
- return this.client.request(
770
- HAEXTENSION_METHODS.filesync.scanLocal,
771
- options
676
+ async openFileAsync(data, options) {
677
+ const result = await this.client.request(
678
+ HAEXTENSION_METHODS.filesystem.openFile,
679
+ {
680
+ data: Array.from(data),
681
+ // Convert Uint8Array to regular array for postMessage
682
+ fileName: options.fileName,
683
+ mimeType: options.mimeType
684
+ }
772
685
  );
686
+ return result;
773
687
  }
774
688
  /**
775
- * Get file info by ID
689
+ * Shows an image using a data URL (safe, read-only viewing)
690
+ * This is safe to use without special permissions as it only displays images
691
+ * and doesn't execute any code or open files with external applications
692
+ * @param options Options containing the data URL
693
+ * @returns The result of the operation
776
694
  */
777
- async getFileAsync(fileId) {
778
- return this.client.request(
779
- HAEXTENSION_METHODS.filesync.getFile,
780
- { fileId }
695
+ async showImageAsync(options) {
696
+ const result = await this.client.request(
697
+ HAEXTENSION_METHODS.filesystem.showImage,
698
+ {
699
+ dataUrl: options.dataUrl
700
+ }
781
701
  );
702
+ return result;
782
703
  }
704
+ // ==========================================================================
705
+ // Generic Filesystem Operations (Phase 2)
706
+ // ==========================================================================
783
707
  /**
784
- * Upload a file to the sync system
708
+ * Read file contents
709
+ * @param path Absolute path to the file
710
+ * @returns File contents as Uint8Array
785
711
  */
786
- async uploadFileAsync(options) {
787
- return this.client.request(
788
- HAEXTENSION_METHODS.filesync.uploadFile,
789
- options
712
+ async readFile(path) {
713
+ const base64 = await this.client.request(
714
+ HAEXTENSION_METHODS.filesystem.readFile,
715
+ { path }
790
716
  );
717
+ const binary = atob(base64);
718
+ const bytes = new Uint8Array(binary.length);
719
+ for (let i = 0; i < binary.length; i++) {
720
+ bytes[i] = binary.charCodeAt(i);
721
+ }
722
+ return bytes;
791
723
  }
792
724
  /**
793
- * Download a file to local storage
725
+ * Write file contents
726
+ * @param path Absolute path to the file
727
+ * @param data File contents as Uint8Array
794
728
  */
795
- async downloadFileAsync(options) {
729
+ async writeFile(path, data) {
730
+ const base64 = btoa(String.fromCharCode(...data));
796
731
  await this.client.request(
797
- HAEXTENSION_METHODS.filesync.downloadFile,
798
- options
799
- );
800
- }
801
- /**
802
- * Delete a file from the sync system
803
- */
804
- async deleteFileAsync(fileId) {
805
- await this.client.request(HAEXTENSION_METHODS.filesync.deleteFile, {
806
- fileId
807
- });
808
- }
809
- // --------------------------------------------------------------------------
810
- // Storage Backends
811
- // --------------------------------------------------------------------------
812
- /**
813
- * List configured storage backends
814
- */
815
- async listBackendsAsync() {
816
- return this.client.request(
817
- HAEXTENSION_METHODS.filesync.listBackends
818
- );
819
- }
820
- /**
821
- * Add a new storage backend
822
- */
823
- async addBackendAsync(options) {
824
- return this.client.request(
825
- HAEXTENSION_METHODS.filesync.addBackend,
826
- options
732
+ HAEXTENSION_METHODS.filesystem.writeFile,
733
+ { path, data: base64 }
827
734
  );
828
735
  }
829
736
  /**
830
- * Remove a storage backend
831
- */
832
- async removeBackendAsync(backendId) {
833
- await this.client.request(HAEXTENSION_METHODS.filesync.removeBackend, {
834
- backendId
835
- });
836
- }
837
- /**
838
- * Test backend connection
737
+ * Read directory contents
738
+ * @param path Absolute path to the directory
739
+ * @returns Array of directory entries
839
740
  */
840
- async testBackendAsync(backendId) {
741
+ async readDir(path) {
841
742
  return this.client.request(
842
- HAEXTENSION_METHODS.filesync.testBackend,
843
- { backendId }
743
+ HAEXTENSION_METHODS.filesystem.readDir,
744
+ { path }
844
745
  );
845
746
  }
846
- // --------------------------------------------------------------------------
847
- // Sync Rules
848
- // --------------------------------------------------------------------------
849
747
  /**
850
- * List sync rules
748
+ * Create a directory (and parent directories if needed)
749
+ * @param path Absolute path to create
851
750
  */
852
- async listSyncRulesAsync() {
853
- return this.client.request(
854
- HAEXTENSION_METHODS.filesync.listSyncRules
751
+ async mkdir(path) {
752
+ await this.client.request(
753
+ HAEXTENSION_METHODS.filesystem.mkdir,
754
+ { path }
855
755
  );
856
756
  }
857
757
  /**
858
- * Add a sync rule
758
+ * Remove a file or directory
759
+ * @param path Absolute path to remove
760
+ * @param recursive If true, remove directories recursively
859
761
  */
860
- async addSyncRuleAsync(options) {
861
- return this.client.request(
862
- HAEXTENSION_METHODS.filesync.addSyncRule,
863
- options
762
+ async remove(path, recursive = false) {
763
+ await this.client.request(
764
+ HAEXTENSION_METHODS.filesystem.remove,
765
+ { path, recursive }
864
766
  );
865
767
  }
866
768
  /**
867
- * Update a sync rule
769
+ * Check if a path exists
770
+ * @param path Absolute path to check
771
+ * @returns True if the path exists
868
772
  */
869
- async updateSyncRuleAsync(options) {
773
+ async exists(path) {
870
774
  return this.client.request(
871
- HAEXTENSION_METHODS.filesync.updateSyncRule,
872
- options
775
+ HAEXTENSION_METHODS.filesystem.exists,
776
+ { path }
873
777
  );
874
778
  }
875
779
  /**
876
- * Remove a sync rule
780
+ * Get file/directory metadata
781
+ * @param path Absolute path
782
+ * @returns File metadata
877
783
  */
878
- async removeSyncRuleAsync(ruleId) {
879
- await this.client.request(HAEXTENSION_METHODS.filesync.removeSyncRule, {
880
- ruleId
881
- });
882
- }
883
- // --------------------------------------------------------------------------
884
- // Sync Operations
885
- // --------------------------------------------------------------------------
886
- /**
887
- * Get current sync status
888
- */
889
- async getSyncStatusAsync() {
784
+ async stat(path) {
890
785
  return this.client.request(
891
- HAEXTENSION_METHODS.filesync.getSyncStatus
786
+ HAEXTENSION_METHODS.filesystem.stat,
787
+ { path }
892
788
  );
893
789
  }
894
- /**
895
- * Trigger a manual sync
896
- */
897
- async triggerSyncAsync() {
898
- await this.client.request(HAEXTENSION_METHODS.filesync.triggerSync);
899
- }
900
- /**
901
- * Pause syncing
902
- */
903
- async pauseSyncAsync() {
904
- await this.client.request(HAEXTENSION_METHODS.filesync.pauseSync);
905
- }
906
- /**
907
- * Resume syncing
908
- */
909
- async resumeSyncAsync() {
910
- await this.client.request(HAEXTENSION_METHODS.filesync.resumeSync);
911
- }
912
- // --------------------------------------------------------------------------
913
- // Conflict Resolution
914
- // --------------------------------------------------------------------------
915
- /**
916
- * Resolve a file conflict
917
- */
918
- async resolveConflictAsync(fileId, resolution) {
919
- await this.client.request(HAEXTENSION_METHODS.filesync.resolveConflict, {
920
- fileId,
921
- resolution
922
- });
923
- }
924
- // --------------------------------------------------------------------------
925
- // Folder Selection (Native Dialog)
926
- // --------------------------------------------------------------------------
927
790
  /**
928
791
  * Open a folder selection dialog
792
+ * @param options Dialog options
793
+ * @returns Selected folder path, or null if cancelled
929
794
  */
930
- async selectFolderAsync() {
931
- return this.client.request(
932
- HAEXTENSION_METHODS.filesync.selectFolder
933
- );
934
- }
935
- // --------------------------------------------------------------------------
936
- // Sync Queue
937
- // --------------------------------------------------------------------------
938
- /**
939
- * Add files to the sync queue
940
- */
941
- async addToQueueAsync(options) {
795
+ async selectFolder(options = {}) {
942
796
  return this.client.request(
943
- HAEXTENSION_METHODS.filesync.addToQueue,
797
+ HAEXTENSION_METHODS.filesystem.selectFolder,
944
798
  options
945
799
  );
946
800
  }
947
801
  /**
948
- * Get queue entries for the current device
802
+ * Open a file selection dialog
803
+ * @param options Dialog options
804
+ * @returns Selected file paths, or null if cancelled
949
805
  */
950
- async getQueueAsync(options) {
806
+ async selectFile(options = {}) {
951
807
  return this.client.request(
952
- HAEXTENSION_METHODS.filesync.getQueue,
808
+ HAEXTENSION_METHODS.filesystem.selectFile,
953
809
  options
954
810
  );
955
811
  }
956
812
  /**
957
- * Get aggregated queue summary for the current device
958
- */
959
- async getQueueSummaryAsync() {
960
- return this.client.request(
961
- HAEXTENSION_METHODS.filesync.getQueueSummary
962
- );
963
- }
964
- /**
965
- * Mark a queue entry as started (in_progress)
966
- */
967
- async startQueueEntryAsync(entryId) {
968
- await this.client.request(HAEXTENSION_METHODS.filesync.startQueueEntry, {
969
- entryId
970
- });
971
- }
972
- /**
973
- * Mark a queue entry as completed
974
- */
975
- async completeQueueEntryAsync(entryId) {
976
- await this.client.request(HAEXTENSION_METHODS.filesync.completeQueueEntry, {
977
- entryId
978
- });
979
- }
980
- /**
981
- * Mark a queue entry as failed
982
- */
983
- async failQueueEntryAsync(entryId, errorMessage) {
984
- await this.client.request(HAEXTENSION_METHODS.filesync.failQueueEntry, {
985
- entryId,
986
- errorMessage
987
- });
988
- }
989
- /**
990
- * Retry all failed queue entries (reset to pending)
991
- */
992
- async retryFailedQueueAsync() {
993
- await this.client.request(HAEXTENSION_METHODS.filesync.retryFailedQueue);
994
- }
995
- /**
996
- * Remove a queue entry
997
- */
998
- async removeQueueEntryAsync(entryId) {
999
- await this.client.request(HAEXTENSION_METHODS.filesync.removeQueueEntry, {
1000
- entryId
1001
- });
1002
- }
1003
- /**
1004
- * Clear all queue entries for a sync rule
1005
- */
1006
- async clearQueueAsync(ruleId) {
1007
- await this.client.request(HAEXTENSION_METHODS.filesync.clearQueue, {
1008
- ruleId
1009
- });
1010
- }
1011
- /**
1012
- * Reset in_progress entries to pending (for recovery after crash)
813
+ * Rename/move a file or directory
814
+ * @param from Source path
815
+ * @param to Destination path
1013
816
  */
1014
- async recoverQueueAsync() {
1015
- await this.client.request(HAEXTENSION_METHODS.filesync.recoverQueue);
1016
- }
1017
- };
1018
-
1019
- // src/api/filesystem.ts
1020
- var FilesystemAPI = class {
1021
- constructor(client) {
1022
- this.client = client;
1023
- this.sync = new FileSyncAPI(client);
1024
- }
1025
- /**
1026
- * Opens a save file dialog and saves the provided data to the selected location
1027
- * @param data The file data as Uint8Array
1028
- * @param options Options for the save dialog
1029
- * @returns The path where the file was saved, or null if cancelled
1030
- */
1031
- async saveFileAsync(data, options = {}) {
1032
- const result = await this.client.request(
1033
- HAEXTENSION_METHODS.filesystem.saveFile,
1034
- {
1035
- data: Array.from(data),
1036
- // Convert Uint8Array to regular array for postMessage
1037
- defaultPath: options.defaultPath,
1038
- title: options.title,
1039
- filters: options.filters
1040
- }
1041
- );
1042
- return result;
1043
- }
1044
- /**
1045
- * Opens a file with the system's default viewer
1046
- * @param data The file data as Uint8Array
1047
- * @param options Options for opening the file
1048
- * @returns The result of the operation
1049
- */
1050
- async openFileAsync(data, options) {
1051
- const result = await this.client.request(
1052
- HAEXTENSION_METHODS.filesystem.openFile,
1053
- {
1054
- data: Array.from(data),
1055
- // Convert Uint8Array to regular array for postMessage
1056
- fileName: options.fileName,
1057
- mimeType: options.mimeType
1058
- }
817
+ async rename(from, to) {
818
+ await this.client.request(
819
+ HAEXTENSION_METHODS.filesystem.rename,
820
+ { from, to }
1059
821
  );
1060
- return result;
1061
822
  }
1062
823
  /**
1063
- * Shows an image using a data URL (safe, read-only viewing)
1064
- * This is safe to use without special permissions as it only displays images
1065
- * and doesn't execute any code or open files with external applications
1066
- * @param options Options containing the data URL
1067
- * @returns The result of the operation
824
+ * Copy a file
825
+ * @param from Source path
826
+ * @param to Destination path
1068
827
  */
1069
- async showImageAsync(options) {
1070
- const result = await this.client.request(
1071
- HAEXTENSION_METHODS.filesystem.showImage,
1072
- {
1073
- dataUrl: options.dataUrl
1074
- }
828
+ async copy(from, to) {
829
+ await this.client.request(
830
+ HAEXTENSION_METHODS.filesystem.copy,
831
+ { from, to }
1075
832
  );
1076
- return result;
1077
833
  }
1078
834
  };
1079
835
 
@@ -1569,7 +1325,20 @@ var TAURI_COMMANDS = {
1569
1325
  filesystem: {
1570
1326
  saveFile: "webview_extension_fs_save_file",
1571
1327
  openFile: "webview_extension_fs_open_file",
1572
- showImage: "webview_extension_fs_show_image"
1328
+ showImage: "webview_extension_fs_show_image",
1329
+ // Generic filesystem operations (no webview_ prefix because they're global)
1330
+ // Permission checks happen in the message handler layer
1331
+ readFile: "filesystem_read_file",
1332
+ writeFile: "filesystem_write_file",
1333
+ readDir: "filesystem_read_dir",
1334
+ mkdir: "filesystem_mkdir",
1335
+ remove: "filesystem_remove",
1336
+ exists: "filesystem_exists",
1337
+ stat: "filesystem_stat",
1338
+ selectFolder: "filesystem_select_folder",
1339
+ selectFile: "filesystem_select_file",
1340
+ rename: "filesystem_rename",
1341
+ copy: "filesystem_copy"
1573
1342
  },
1574
1343
  external: {
1575
1344
  // Response handling (called by extensions running in WebView)
@@ -2857,6 +2626,6 @@ function createHaexVaultSdk(config = {}) {
2857
2626
  return new HaexVaultSdk(config);
2858
2627
  }
2859
2628
 
2860
- export { CONFLICT_STRATEGY, DEFAULT_TIMEOUT, DatabaseAPI, EXTERNAL_EVENTS, ErrorCode, ExternalConnectionErrorCode, ExternalConnectionState, FILE_SYNC_STATE, FileSyncAPI, FilesystemAPI, HAEXSPACE_MESSAGE_TYPES, HAEXTENSION_EVENTS, HAEXTENSION_METHODS, HaexVaultSdk, HaexVaultSdkError, PermissionStatus, PermissionsAPI, QUEUE_OPERATION, QUEUE_STATUS, RemoteStorageAPI, STORAGE_BACKEND_TYPE, SYNC_DIRECTION, TABLE_SEPARATOR, TAURI_COMMANDS, WebAPI, arrayBufferToBase64, base64ToArrayBuffer, canExternalClientSendRequests, createHaexVaultSdk, decryptCrdtData, decryptString, decryptVaultKey, decryptVaultName, deriveKeyFromPassword, encryptCrdtData, encryptString, encryptVaultKey, generateVaultKey, getTableName, hexToBytes, installBaseTag, installCookiePolyfill, installHistoryPolyfill, installLocalStoragePolyfill, installPolyfills, installSessionStoragePolyfill, isExternalClientConnected, sortObjectKeysRecursively, unwrapKey, verifyExtensionSignature, wrapKey };
2629
+ export { DEFAULT_TIMEOUT, DatabaseAPI, EXTERNAL_EVENTS, ErrorCode, ExternalConnectionErrorCode, ExternalConnectionState, FilesystemAPI, HAEXSPACE_MESSAGE_TYPES, HAEXTENSION_EVENTS, HAEXTENSION_METHODS, HaexVaultSdk, HaexVaultSdkError, PermissionStatus, PermissionsAPI, RemoteStorageAPI, TABLE_SEPARATOR, TAURI_COMMANDS, WebAPI, arrayBufferToBase64, base64ToArrayBuffer, canExternalClientSendRequests, createHaexVaultSdk, decryptCrdtData, decryptString, decryptVaultKey, decryptVaultName, deriveKeyFromPassword, encryptCrdtData, encryptString, encryptVaultKey, generateVaultKey, getTableName, hexToBytes, installBaseTag, installCookiePolyfill, installHistoryPolyfill, installLocalStoragePolyfill, installPolyfills, installSessionStoragePolyfill, isExternalClientConnected, sortObjectKeysRecursively, unwrapKey, verifyExtensionSignature, wrapKey };
2861
2630
  //# sourceMappingURL=index.mjs.map
2862
2631
  //# sourceMappingURL=index.mjs.map