@haex-space/vault-sdk 2.3.14 → 2.3.16

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.js CHANGED
@@ -394,7 +394,37 @@ var HAEXTENSION_METHODS = {
394
394
  filesystem: {
395
395
  saveFile: "haextension:filesystem:save-file",
396
396
  openFile: "haextension:filesystem:open-file",
397
- showImage: "haextension:filesystem:show-image"
397
+ showImage: "haextension:filesystem:show-image",
398
+ sync: {
399
+ // Spaces
400
+ listSpaces: "haextension:filesystem:sync:list-spaces",
401
+ createSpace: "haextension:filesystem:sync:create-space",
402
+ deleteSpace: "haextension:filesystem:sync:delete-space",
403
+ // Files
404
+ listFiles: "haextension:filesystem:sync:list-files",
405
+ getFile: "haextension:filesystem:sync:get-file",
406
+ uploadFile: "haextension:filesystem:sync:upload-file",
407
+ downloadFile: "haextension:filesystem:sync:download-file",
408
+ deleteFile: "haextension:filesystem:sync:delete-file",
409
+ // Backends
410
+ listBackends: "haextension:filesystem:sync:list-backends",
411
+ addBackend: "haextension:filesystem:sync:add-backend",
412
+ removeBackend: "haextension:filesystem:sync:remove-backend",
413
+ testBackend: "haextension:filesystem:sync:test-backend",
414
+ // Sync Rules
415
+ listSyncRules: "haextension:filesystem:sync:list-sync-rules",
416
+ addSyncRule: "haextension:filesystem:sync:add-sync-rule",
417
+ removeSyncRule: "haextension:filesystem:sync:remove-sync-rule",
418
+ // Sync Operations
419
+ getSyncStatus: "haextension:filesystem:sync:get-sync-status",
420
+ triggerSync: "haextension:filesystem:sync:trigger-sync",
421
+ pauseSync: "haextension:filesystem:sync:pause-sync",
422
+ resumeSync: "haextension:filesystem:sync:resume-sync",
423
+ // Conflict Resolution
424
+ resolveConflict: "haextension:filesystem:sync:resolve-conflict",
425
+ // UI Helpers
426
+ selectFolder: "haextension:filesystem:sync:select-folder"
427
+ }
398
428
  },
399
429
  storage: {
400
430
  getItem: "haextension:storage:get-item",
@@ -590,10 +620,210 @@ var DatabaseAPI = class {
590
620
  }
591
621
  };
592
622
 
623
+ // src/api/filesync.ts
624
+ var FileSyncAPI = class {
625
+ constructor(client) {
626
+ this.client = client;
627
+ }
628
+ // --------------------------------------------------------------------------
629
+ // Spaces
630
+ // --------------------------------------------------------------------------
631
+ /**
632
+ * List all file spaces
633
+ */
634
+ async listSpacesAsync() {
635
+ return this.client.request(
636
+ HAEXTENSION_METHODS.filesystem.sync.listSpaces
637
+ );
638
+ }
639
+ /**
640
+ * Create a new file space
641
+ */
642
+ async createSpaceAsync(options) {
643
+ return this.client.request(
644
+ HAEXTENSION_METHODS.filesystem.sync.createSpace,
645
+ options
646
+ );
647
+ }
648
+ /**
649
+ * Delete a file space
650
+ */
651
+ async deleteSpaceAsync(spaceId) {
652
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.deleteSpace, {
653
+ spaceId
654
+ });
655
+ }
656
+ // --------------------------------------------------------------------------
657
+ // Files
658
+ // --------------------------------------------------------------------------
659
+ /**
660
+ * List files in a space
661
+ */
662
+ async listFilesAsync(options) {
663
+ return this.client.request(
664
+ HAEXTENSION_METHODS.filesystem.sync.listFiles,
665
+ options
666
+ );
667
+ }
668
+ /**
669
+ * Get file info by ID
670
+ */
671
+ async getFileAsync(fileId) {
672
+ return this.client.request(
673
+ HAEXTENSION_METHODS.filesystem.sync.getFile,
674
+ { fileId }
675
+ );
676
+ }
677
+ /**
678
+ * Upload a file to the sync system
679
+ */
680
+ async uploadFileAsync(options) {
681
+ return this.client.request(
682
+ HAEXTENSION_METHODS.filesystem.sync.uploadFile,
683
+ options
684
+ );
685
+ }
686
+ /**
687
+ * Download a file to local storage
688
+ */
689
+ async downloadFileAsync(options) {
690
+ await this.client.request(
691
+ HAEXTENSION_METHODS.filesystem.sync.downloadFile,
692
+ options
693
+ );
694
+ }
695
+ /**
696
+ * Delete a file from the sync system
697
+ */
698
+ async deleteFileAsync(fileId) {
699
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.deleteFile, {
700
+ fileId
701
+ });
702
+ }
703
+ // --------------------------------------------------------------------------
704
+ // Storage Backends
705
+ // --------------------------------------------------------------------------
706
+ /**
707
+ * List configured storage backends
708
+ */
709
+ async listBackendsAsync() {
710
+ return this.client.request(
711
+ HAEXTENSION_METHODS.filesystem.sync.listBackends
712
+ );
713
+ }
714
+ /**
715
+ * Add a new storage backend
716
+ */
717
+ async addBackendAsync(options) {
718
+ return this.client.request(
719
+ HAEXTENSION_METHODS.filesystem.sync.addBackend,
720
+ options
721
+ );
722
+ }
723
+ /**
724
+ * Remove a storage backend
725
+ */
726
+ async removeBackendAsync(backendId) {
727
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.removeBackend, {
728
+ backendId
729
+ });
730
+ }
731
+ /**
732
+ * Test backend connection
733
+ */
734
+ async testBackendAsync(backendId) {
735
+ return this.client.request(
736
+ HAEXTENSION_METHODS.filesystem.sync.testBackend,
737
+ { backendId }
738
+ );
739
+ }
740
+ // --------------------------------------------------------------------------
741
+ // Sync Rules
742
+ // --------------------------------------------------------------------------
743
+ /**
744
+ * List sync rules
745
+ */
746
+ async listSyncRulesAsync() {
747
+ return this.client.request(
748
+ HAEXTENSION_METHODS.filesystem.sync.listSyncRules
749
+ );
750
+ }
751
+ /**
752
+ * Add a sync rule
753
+ */
754
+ async addSyncRuleAsync(options) {
755
+ return this.client.request(
756
+ HAEXTENSION_METHODS.filesystem.sync.addSyncRule,
757
+ options
758
+ );
759
+ }
760
+ /**
761
+ * Remove a sync rule
762
+ */
763
+ async removeSyncRuleAsync(ruleId) {
764
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.removeSyncRule, {
765
+ ruleId
766
+ });
767
+ }
768
+ // --------------------------------------------------------------------------
769
+ // Sync Operations
770
+ // --------------------------------------------------------------------------
771
+ /**
772
+ * Get current sync status
773
+ */
774
+ async getSyncStatusAsync() {
775
+ return this.client.request(
776
+ HAEXTENSION_METHODS.filesystem.sync.getSyncStatus
777
+ );
778
+ }
779
+ /**
780
+ * Trigger a manual sync
781
+ */
782
+ async triggerSyncAsync() {
783
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.triggerSync);
784
+ }
785
+ /**
786
+ * Pause syncing
787
+ */
788
+ async pauseSyncAsync() {
789
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.pauseSync);
790
+ }
791
+ /**
792
+ * Resume syncing
793
+ */
794
+ async resumeSyncAsync() {
795
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.resumeSync);
796
+ }
797
+ // --------------------------------------------------------------------------
798
+ // Conflict Resolution
799
+ // --------------------------------------------------------------------------
800
+ /**
801
+ * Resolve a file conflict
802
+ */
803
+ async resolveConflictAsync(fileId, resolution) {
804
+ await this.client.request(HAEXTENSION_METHODS.filesystem.sync.resolveConflict, {
805
+ fileId,
806
+ resolution
807
+ });
808
+ }
809
+ // --------------------------------------------------------------------------
810
+ // Folder Selection (Native Dialog)
811
+ // --------------------------------------------------------------------------
812
+ /**
813
+ * Open a folder selection dialog
814
+ */
815
+ async selectFolderAsync() {
816
+ return this.client.request(
817
+ HAEXTENSION_METHODS.filesystem.sync.selectFolder
818
+ );
819
+ }
820
+ };
821
+
593
822
  // src/api/filesystem.ts
