@haex-space/vault-sdk 2.5.43 → 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/{client-9QruY0rX.d.mts → client-BDxVgihp.d.mts} +1 -408
- package/dist/{client-Bp4IqvzW.d.ts → client-Bgu2k1yJ.d.ts} +1 -408
- package/dist/index.d.mts +2 -37
- package/dist/index.d.ts +2 -37
- package/dist/index.js +0 -393
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -387
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/react.js +0 -344
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +0 -344
- package/dist/react.mjs.map +1 -1
- package/dist/runtime/nuxt.plugin.client.d.mts +1 -1
- package/dist/runtime/nuxt.plugin.client.d.ts +1 -1
- package/dist/runtime/nuxt.plugin.client.js +0 -344
- package/dist/runtime/nuxt.plugin.client.js.map +1 -1
- package/dist/runtime/nuxt.plugin.client.mjs +0 -344
- package/dist/runtime/nuxt.plugin.client.mjs.map +1 -1
- package/dist/svelte.d.mts +1 -1
- package/dist/svelte.d.ts +1 -1
- package/dist/svelte.js +0 -344
- package/dist/svelte.js.map +1 -1
- package/dist/svelte.mjs +0 -344
- package/dist/svelte.mjs.map +1 -1
- package/dist/vue.d.mts +1 -1
- package/dist/vue.d.ts +1 -1
- package/dist/vue.js +0 -344
- package/dist/vue.js.map +1 -1
- package/dist/vue.mjs +0 -344
- package/dist/vue.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -501,49 +501,6 @@ var HAEXTENSION_METHODS = {
|
|
|
501
501
|
rename: "haextension:filesystem:rename",
|
|
502
502
|
copy: "haextension:filesystem:copy"
|
|
503
503
|
},
|
|
504
|
-
filesync: {
|
|
505
|
-
// Spaces
|
|
506
|
-
listSpaces: "haextension:filesync:list-spaces",
|
|
507
|
-
createSpace: "haextension:filesync:create-space",
|
|
508
|
-
deleteSpace: "haextension:filesync:delete-space",
|
|
509
|
-
// Files
|
|
510
|
-
listFiles: "haextension:filesync:list-files",
|
|
511
|
-
getFile: "haextension:filesync:get-file",
|
|
512
|
-
uploadFile: "haextension:filesync:upload-file",
|
|
513
|
-
downloadFile: "haextension:filesync:download-file",
|
|
514
|
-
deleteFile: "haextension:filesync:delete-file",
|
|
515
|
-
// Backends
|
|
516
|
-
listBackends: "haextension:filesync:list-backends",
|
|
517
|
-
addBackend: "haextension:filesync:add-backend",
|
|
518
|
-
removeBackend: "haextension:filesync:remove-backend",
|
|
519
|
-
testBackend: "haextension:filesync:test-backend",
|
|
520
|
-
// Sync Rules
|
|
521
|
-
listSyncRules: "haextension:filesync:list-sync-rules",
|
|
522
|
-
addSyncRule: "haextension:filesync:add-sync-rule",
|
|
523
|
-
updateSyncRule: "haextension:filesync:update-sync-rule",
|
|
524
|
-
removeSyncRule: "haextension:filesync:remove-sync-rule",
|
|
525
|
-
// Sync Operations
|
|
526
|
-
getSyncStatus: "haextension:filesync:get-sync-status",
|
|
527
|
-
triggerSync: "haextension:filesync:trigger-sync",
|
|
528
|
-
pauseSync: "haextension:filesync:pause-sync",
|
|
529
|
-
resumeSync: "haextension:filesync:resume-sync",
|
|
530
|
-
// Conflict Resolution
|
|
531
|
-
resolveConflict: "haextension:filesync:resolve-conflict",
|
|
532
|
-
// UI Helpers
|
|
533
|
-
selectFolder: "haextension:filesync:select-folder",
|
|
534
|
-
scanLocal: "haextension:filesync:scan-local",
|
|
535
|
-
// Sync Queue (persistent upload/download queue)
|
|
536
|
-
addToQueue: "haextension:filesync:add-to-queue",
|
|
537
|
-
getQueue: "haextension:filesync:get-queue",
|
|
538
|
-
getQueueSummary: "haextension:filesync:get-queue-summary",
|
|
539
|
-
startQueueEntry: "haextension:filesync:start-queue-entry",
|
|
540
|
-
completeQueueEntry: "haextension:filesync:complete-queue-entry",
|
|
541
|
-
failQueueEntry: "haextension:filesync:fail-queue-entry",
|
|
542
|
-
retryFailedQueue: "haextension:filesync:retry-failed-queue",
|
|
543
|
-
removeQueueEntry: "haextension:filesync:remove-queue-entry",
|
|
544
|
-
clearQueue: "haextension:filesync:clear-queue",
|
|
545
|
-
recoverQueue: "haextension:filesync:recover-queue"
|
|
546
|
-
},
|
|
547
504
|
storage: {
|
|
548
505
|
getItem: "haextension:storage:get-item",
|
|
549
506
|
setItem: "haextension:storage:set-item",
|
|
@@ -688,353 +645,10 @@ var DatabaseAPI = class {
|
|
|
688
645
|
}
|
|
689
646
|
};
|
|
690
647
|
|
|
691
|
-
// src/api/filesync.ts
|
|
692
|
-
var FILE_SYNC_STATE = {
|
|
693
|
-
SYNCED: "synced",
|
|
694
|
-
SYNCING: "syncing",
|
|
695
|
-
LOCAL_ONLY: "localOnly",
|
|
696
|
-
REMOTE_ONLY: "remoteOnly",
|
|
697
|
-
CONFLICT: "conflict",
|
|
698
|
-
ERROR: "error"
|
|
699
|
-
};
|
|
700
|
-
var SYNC_DIRECTION = {
|
|
701
|
-
UP: "up",
|
|
702
|
-
DOWN: "down",
|
|
703
|
-
BOTH: "both"
|
|
704
|
-
};
|
|
705
|
-
var STORAGE_BACKEND_TYPE = {
|
|
706
|
-
S3: "s3",
|
|
707
|
-
R2: "r2",
|
|
708
|
-
MINIO: "minio",
|
|
709
|
-
GDRIVE: "gdrive",
|
|
710
|
-
DROPBOX: "dropbox"
|
|
711
|
-
};
|
|
712
|
-
var CONFLICT_STRATEGY = {
|
|
713
|
-
/** Always prefer local version */
|
|
714
|
-
LOCAL: "local",
|
|
715
|
-
/** Always prefer remote version */
|
|
716
|
-
REMOTE: "remote",
|
|
717
|
-
/** Prefer newer version (Last-Writer-Wins) */
|
|
718
|
-
NEWER: "newer",
|
|
719
|
-
/** Ask user to resolve each conflict manually */
|
|
720
|
-
ASK: "ask",
|
|
721
|
-
/** Keep both versions (create conflict copy) */
|
|
722
|
-
KEEP_BOTH: "keepBoth"
|
|
723
|
-
};
|
|
724
|
-
var QUEUE_OPERATION = {
|
|
725
|
-
UPLOAD: "upload",
|
|
726
|
-
DOWNLOAD: "download"
|
|
727
|
-
};
|
|
728
|
-
var QUEUE_STATUS = {
|
|
729
|
-
PENDING: "pending",
|
|
730
|
-
IN_PROGRESS: "inProgress",
|
|
731
|
-
COMPLETED: "completed",
|
|
732
|
-
FAILED: "failed"
|
|
733
|
-
};
|
|
734
|
-
var FileSyncAPI = class {
|
|
735
|
-
constructor(client) {
|
|
736
|
-
this.client = client;
|
|
737
|
-
}
|
|
738
|
-
// --------------------------------------------------------------------------
|
|
739
|
-
// Spaces
|
|
740
|
-
// --------------------------------------------------------------------------
|
|
741
|
-
/**
|
|
742
|
-
* List all file spaces
|
|
743
|
-
*/
|
|
744
|
-
async listSpacesAsync() {
|
|
745
|
-
return this.client.request(
|
|
746
|
-
HAEXTENSION_METHODS.filesync.listSpaces
|
|
747
|
-
);
|
|
748
|
-
}
|
|
749
|
-
/**
|
|
750
|
-
* Create a new file space
|
|
751
|
-
*/
|
|
752
|
-
async createSpaceAsync(options) {
|
|
753
|
-
return this.client.request(
|
|
754
|
-
HAEXTENSION_METHODS.filesync.createSpace,
|
|
755
|
-
options
|
|
756
|
-
);
|
|
757
|
-
}
|
|
758
|
-
/**
|
|
759
|
-
* Delete a file space
|
|
760
|
-
*/
|
|
761
|
-
async deleteSpaceAsync(spaceId) {
|
|
762
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.deleteSpace, {
|
|
763
|
-
spaceId
|
|
764
|
-
});
|
|
765
|
-
}
|
|
766
|
-
// --------------------------------------------------------------------------
|
|
767
|
-
// Files
|
|
768
|
-
// --------------------------------------------------------------------------
|
|
769
|
-
/**
|
|
770
|
-
* List files in a space
|
|
771
|
-
*/
|
|
772
|
-
async listFilesAsync(options) {
|
|
773
|
-
return this.client.request(
|
|
774
|
-
HAEXTENSION_METHODS.filesync.listFiles,
|
|
775
|
-
options
|
|
776
|
-
);
|
|
777
|
-
}
|
|
778
|
-
/**
|
|
779
|
-
* Scan local files in a sync rule folder
|
|
780
|
-
* Returns unencrypted local files for display in the UI
|
|
781
|
-
*/
|
|
782
|
-
async scanLocalAsync(options) {
|
|
783
|
-
return this.client.request(
|
|
784
|
-
HAEXTENSION_METHODS.filesync.scanLocal,
|
|
785
|
-
options
|
|
786
|
-
);
|
|
787
|
-
}
|
|
788
|
-
/**
|
|
789
|
-
* Get file info by ID
|
|
790
|
-
*/
|
|
791
|
-
async getFileAsync(fileId) {
|
|
792
|
-
return this.client.request(
|
|
793
|
-
HAEXTENSION_METHODS.filesync.getFile,
|
|
794
|
-
{ fileId }
|
|
795
|
-
);
|
|
796
|
-
}
|
|
797
|
-
/**
|
|
798
|
-
* Upload a file to the sync system
|
|
799
|
-
*/
|
|
800
|
-
async uploadFileAsync(options) {
|
|
801
|
-
return this.client.request(
|
|
802
|
-
HAEXTENSION_METHODS.filesync.uploadFile,
|
|
803
|
-
options
|
|
804
|
-
);
|
|
805
|
-
}
|
|
806
|
-
/**
|
|
807
|
-
* Download a file to local storage
|
|
808
|
-
*/
|
|
809
|
-
async downloadFileAsync(options) {
|
|
810
|
-
await this.client.request(
|
|
811
|
-
HAEXTENSION_METHODS.filesync.downloadFile,
|
|
812
|
-
options
|
|
813
|
-
);
|
|
814
|
-
}
|
|
815
|
-
/**
|
|
816
|
-
* Delete a file from the sync system
|
|
817
|
-
*/
|
|
818
|
-
async deleteFileAsync(fileId) {
|
|
819
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.deleteFile, {
|
|
820
|
-
fileId
|
|
821
|
-
});
|
|
822
|
-
}
|
|
823
|
-
// --------------------------------------------------------------------------
|
|
824
|
-
// Storage Backends
|
|
825
|
-
// --------------------------------------------------------------------------
|
|
826
|
-
/**
|
|
827
|
-
* List configured storage backends
|
|
828
|
-
*/
|
|
829
|
-
async listBackendsAsync() {
|
|
830
|
-
return this.client.request(
|
|
831
|
-
HAEXTENSION_METHODS.filesync.listBackends
|
|
832
|
-
);
|
|
833
|
-
}
|
|
834
|
-
/**
|
|
835
|
-
* Add a new storage backend
|
|
836
|
-
*/
|
|
837
|
-
async addBackendAsync(options) {
|
|
838
|
-
return this.client.request(
|
|
839
|
-
HAEXTENSION_METHODS.filesync.addBackend,
|
|
840
|
-
options
|
|
841
|
-
);
|
|
842
|
-
}
|
|
843
|
-
/**
|
|
844
|
-
* Remove a storage backend
|
|
845
|
-
*/
|
|
846
|
-
async removeBackendAsync(backendId) {
|
|
847
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.removeBackend, {
|
|
848
|
-
backendId
|
|
849
|
-
});
|
|
850
|
-
}
|
|
851
|
-
/**
|
|
852
|
-
* Test backend connection
|
|
853
|
-
*/
|
|
854
|
-
async testBackendAsync(backendId) {
|
|
855
|
-
return this.client.request(
|
|
856
|
-
HAEXTENSION_METHODS.filesync.testBackend,
|
|
857
|
-
{ backendId }
|
|
858
|
-
);
|
|
859
|
-
}
|
|
860
|
-
// --------------------------------------------------------------------------
|
|
861
|
-
// Sync Rules
|
|
862
|
-
// --------------------------------------------------------------------------
|
|
863
|
-
/**
|
|
864
|
-
* List sync rules
|
|
865
|
-
*/
|
|
866
|
-
async listSyncRulesAsync() {
|
|
867
|
-
return this.client.request(
|
|
868
|
-
HAEXTENSION_METHODS.filesync.listSyncRules
|
|
869
|
-
);
|
|
870
|
-
}
|
|
871
|
-
/**
|
|
872
|
-
* Add a sync rule
|
|
873
|
-
*/
|
|
874
|
-
async addSyncRuleAsync(options) {
|
|
875
|
-
return this.client.request(
|
|
876
|
-
HAEXTENSION_METHODS.filesync.addSyncRule,
|
|
877
|
-
options
|
|
878
|
-
);
|
|
879
|
-
}
|
|
880
|
-
/**
|
|
881
|
-
* Update a sync rule
|
|
882
|
-
*/
|
|
883
|
-
async updateSyncRuleAsync(options) {
|
|
884
|
-
return this.client.request(
|
|
885
|
-
HAEXTENSION_METHODS.filesync.updateSyncRule,
|
|
886
|
-
options
|
|
887
|
-
);
|
|
888
|
-
}
|
|
889
|
-
/**
|
|
890
|
-
* Remove a sync rule
|
|
891
|
-
*/
|
|
892
|
-
async removeSyncRuleAsync(ruleId) {
|
|
893
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.removeSyncRule, {
|
|
894
|
-
ruleId
|
|
895
|
-
});
|
|
896
|
-
}
|
|
897
|
-
// --------------------------------------------------------------------------
|
|
898
|
-
// Sync Operations
|
|
899
|
-
// --------------------------------------------------------------------------
|
|
900
|
-
/**
|
|
901
|
-
* Get current sync status
|
|
902
|
-
*/
|
|
903
|
-
async getSyncStatusAsync() {
|
|
904
|
-
return this.client.request(
|
|
905
|
-
HAEXTENSION_METHODS.filesync.getSyncStatus
|
|
906
|
-
);
|
|
907
|
-
}
|
|
908
|
-
/**
|
|
909
|
-
* Trigger a manual sync
|
|
910
|
-
*/
|
|
911
|
-
async triggerSyncAsync() {
|
|
912
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.triggerSync);
|
|
913
|
-
}
|
|
914
|
-
/**
|
|
915
|
-
* Pause syncing
|
|
916
|
-
*/
|
|
917
|
-
async pauseSyncAsync() {
|
|
918
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.pauseSync);
|
|
919
|
-
}
|
|
920
|
-
/**
|
|
921
|
-
* Resume syncing
|
|
922
|
-
*/
|
|
923
|
-
async resumeSyncAsync() {
|
|
924
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.resumeSync);
|
|
925
|
-
}
|
|
926
|
-
// --------------------------------------------------------------------------
|
|
927
|
-
// Conflict Resolution
|
|
928
|
-
// --------------------------------------------------------------------------
|
|
929
|
-
/**
|
|
930
|
-
* Resolve a file conflict
|
|
931
|
-
*/
|
|
932
|
-
async resolveConflictAsync(fileId, resolution) {
|
|
933
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.resolveConflict, {
|
|
934
|
-
fileId,
|
|
935
|
-
resolution
|
|
936
|
-
});
|
|
937
|
-
}
|
|
938
|
-
// --------------------------------------------------------------------------
|
|
939
|
-
// Folder Selection (Native Dialog)
|
|
940
|
-
// --------------------------------------------------------------------------
|
|
941
|
-
/**
|
|
942
|
-
* Open a folder selection dialog
|
|
943
|
-
*/
|
|
944
|
-
async selectFolderAsync() {
|
|
945
|
-
return this.client.request(
|
|
946
|
-
HAEXTENSION_METHODS.filesync.selectFolder
|
|
947
|
-
);
|
|
948
|
-
}
|
|
949
|
-
// --------------------------------------------------------------------------
|
|
950
|
-
// Sync Queue
|
|
951
|
-
// --------------------------------------------------------------------------
|
|
952
|
-
/**
|
|
953
|
-
* Add files to the sync queue
|
|
954
|
-
*/
|
|
955
|
-
async addToQueueAsync(options) {
|
|
956
|
-
return this.client.request(
|
|
957
|
-
HAEXTENSION_METHODS.filesync.addToQueue,
|
|
958
|
-
options
|
|
959
|
-
);
|
|
960
|
-
}
|
|
961
|
-
/**
|
|
962
|
-
* Get queue entries for the current device
|
|
963
|
-
*/
|
|
964
|
-
async getQueueAsync(options) {
|
|
965
|
-
return this.client.request(
|
|
966
|
-
HAEXTENSION_METHODS.filesync.getQueue,
|
|
967
|
-
options
|
|
968
|
-
);
|
|
969
|
-
}
|
|
970
|
-
/**
|
|
971
|
-
* Get aggregated queue summary for the current device
|
|
972
|
-
*/
|
|
973
|
-
async getQueueSummaryAsync() {
|
|
974
|
-
return this.client.request(
|
|
975
|
-
HAEXTENSION_METHODS.filesync.getQueueSummary
|
|
976
|
-
);
|
|
977
|
-
}
|
|
978
|
-
/**
|
|
979
|
-
* Mark a queue entry as started (in_progress)
|
|
980
|
-
*/
|
|
981
|
-
async startQueueEntryAsync(entryId) {
|
|
982
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.startQueueEntry, {
|
|
983
|
-
entryId
|
|
984
|
-
});
|
|
985
|
-
}
|
|
986
|
-
/**
|
|
987
|
-
* Mark a queue entry as completed
|
|
988
|
-
*/
|
|
989
|
-
async completeQueueEntryAsync(entryId) {
|
|
990
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.completeQueueEntry, {
|
|
991
|
-
entryId
|
|
992
|
-
});
|
|
993
|
-
}
|
|
994
|
-
/**
|
|
995
|
-
* Mark a queue entry as failed
|
|
996
|
-
*/
|
|
997
|
-
async failQueueEntryAsync(entryId, errorMessage) {
|
|
998
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.failQueueEntry, {
|
|
999
|
-
entryId,
|
|
1000
|
-
errorMessage
|
|
1001
|
-
});
|
|
1002
|
-
}
|
|
1003
|
-
/**
|
|
1004
|
-
* Retry all failed queue entries (reset to pending)
|
|
1005
|
-
*/
|
|
1006
|
-
async retryFailedQueueAsync() {
|
|
1007
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.retryFailedQueue);
|
|
1008
|
-
}
|
|
1009
|
-
/**
|
|
1010
|
-
* Remove a queue entry
|
|
1011
|
-
*/
|
|
1012
|
-
async removeQueueEntryAsync(entryId) {
|
|
1013
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.removeQueueEntry, {
|
|
1014
|
-
entryId
|
|
1015
|
-
});
|
|
1016
|
-
}
|
|
1017
|
-
/**
|
|
1018
|
-
* Clear all queue entries for a sync rule
|
|
1019
|
-
*/
|
|
1020
|
-
async clearQueueAsync(ruleId) {
|
|
1021
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.clearQueue, {
|
|
1022
|
-
ruleId
|
|
1023
|
-
});
|
|
1024
|
-
}
|
|
1025
|
-
/**
|
|
1026
|
-
* Reset in_progress entries to pending (for recovery after crash)
|
|
1027
|
-
*/
|
|
1028
|
-
async recoverQueueAsync() {
|
|
1029
|
-
await this.client.request(HAEXTENSION_METHODS.filesync.recoverQueue);
|
|
1030
|
-
}
|
|
1031
|
-
};
|
|
1032
|
-
|
|
1033
648
|
// src/api/filesystem.ts
|
|
1034
649
|
var FilesystemAPI = class {
|
|
1035
650
|
constructor(client) {
|
|
1036
651
|
this.client = client;
|
|
1037
|
-
this.sync = new FileSyncAPI(client);
|
|
1038
652
|
}
|
|
1039
653
|
/**
|
|
1040
654
|
* Opens a save file dialog and saves the provided data to the selected location
|
|
@@ -3014,15 +2628,12 @@ function createHaexVaultSdk(config = {}) {
|
|
|
3014
2628
|
return new HaexVaultSdk(config);
|
|
3015
2629
|
}
|
|
3016
2630
|
|
|
3017
|
-
exports.CONFLICT_STRATEGY = CONFLICT_STRATEGY;
|
|
3018
2631
|
exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
|
|
3019
2632
|
exports.DatabaseAPI = DatabaseAPI;
|
|
3020
2633
|
exports.EXTERNAL_EVENTS = EXTERNAL_EVENTS;
|
|
3021
2634
|
exports.ErrorCode = ErrorCode;
|
|
3022
2635
|
exports.ExternalConnectionErrorCode = ExternalConnectionErrorCode;
|
|
3023
2636
|
exports.ExternalConnectionState = ExternalConnectionState;
|
|
3024
|
-
exports.FILE_SYNC_STATE = FILE_SYNC_STATE;
|
|
3025
|
-
exports.FileSyncAPI = FileSyncAPI;
|
|
3026
2637
|
exports.FilesystemAPI = FilesystemAPI;
|
|
3027
2638
|
exports.HAEXSPACE_MESSAGE_TYPES = HAEXSPACE_MESSAGE_TYPES;
|
|
3028
2639
|
exports.HAEXTENSION_EVENTS = HAEXTENSION_EVENTS;
|
|
@@ -3031,11 +2642,7 @@ exports.HaexVaultSdk = HaexVaultSdk;
|
|
|
3031
2642
|
exports.HaexVaultSdkError = HaexVaultSdkError;
|
|
3032
2643
|
exports.PermissionStatus = PermissionStatus;
|
|
3033
2644
|
exports.PermissionsAPI = PermissionsAPI;
|
|
3034
|
-
exports.QUEUE_OPERATION = QUEUE_OPERATION;
|
|
3035
|
-
exports.QUEUE_STATUS = QUEUE_STATUS;
|
|
3036
2645
|
exports.RemoteStorageAPI = RemoteStorageAPI;
|
|
3037
|
-
exports.STORAGE_BACKEND_TYPE = STORAGE_BACKEND_TYPE;
|
|
3038
|
-
exports.SYNC_DIRECTION = SYNC_DIRECTION;
|
|
3039
2646
|
exports.TABLE_SEPARATOR = TABLE_SEPARATOR;
|
|
3040
2647
|
exports.TAURI_COMMANDS = TAURI_COMMANDS;
|
|
3041
2648
|
exports.WebAPI = WebAPI;
|