594
823
  var FilesystemAPI = class {
595
824
  constructor(client) {
596
825
  this.client = client;
826
+ this.sync = new FileSyncAPI(client);
597
827
  }
598
828
  /**
599
829
  * Opens a save file dialog and saves the provided data to the selected location
@@ -1117,11 +1347,12 @@ var HaexVaultClient = class {
1117
1347
  async respondToExternalRequest(response) {
1118
1348
  await this.request("external.respond", response);
1119
1349
  }
1120
- async request(method, params = {}) {
1350
+ async request(method, params) {
1351
+ const resolvedParams = params ?? {};
1121
1352
  if (this.isNativeWindow && typeof window.__TAURI__ !== "undefined") {
1122
- return this.invoke(method, params);
1353
+ return this.invoke(method, resolvedParams);
1123
1354
  }
1124
- return this.postMessage(method, params);
1355
+ return this.postMessage(method, resolvedParams);
1125
1356
  }
1126
1357
  async postMessage(method, params) {
1127
1358
  const requestId = this.generateRequestId();
@@ -1749,6 +1980,42 @@ async function encryptCrdtData(data, vaultKey) {
1749
1980
  nonce: arrayBufferToBase64(nonce)
1750
1981
  };
1751
1982
  }
1983
+ async function wrapKey(keyToWrap, wrappingKey) {
1984
+ const cryptoKey = await crypto.subtle.importKey(
1985
+ "raw",
1986
+ new Uint8Array(wrappingKey),
1987
+ { name: ALGORITHM },
1988
+ false,
1989
+ ["encrypt"]
1990
+ );
1991
+ const nonce = crypto.getRandomValues(new Uint8Array(12));
1992
+ const ciphertext = await crypto.subtle.encrypt(
1993
+ { name: ALGORITHM, iv: nonce },
1994
+ cryptoKey,
1995
+ new Uint8Array(keyToWrap)
1996
+ );
1997
+ const result = new Uint8Array(12 + ciphertext.byteLength);
1998
+ result.set(nonce, 0);
1999
+ result.set(new Uint8Array(ciphertext), 12);
2000
+ return result;
2001
+ }
2002
+ async function unwrapKey(wrappedKey, wrappingKey) {
2003
+ const cryptoKey = await crypto.subtle.importKey(
2004
+ "raw",
2005
+ new Uint8Array(wrappingKey),
2006
+ { name: ALGORITHM },
2007
+ false,
2008
+ ["decrypt"]
2009
+ );
2010
+ const nonce = wrappedKey.slice(0, 12);
2011
+ const ciphertext = wrappedKey.slice(12);
2012
+ const plaintext = await crypto.subtle.decrypt(
2013
+ { name: ALGORITHM, iv: nonce },
2014
+ cryptoKey,
2015
+ ciphertext
2016
+ );
2017
+ return new Uint8Array(plaintext);
2018
+ }
1752
2019
  async function decryptCrdtData(encryptedData, nonce, vaultKey) {
1753
2020
  const vaultKeyBuffer = new Uint8Array(vaultKey);
1754
2021
  const cryptoKey = await crypto.subtle.importKey(
@@ -1808,6 +2075,7 @@ function createHaexVaultClient(config = {}) {
1808
2075
  exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
1809
2076
  exports.DatabaseAPI = DatabaseAPI;
1810
2077
  exports.ErrorCode = ErrorCode;
2078
+ exports.FileSyncAPI = FileSyncAPI;
1811
2079
  exports.FilesystemAPI = FilesystemAPI;
1812
2080
  exports.HAEXSPACE_MESSAGE_TYPES = HAEXSPACE_MESSAGE_TYPES;
1813
2081
  exports.HAEXTENSION_EVENTS = HAEXTENSION_EVENTS;
@@ -1839,6 +2107,8 @@ exports.installLocalStoragePolyfill = installLocalStoragePolyfill;
1839
2107
  exports.installPolyfills = installPolyfills;
1840
2108
  exports.installSessionStoragePolyfill = installSessionStoragePolyfill;
1841
2109
  exports.sortObjectKeysRecursively = sortObjectKeysRecursively;
2110
+ exports.unwrapKey = unwrapKey;
1842
2111
  exports.verifyExtensionSignature = verifyExtensionSignature;
2112
+ exports.wrapKey = wrapKey;
1843
2113
  //# sourceMappingURL=index.js.map
1844
2114
  //# sourceMappingURL=index.js.map