react-native-cloud-storage 2.2.2 → 3.0.0
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/LICENSE +1 -1
- package/README.md +1 -1
- package/android/build.gradle +88 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/voicekit/CloudStorageError.kt +86 -0
- package/android/src/main/java/com/voicekit/CloudStorageLocalFileSystemModule.kt +232 -0
- package/android/src/main/java/com/voicekit/CloudStoragePackage.kt +32 -0
- package/android/src/main/java/com/voicekit/FileUtils.kt +41 -0
- package/android/src/main/java/com/voicekit/Types.kt +6 -0
- package/app.plugin.js +1 -1
- package/{lib/commonjs/RNCloudStorage.js → dist/commonjs/cloud-storage.js} +177 -92
- package/dist/commonjs/cloud-storage.js.map +1 -0
- package/dist/commonjs/expo-plugin/index.js +13 -0
- package/dist/commonjs/expo-plugin/index.js.map +1 -0
- package/{lib/commonjs/expo-plugin/withRNCloudStorageIos.js → dist/commonjs/expo-plugin/ios.js} +1 -1
- package/dist/commonjs/expo-plugin/ios.js.map +1 -0
- package/{lib/commonjs/hooks/useCloudFile.js → dist/commonjs/hooks/use-cloud-file.js} +26 -8
- package/dist/commonjs/hooks/use-cloud-file.js.map +1 -0
- package/{lib/commonjs/hooks/useIsCloudAvailable.js → dist/commonjs/hooks/use-is-cloud-available.js} +3 -3
- package/dist/commonjs/hooks/use-is-cloud-available.js.map +1 -0
- package/{lib → dist}/commonjs/index.js +10 -10
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/specs/NativeCloudStorageCloudKitIOS.js +9 -0
- package/dist/commonjs/specs/NativeCloudStorageCloudKitIOS.js.map +1 -0
- package/dist/commonjs/specs/NativeCloudStorageLocalFileSystem.js +9 -0
- package/dist/commonjs/specs/NativeCloudStorageLocalFileSystem.js.map +1 -0
- package/dist/commonjs/storages/cloudkit.js +12 -0
- package/dist/commonjs/storages/cloudkit.js.map +1 -0
- package/{lib/commonjs → dist/commonjs/storages}/google-drive/client.js +83 -40
- package/dist/commonjs/storages/google-drive/client.js.map +1 -0
- package/dist/commonjs/storages/google-drive/index.js +399 -0
- package/dist/commonjs/storages/google-drive/index.js.map +1 -0
- package/dist/commonjs/storages/google-drive/types.js.map +1 -0
- package/{lib → dist}/commonjs/types/main.js.map +1 -1
- package/dist/commonjs/types/native.js +28 -0
- package/dist/commonjs/types/native.js.map +1 -0
- package/{lib/commonjs/utils/CloudStorageError.js → dist/commonjs/utils/cloud-storage-error.js} +3 -1
- package/dist/commonjs/utils/cloud-storage-error.js.map +1 -0
- package/dist/commonjs/utils/constants.js +25 -0
- package/dist/commonjs/utils/constants.js.map +1 -0
- package/dist/commonjs/utils/local-fs.js +17 -0
- package/dist/commonjs/utils/local-fs.js.map +1 -0
- package/dist/commonjs/utils/native.js +35 -0
- package/dist/commonjs/utils/native.js.map +1 -0
- package/{lib/module/RNCloudStorage.js → dist/module/cloud-storage.js} +178 -93
- package/dist/module/cloud-storage.js.map +1 -0
- package/dist/module/expo-plugin/index.js +8 -0
- package/dist/module/expo-plugin/index.js.map +1 -0
- package/{lib/module/expo-plugin/withRNCloudStorageIos.js → dist/module/expo-plugin/ios.js} +1 -1
- package/dist/module/expo-plugin/ios.js.map +1 -0
- package/{lib/module/hooks/useCloudFile.js → dist/module/hooks/use-cloud-file.js} +25 -7
- package/dist/module/hooks/use-cloud-file.js.map +1 -0
- package/{lib/module/hooks/useIsCloudAvailable.js → dist/module/hooks/use-is-cloud-available.js} +2 -2
- package/dist/module/hooks/use-is-cloud-available.js.map +1 -0
- package/dist/module/index.js +9 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/specs/NativeCloudStorageCloudKitIOS.js +5 -0
- package/dist/module/specs/NativeCloudStorageCloudKitIOS.js.map +1 -0
- package/dist/module/specs/NativeCloudStorageLocalFileSystem.js +5 -0
- package/dist/module/specs/NativeCloudStorageLocalFileSystem.js.map +1 -0
- package/dist/module/storages/cloudkit.js +7 -0
- package/dist/module/storages/cloudkit.js.map +1 -0
- package/{lib/module → dist/module/storages}/google-drive/client.js +83 -40
- package/dist/module/storages/google-drive/client.js.map +1 -0
- package/dist/module/storages/google-drive/index.js +392 -0
- package/dist/module/storages/google-drive/index.js.map +1 -0
- package/dist/module/storages/google-drive/types.js.map +1 -0
- package/{lib → dist}/module/types/main.js.map +1 -1
- package/dist/module/types/native.js +24 -0
- package/dist/module/types/native.js.map +1 -0
- package/{lib/module/utils/CloudStorageError.js → dist/module/utils/cloud-storage-error.js} +3 -1
- package/dist/module/utils/cloud-storage-error.js.map +1 -0
- package/dist/module/utils/constants.js +21 -0
- package/dist/module/utils/constants.js.map +1 -0
- package/dist/module/utils/local-fs.js +12 -0
- package/dist/module/utils/local-fs.js.map +1 -0
- package/dist/module/utils/native.js +30 -0
- package/dist/module/utils/native.js.map +1 -0
- package/{lib/typescript/RNCloudStorage.d.ts → dist/typescript/cloud-storage.d.ts} +67 -8
- package/dist/typescript/cloud-storage.d.ts.map +1 -0
- package/{lib/typescript/expo-plugin/withRNCloudStorage.d.ts → dist/typescript/expo-plugin/index.d.ts} +1 -1
- package/dist/typescript/expo-plugin/index.d.ts.map +1 -0
- package/{lib/typescript/expo-plugin/withRNCloudStorageIos.d.ts → dist/typescript/expo-plugin/ios.d.ts} +1 -1
- package/dist/typescript/expo-plugin/ios.d.ts.map +1 -0
- package/{lib/typescript/hooks/useCloudFile.d.ts → dist/typescript/hooks/use-cloud-file.d.ts} +22 -4
- package/dist/typescript/hooks/use-cloud-file.d.ts.map +1 -0
- package/{lib/typescript/hooks/useIsCloudAvailable.d.ts → dist/typescript/hooks/use-is-cloud-available.d.ts} +2 -2
- package/dist/typescript/hooks/use-is-cloud-available.d.ts.map +1 -0
- package/dist/typescript/index.d.ts +7 -0
- package/dist/typescript/index.d.ts.map +1 -0
- package/dist/typescript/specs/NativeCloudStorageCloudKitIOS.d.ts +30 -0
- package/dist/typescript/specs/NativeCloudStorageCloudKitIOS.d.ts.map +1 -0
- package/dist/typescript/specs/NativeCloudStorageLocalFileSystem.d.ts +24 -0
- package/dist/typescript/specs/NativeCloudStorageLocalFileSystem.d.ts.map +1 -0
- package/dist/typescript/storages/cloudkit.d.ts +6 -0
- package/dist/typescript/storages/cloudkit.d.ts.map +1 -0
- package/{lib/typescript → dist/typescript/storages}/google-drive/client.d.ts +10 -3
- package/dist/typescript/storages/google-drive/client.d.ts.map +1 -0
- package/dist/typescript/storages/google-drive/index.d.ts +41 -0
- package/dist/typescript/storages/google-drive/index.d.ts.map +1 -0
- package/dist/typescript/storages/google-drive/types.d.ts.map +1 -0
- package/{lib → dist}/typescript/types/main.d.ts +8 -0
- package/dist/typescript/types/main.d.ts.map +1 -0
- package/dist/typescript/types/native.d.ts +27 -0
- package/dist/typescript/types/native.d.ts.map +1 -0
- package/dist/typescript/utils/cloud-storage-error.d.ts +8 -0
- package/dist/typescript/utils/cloud-storage-error.d.ts.map +1 -0
- package/dist/typescript/utils/constants.d.ts +4 -0
- package/dist/typescript/utils/constants.d.ts.map +1 -0
- package/{lib → dist}/typescript/utils/helpers.d.ts.map +1 -1
- package/dist/typescript/utils/local-fs.d.ts +2 -0
- package/dist/typescript/utils/local-fs.d.ts.map +1 -0
- package/dist/typescript/utils/native.d.ts +7 -0
- package/dist/typescript/utils/native.d.ts.map +1 -0
- package/ios/CloudStorage-Bridging-Header.h +0 -1
- package/ios/CloudStorage.xcodeproj/project.pbxproj +12 -6
- package/ios/CloudStorageCloudKit.swift +159 -0
- package/ios/CloudStorageLocalFileSystem.swift +216 -0
- package/ios/RCTCloudStorageCloudKit.mm +209 -0
- package/ios/RCTCloudStorageLocalFileSystem.mm +149 -0
- package/ios/Utils/CloudKitUtils.swift +12 -6
- package/ios/Utils/CloudStorageError.swift +8 -0
- package/ios/Utils/FileUtils.swift +21 -4
- package/ios/Utils/Promise.swift +1 -0
- package/ios/Utils/Types.swift +8 -1
- package/ios/react_native_cloud_storage.h +6 -0
- package/package.json +64 -110
- package/react-native-cloud-storage.podspec +2 -0
- package/src/{RNCloudStorage.ts → cloud-storage.ts} +210 -100
- package/src/expo-plugin/{withRNCloudStorage.ts → index.ts} +2 -2
- package/src/hooks/{useCloudFile.ts → use-cloud-file.ts} +24 -6
- package/src/hooks/{useIsCloudAvailable.ts → use-is-cloud-available.ts} +1 -1
- package/src/index.ts +5 -6
- package/src/specs/NativeCloudStorageCloudKitIOS.ts +33 -0
- package/src/specs/NativeCloudStorageLocalFileSystem.ts +28 -0
- package/src/storages/cloudkit.ts +13 -0
- package/src/{google-drive → storages/google-drive}/client.ts +100 -41
- package/src/storages/google-drive/index.ts +488 -0
- package/src/types/main.ts +9 -0
- package/src/types/native.ts +14 -22
- package/src/utils/cloud-storage-error.ts +15 -0
- package/src/utils/constants.ts +21 -0
- package/src/utils/local-fs.ts +19 -0
- package/src/utils/native.ts +40 -0
- package/ios/CloudStorage.m +0 -22
- package/ios/CloudStorage.swift +0 -103
- package/ios/CloudStorageEventEmitter.m +0 -16
- package/ios/CloudStorageEventEmitter.swift +0 -30
- package/lib/commonjs/RNCloudStorage.js.map +0 -1
- package/lib/commonjs/expo-plugin/withRNCloudStorage.js +0 -13
- package/lib/commonjs/expo-plugin/withRNCloudStorage.js.map +0 -1
- package/lib/commonjs/expo-plugin/withRNCloudStorageIos.js.map +0 -1
- package/lib/commonjs/google-drive/client.js.map +0 -1
- package/lib/commonjs/google-drive/index.js +0 -321
- package/lib/commonjs/google-drive/index.js.map +0 -1
- package/lib/commonjs/google-drive/types.js.map +0 -1
- package/lib/commonjs/hooks/useCloudFile.js.map +0 -1
- package/lib/commonjs/hooks/useIsCloudAvailable.js.map +0 -1
- package/lib/commonjs/index.js.map +0 -1
- package/lib/commonjs/types/native.js +0 -26
- package/lib/commonjs/types/native.js.map +0 -1
- package/lib/commonjs/utils/CloudStorageError.js.map +0 -1
- package/lib/module/RNCloudStorage.js.map +0 -1
- package/lib/module/expo-plugin/withRNCloudStorage.js +0 -8
- package/lib/module/expo-plugin/withRNCloudStorage.js.map +0 -1
- package/lib/module/expo-plugin/withRNCloudStorageIos.js.map +0 -1
- package/lib/module/google-drive/client.js.map +0 -1
- package/lib/module/google-drive/index.js +0 -313
- package/lib/module/google-drive/index.js.map +0 -1
- package/lib/module/google-drive/types.js.map +0 -1
- package/lib/module/hooks/useCloudFile.js.map +0 -1
- package/lib/module/hooks/useIsCloudAvailable.js.map +0 -1
- package/lib/module/index.js +0 -10
- package/lib/module/index.js.map +0 -1
- package/lib/module/types/native.js +0 -22
- package/lib/module/types/native.js.map +0 -1
- package/lib/module/utils/CloudStorageError.js.map +0 -1
- package/lib/typescript/RNCloudStorage.d.ts.map +0 -1
- package/lib/typescript/expo-plugin/withRNCloudStorage.d.ts.map +0 -1
- package/lib/typescript/expo-plugin/withRNCloudStorageIos.d.ts.map +0 -1
- package/lib/typescript/google-drive/client.d.ts.map +0 -1
- package/lib/typescript/google-drive/index.d.ts +0 -34
- package/lib/typescript/google-drive/index.d.ts.map +0 -1
- package/lib/typescript/google-drive/types.d.ts.map +0 -1
- package/lib/typescript/hooks/useCloudFile.d.ts.map +0 -1
- package/lib/typescript/hooks/useIsCloudAvailable.d.ts.map +0 -1
- package/lib/typescript/index.d.ts +0 -8
- package/lib/typescript/index.d.ts.map +0 -1
- package/lib/typescript/types/main.d.ts.map +0 -1
- package/lib/typescript/types/native.d.ts +0 -40
- package/lib/typescript/types/native.d.ts.map +0 -1
- package/lib/typescript/utils/CloudStorageError.d.ts +0 -8
- package/lib/typescript/utils/CloudStorageError.d.ts.map +0 -1
- package/src/google-drive/index.ts +0 -399
- package/src/utils/CloudStorageError.ts +0 -14
- /package/{lib → dist}/commonjs/expo-plugin/types/index.js +0 -0
- /package/{lib → dist}/commonjs/expo-plugin/types/index.js.map +0 -0
- /package/{lib/commonjs → dist/commonjs/storages}/google-drive/types.js +0 -0
- /package/{lib → dist}/commonjs/types/main.js +0 -0
- /package/{lib → dist}/commonjs/utils/helpers.js +0 -0
- /package/{lib → dist}/commonjs/utils/helpers.js.map +0 -0
- /package/{lib → dist}/module/expo-plugin/types/index.js +0 -0
- /package/{lib → dist}/module/expo-plugin/types/index.js.map +0 -0
- /package/{lib → dist}/module/package.json +0 -0
- /package/{lib/module → dist/module/storages}/google-drive/types.js +0 -0
- /package/{lib → dist}/module/types/main.js +0 -0
- /package/{lib → dist}/module/utils/helpers.js +0 -0
- /package/{lib → dist}/module/utils/helpers.js.map +0 -0
- /package/{lib → dist}/typescript/expo-plugin/types/index.d.ts +0 -0
- /package/{lib → dist}/typescript/expo-plugin/types/index.d.ts.map +0 -0
- /package/{lib/typescript → dist/typescript/storages}/google-drive/types.d.ts +0 -0
- /package/{lib → dist}/typescript/utils/helpers.d.ts +0 -0
- /package/src/expo-plugin/{withRNCloudStorageIos.ts → ios.ts} +0 -0
- /package/src/{google-drive → storages/google-drive}/types.ts +0 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _default = exports.default = _reactNative.TurboModuleRegistry.get('CloudStorageCloudKit');
|
|
9
|
+
//# sourceMappingURL=NativeCloudStorageCloudKitIOS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sourceRoot":"../../../src","sources":["specs/NativeCloudStorageCloudKitIOS.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GA+BpCC,gCAAmB,CAACC,GAAG,CAAO,sBAAsB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNative = require("react-native");
|
|
8
|
+
var _default = exports.default = _reactNative.TurboModuleRegistry.get('CloudStorageLocalFileSystem');
|
|
9
|
+
//# sourceMappingURL=NativeCloudStorageLocalFileSystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sourceRoot":"../../../src","sources":["specs/NativeCloudStorageLocalFileSystem.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GA0BpCC,gCAAmB,CAACC,GAAG,CAAO,6BAA6B,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.NativeCloudKitModule = exports.NativeCloudKit = void 0;
|
|
7
|
+
var _NativeCloudStorageCloudKitIOS = _interopRequireDefault(require("../specs/NativeCloudStorageCloudKitIOS"));
|
|
8
|
+
var _native = require("../utils/native");
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
const NativeCloudKitModule = exports.NativeCloudKitModule = _NativeCloudStorageCloudKitIOS.default;
|
|
11
|
+
const NativeCloudKit = exports.NativeCloudKit = (0, _native.createProxiedNativeModule)(_NativeCloudStorageCloudKitIOS.default);
|
|
12
|
+
//# sourceMappingURL=cloudkit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_NativeCloudStorageCloudKitIOS","_interopRequireDefault","require","_native","e","__esModule","default","NativeCloudKitModule","exports","NativeCloudStorageCloudKitIOS","NativeCloudKit","createProxiedNativeModule"],"sourceRoot":"../../../src","sources":["storages/cloudkit.ts"],"mappings":";;;;;;AAAA,IAAAA,8BAAA,GAAAC,sBAAA,CAAAC,OAAA;AAIA,IAAAC,OAAA,GAAAD,OAAA;AAA4D,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAErD,MAAMG,oBAAoB,GAAAC,OAAA,CAAAD,oBAAA,GAAGE,sCAA6B;AAE1D,MAAMC,cAAc,GAAAF,OAAA,CAAAE,cAAA,GAAG,IAAAC,iCAAyB,EACrDF,sCACF,CAAC","ignoreList":[]}
|
|
@@ -5,10 +5,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.GoogleDriveHttpError = void 0;
|
|
7
7
|
var _types = require("./types");
|
|
8
|
+
var _localFs = require("../../utils/local-fs");
|
|
8
9
|
const BASE_URL = 'https://www.googleapis.com/drive/v3';
|
|
9
10
|
const BASE_UPLOAD_URL = 'https://www.googleapis.com/upload/drive/v3';
|
|
10
11
|
const MULTIPART_BOUNDARY = 'foo_bar_baz';
|
|
11
12
|
class GoogleDriveHttpError extends Error {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
|
|
12
15
|
constructor(message, status, json) {
|
|
13
16
|
super(message);
|
|
14
17
|
this.status = status;
|
|
@@ -16,22 +19,22 @@ class GoogleDriveHttpError extends Error {
|
|
|
16
19
|
}
|
|
17
20
|
}
|
|
18
21
|
|
|
19
|
-
// TODO: fetch timeout
|
|
20
22
|
// TODO: properly handle errors
|
|
21
23
|
exports.GoogleDriveHttpError = GoogleDriveHttpError;
|
|
22
24
|
class GoogleDriveApiClient {
|
|
25
|
+
_fetchTimeout = null;
|
|
23
26
|
constructor(options) {
|
|
24
27
|
this.options = options;
|
|
25
28
|
}
|
|
26
29
|
buildQueryString(query) {
|
|
27
|
-
let
|
|
30
|
+
let result = Object.entries(query).filter(([, value]) => value !== undefined).map(([key, value]) => {
|
|
28
31
|
if (typeof value === 'boolean') return `${encodeURIComponent(key)}=${value ? 'true' : 'false'}`;
|
|
29
32
|
return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
|
|
30
33
|
}).join('&');
|
|
31
|
-
if (
|
|
32
|
-
|
|
34
|
+
if (result) {
|
|
35
|
+
result = `?${result}`;
|
|
33
36
|
}
|
|
34
|
-
return
|
|
37
|
+
return result;
|
|
35
38
|
}
|
|
36
39
|
async request(operation, {
|
|
37
40
|
queryParameters,
|
|
@@ -46,7 +49,7 @@ class GoogleDriveApiClient {
|
|
|
46
49
|
if (queryParameters) {
|
|
47
50
|
path += this.buildQueryString(queryParameters);
|
|
48
51
|
}
|
|
49
|
-
clearTimeout(this._fetchTimeout);
|
|
52
|
+
if (this._fetchTimeout !== null) clearTimeout(this._fetchTimeout);
|
|
50
53
|
const abortController = new AbortController();
|
|
51
54
|
this._fetchTimeout = setTimeout(() => {
|
|
52
55
|
abortController.abort();
|
|
@@ -64,8 +67,8 @@ class GoogleDriveApiClient {
|
|
|
64
67
|
let json = null;
|
|
65
68
|
try {
|
|
66
69
|
json = await response.json();
|
|
67
|
-
errorMessage = json.error
|
|
68
|
-
} catch
|
|
70
|
+
errorMessage = typeof json === 'object' && json !== null && 'error' in json && typeof json.error === 'object' && json.error !== null && 'message' in json.error && typeof json.error.message === 'string' ? json.error.message : `Request failed with status ${response.status}`;
|
|
71
|
+
} catch {
|
|
69
72
|
errorMessage = `Request failed with status ${response.status}`;
|
|
70
73
|
}
|
|
71
74
|
throw new GoogleDriveHttpError(errorMessage, response.status, json);
|
|
@@ -80,16 +83,10 @@ class GoogleDriveApiClient {
|
|
|
80
83
|
}
|
|
81
84
|
buildMultiPartBody(metadata, media) {
|
|
82
85
|
const body = [];
|
|
83
|
-
body.push(`--${MULTIPART_BOUNDARY}\r\n`);
|
|
84
|
-
body.push(`Content-Type: ${_types.MimeTypes.JSON}; charset=UTF-8\r\n\r\n`);
|
|
85
|
-
body.push(`${JSON.stringify(metadata)}\r\n`);
|
|
86
|
-
body.push(`--${MULTIPART_BOUNDARY}\r\n`);
|
|
87
|
-
body.push(`Content-Type: ${media.mimeType}\r\n\r\n`);
|
|
88
|
-
body.push(`${media.body}\r\n`);
|
|
89
|
-
body.push(`--${MULTIPART_BOUNDARY}--`);
|
|
86
|
+
body.push(`--${MULTIPART_BOUNDARY}\r\n`, `Content-Type: ${_types.MimeTypes.JSON}; charset=UTF-8\r\n\r\n`, `${JSON.stringify(metadata)}\r\n`, `--${MULTIPART_BOUNDARY}\r\n`, `Content-Type: ${media.mimeType}\r\n\r\n`, `${media.body}\r\n`, `--${MULTIPART_BOUNDARY}--`);
|
|
90
87
|
return body.join('');
|
|
91
88
|
}
|
|
92
|
-
async listFiles(space) {
|
|
89
|
+
async listFiles(space, query) {
|
|
93
90
|
const files = [];
|
|
94
91
|
let pageToken;
|
|
95
92
|
const fields = ['id', 'kind', 'mimeType', 'name', 'parents', 'spaces', 'size', 'createdTime', 'modifiedTime'];
|
|
@@ -97,7 +94,8 @@ class GoogleDriveApiClient {
|
|
|
97
94
|
const queryParameters = {
|
|
98
95
|
fields: `files(${fields.join(',')}),nextPageToken`,
|
|
99
96
|
spaces: space,
|
|
100
|
-
pageToken
|
|
97
|
+
pageToken,
|
|
98
|
+
q: query
|
|
101
99
|
};
|
|
102
100
|
const response = await this.request(`/files`, {
|
|
103
101
|
queryParameters
|
|
@@ -131,19 +129,44 @@ class GoogleDriveApiClient {
|
|
|
131
129
|
});
|
|
132
130
|
}
|
|
133
131
|
async createFile(metadata, media) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
132
|
+
if ('body' in media) {
|
|
133
|
+
const multipartRequestBody = this.buildMultiPartBody(metadata, media);
|
|
134
|
+
await this.request(`/files`, {
|
|
135
|
+
queryParameters: {
|
|
136
|
+
uploadType: 'multipart'
|
|
137
|
+
},
|
|
138
|
+
method: 'POST',
|
|
139
|
+
headers: {
|
|
140
|
+
'Content-Type': `multipart/related; boundary=${MULTIPART_BOUNDARY}`,
|
|
141
|
+
'Content-Length': multipartRequestBody.length.toString()
|
|
142
|
+
},
|
|
143
|
+
body: multipartRequestBody,
|
|
144
|
+
baseUrl: BASE_UPLOAD_URL
|
|
145
|
+
});
|
|
146
|
+
} else {
|
|
147
|
+
// First, create an empty file with the required metadata
|
|
148
|
+
const file = await this.request(`/files`, {
|
|
149
|
+
method: 'POST',
|
|
150
|
+
headers: {
|
|
151
|
+
'Content-Type': _types.MimeTypes.JSON
|
|
152
|
+
},
|
|
153
|
+
body: JSON.stringify({
|
|
154
|
+
...metadata,
|
|
155
|
+
mimeType: media.mimeType
|
|
156
|
+
})
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Then, upload the binary content via the native helper module
|
|
160
|
+
const remoteUri = `${BASE_UPLOAD_URL}/files/${file.id}?uploadType=media`;
|
|
161
|
+
await _localFs.localFileSystem.uploadFile(media.localPath, remoteUri, {
|
|
162
|
+
method: 'PATCH',
|
|
163
|
+
uploadType: 'binary',
|
|
164
|
+
headers: {
|
|
165
|
+
'Authorization': `Bearer ${this.options.accessToken}`,
|
|
166
|
+
'Content-Type': media.mimeType
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
147
170
|
}
|
|
148
171
|
async createDirectory(metadata) {
|
|
149
172
|
await this.request(`/files`, {
|
|
@@ -158,17 +181,37 @@ class GoogleDriveApiClient {
|
|
|
158
181
|
});
|
|
159
182
|
}
|
|
160
183
|
async updateFile(fileId, media) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
184
|
+
if ('body' in media) {
|
|
185
|
+
await this.request(`/files/${fileId}`, {
|
|
186
|
+
queryParameters: {
|
|
187
|
+
uploadType: 'media'
|
|
188
|
+
},
|
|
189
|
+
method: 'PATCH',
|
|
190
|
+
headers: {
|
|
191
|
+
'Content-Type': media.mimeType,
|
|
192
|
+
'Content-Length': media.body.length.toString()
|
|
193
|
+
},
|
|
194
|
+
body: media.body,
|
|
195
|
+
baseUrl: BASE_UPLOAD_URL
|
|
196
|
+
});
|
|
197
|
+
} else {
|
|
198
|
+
const remoteUri = `${BASE_UPLOAD_URL}/files/${fileId}?uploadType=media`;
|
|
199
|
+
await _localFs.localFileSystem.uploadFile(media.localPath, remoteUri, {
|
|
200
|
+
method: 'PATCH',
|
|
201
|
+
uploadType: 'binary',
|
|
202
|
+
headers: {
|
|
203
|
+
'Authorization': `Bearer ${this.options.accessToken}`,
|
|
204
|
+
'Content-Type': media.mimeType
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async downloadFile(fileId, localPath) {
|
|
210
|
+
const remoteUri = `${BASE_URL}/files/${fileId}?alt=media`;
|
|
211
|
+
await _localFs.localFileSystem.downloadFile(remoteUri, localPath, {
|
|
166
212
|
headers: {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
},
|
|
170
|
-
body: media.body,
|
|
171
|
-
baseUrl: BASE_UPLOAD_URL
|
|
213
|
+
Authorization: `Bearer ${this.options.accessToken}`
|
|
214
|
+
}
|
|
172
215
|
});
|
|
173
216
|
}
|
|
174
217
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_types","require","_localFs","BASE_URL","BASE_UPLOAD_URL","MULTIPART_BOUNDARY","GoogleDriveHttpError","Error","constructor","message","status","json","exports","GoogleDriveApiClient","_fetchTimeout","options","buildQueryString","query","result","Object","entries","filter","value","undefined","map","key","encodeURIComponent","join","request","operation","queryParameters","baseUrl","timeout","accessToken","path","clearTimeout","abortController","AbortController","setTimeout","abort","response","fetch","headers","Authorization","signal","ok","errorMessage","error","Accept","text","buildMultiPartBody","metadata","media","body","push","MimeTypes","JSON","stringify","mimeType","listFiles","space","files","pageToken","fields","spaces","q","nextPageToken","getFile","fileId","getFileText","alt","deleteFile","method","createFile","multipartRequestBody","uploadType","length","toString","file","remoteUri","id","localFileSystem","uploadFile","localPath","createDirectory","FOLDER","updateFile","downloadFile","default"],"sourceRoot":"../../../../src","sources":["storages/google-drive/client.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _native = require("../../types/native");
|
|
8
|
+
var _cloudStorageError = _interopRequireDefault(require("../../utils/cloud-storage-error"));
|
|
9
|
+
var _types = require("./types");
|
|
10
|
+
var _client = _interopRequireWildcard(require("./client"));
|
|
11
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
/**
|
|
14
|
+
* A JavaScript-based implementation of the Google Drive API that implements the cloud storage interface.
|
|
15
|
+
*/
|
|
16
|
+
class GoogleDrive {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.options = options;
|
|
19
|
+
this.drive = new _client.default(options);
|
|
20
|
+
return new Proxy(this, {
|
|
21
|
+
// before calling any function, check if the access token is set
|
|
22
|
+
get(target, property) {
|
|
23
|
+
const allowedFunctions = ['isCloudAvailable'];
|
|
24
|
+
if (typeof target[property] === 'function' && !allowedFunctions.includes(property.toString())) {
|
|
25
|
+
const {
|
|
26
|
+
accessToken
|
|
27
|
+
} = options;
|
|
28
|
+
if (!accessToken?.length) {
|
|
29
|
+
throw new _cloudStorageError.default(`Google Drive access token is not set, cannot call function ${property.toString()}`, _native.NativeCloudStorageErrorCode.ACCESS_TOKEN_MISSING);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return target[property];
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
isCloudAvailable = async () => {
|
|
37
|
+
const {
|
|
38
|
+
accessToken
|
|
39
|
+
} = this.options;
|
|
40
|
+
return !!accessToken?.length;
|
|
41
|
+
};
|
|
42
|
+
getRootDirectory(scope) {
|
|
43
|
+
switch (scope) {
|
|
44
|
+
case 'documents':
|
|
45
|
+
{
|
|
46
|
+
return 'drive';
|
|
47
|
+
}
|
|
48
|
+
case 'documents_legacy':
|
|
49
|
+
{
|
|
50
|
+
return 'drive';
|
|
51
|
+
}
|
|
52
|
+
case 'app_data':
|
|
53
|
+
{
|
|
54
|
+
return 'appDataFolder';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
isRootPath(path) {
|
|
59
|
+
return path === '' || path === '/';
|
|
60
|
+
}
|
|
61
|
+
resolvePathToDirectories(path) {
|
|
62
|
+
if (path.startsWith('/')) path = path.slice(1);
|
|
63
|
+
if (path.endsWith('/')) path = path.slice(0, -1);
|
|
64
|
+
const directories = path.split('/');
|
|
65
|
+
const actualFilename = directories.pop() ?? '';
|
|
66
|
+
return {
|
|
67
|
+
directories,
|
|
68
|
+
filename: actualFilename
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
escapeDriveQueryValue(value) {
|
|
72
|
+
return value.replaceAll('\\', String.raw`\\`).replaceAll("'", String.raw`\'`);
|
|
73
|
+
}
|
|
74
|
+
async getQueryRootParentId(scope) {
|
|
75
|
+
if (scope === 'app_data') {
|
|
76
|
+
return this.getRootDirectory(scope);
|
|
77
|
+
}
|
|
78
|
+
return this.getRootDirectoryId(scope);
|
|
79
|
+
}
|
|
80
|
+
async findDirectoryByNameAndParent(name, parentId, scope) {
|
|
81
|
+
const escapedName = this.escapeDriveQueryValue(name);
|
|
82
|
+
const escapedParentId = this.escapeDriveQueryValue(parentId);
|
|
83
|
+
const query = `name = '${escapedName}' and '${escapedParentId}' in parents and mimeType = '${_types.MimeTypes.FOLDER}' and trashed = false`;
|
|
84
|
+
return this.drive.listFiles(this.getRootDirectory(scope), query);
|
|
85
|
+
}
|
|
86
|
+
async findFilesByNameAndParent(name, parentId, scope) {
|
|
87
|
+
const escapedName = this.escapeDriveQueryValue(name);
|
|
88
|
+
const escapedParentId = this.escapeDriveQueryValue(parentId);
|
|
89
|
+
const query = `name = '${escapedName}' and '${escapedParentId}' in parents and trashed = false`;
|
|
90
|
+
return this.drive.listFiles(this.getRootDirectory(scope), query);
|
|
91
|
+
}
|
|
92
|
+
async findFilesByParent(parentId, scope) {
|
|
93
|
+
const escapedParentId = this.escapeDriveQueryValue(parentId);
|
|
94
|
+
const query = `'${escapedParentId}' in parents and trashed = false`;
|
|
95
|
+
return this.drive.listFiles(this.getRootDirectory(scope), query);
|
|
96
|
+
}
|
|
97
|
+
async findParentDirectoryId(directoryTree, scope) {
|
|
98
|
+
let parentDirectoryId = await this.getQueryRootParentId(scope);
|
|
99
|
+
for (const directoryName of directoryTree) {
|
|
100
|
+
const directories = await this.findDirectoryByNameAndParent(directoryName, parentDirectoryId, scope);
|
|
101
|
+
if (directories.length === 0) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
parentDirectoryId = directories[0].id;
|
|
105
|
+
}
|
|
106
|
+
return parentDirectoryId;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Gets the Google Drive ID of the root directory for the given scope.
|
|
111
|
+
* @param scope The scope to get the root directory for.
|
|
112
|
+
* @returns A promise that resolves to the ID of the root directory.
|
|
113
|
+
*/
|
|
114
|
+
async getRootDirectoryId(scope) {
|
|
115
|
+
if (scope !== 'app_data') {
|
|
116
|
+
return 'root';
|
|
117
|
+
}
|
|
118
|
+
const files = await this.drive.listFiles(this.getRootDirectory(scope));
|
|
119
|
+
for (const file of files) {
|
|
120
|
+
const parentId = file.parents?.[0];
|
|
121
|
+
if (parentId && !files.some(candidate => candidate.id === parentId)) {
|
|
122
|
+
return parentId;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return this.getRootDirectory(scope);
|
|
126
|
+
}
|
|
127
|
+
checkIfMultipleFilesWithSameName(path, files) {
|
|
128
|
+
const {
|
|
129
|
+
strictFilenames
|
|
130
|
+
} = this.options;
|
|
131
|
+
if (files.length <= 1) return;
|
|
132
|
+
if (strictFilenames) {
|
|
133
|
+
throw new _cloudStorageError.default(`Multiple files with the same name found at path ${path}: ${files.map(f => f.id).join(', ')}`, _native.NativeCloudStorageErrorCode.MULTIPLE_FILES_SAME_NAME);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async getFileId(path, scope, throwIf = false) {
|
|
137
|
+
try {
|
|
138
|
+
if (this.isRootPath(path)) {
|
|
139
|
+
if (throwIf === 'directory') {
|
|
140
|
+
throw new _cloudStorageError.default(`Path ${path} is a directory`, _native.NativeCloudStorageErrorCode.PATH_IS_DIRECTORY);
|
|
141
|
+
}
|
|
142
|
+
const rootDirectoryId = await this.getRootDirectoryId(scope);
|
|
143
|
+
if (scope !== 'app_data') {
|
|
144
|
+
await this.drive.getFile(rootDirectoryId);
|
|
145
|
+
}
|
|
146
|
+
return rootDirectoryId;
|
|
147
|
+
}
|
|
148
|
+
const {
|
|
149
|
+
directories,
|
|
150
|
+
filename
|
|
151
|
+
} = this.resolvePathToDirectories(path);
|
|
152
|
+
const parentDirectoryId = await this.findParentDirectoryId(directories, scope);
|
|
153
|
+
if (parentDirectoryId === null) {
|
|
154
|
+
throw new _cloudStorageError.default(`File not found`, _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND);
|
|
155
|
+
}
|
|
156
|
+
const files = await this.findFilesByNameAndParent(filename, parentDirectoryId, scope);
|
|
157
|
+
this.checkIfMultipleFilesWithSameName(path, files);
|
|
158
|
+
const file = files[0];
|
|
159
|
+
if (!file) throw new _cloudStorageError.default(`File not found`, _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND);
|
|
160
|
+
if (file.mimeType === _types.MimeTypes.FOLDER && throwIf === 'directory') {
|
|
161
|
+
throw new _cloudStorageError.default(`Path ${path} is a directory`, _native.NativeCloudStorageErrorCode.PATH_IS_DIRECTORY);
|
|
162
|
+
} else if (file.mimeType !== _types.MimeTypes.FOLDER && throwIf === 'file') {
|
|
163
|
+
throw new _cloudStorageError.default(`Path ${path} is a file`, _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND);
|
|
164
|
+
}
|
|
165
|
+
return file.id;
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (error instanceof _client.GoogleDriveHttpError && error.json?.error?.status === 'UNAUTHENTICATED') {
|
|
168
|
+
throw new _cloudStorageError.default(`Could not authenticate with Google Drive`, _native.NativeCloudStorageErrorCode.AUTHENTICATION_FAILED, error.json);
|
|
169
|
+
} else {
|
|
170
|
+
if (error instanceof _cloudStorageError.default) throw error;
|
|
171
|
+
throw new _cloudStorageError.default(`Could not get file id for path ${path}`, _native.NativeCloudStorageErrorCode.UNKNOWN, error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async fileExists(path, scope) {
|
|
176
|
+
try {
|
|
177
|
+
await this.getFileId(path, scope);
|
|
178
|
+
return true;
|
|
179
|
+
} catch (error) {
|
|
180
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) return false;else throw error;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async appendToFile(path, data, scope) {
|
|
184
|
+
let fileId;
|
|
185
|
+
let previousContent = '';
|
|
186
|
+
try {
|
|
187
|
+
fileId = await this.getFileId(path, scope, 'directory');
|
|
188
|
+
previousContent = await this.drive.getFileText(fileId);
|
|
189
|
+
} catch (error) {
|
|
190
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) {
|
|
191
|
+
/* do nothing, simply create the file */
|
|
192
|
+
} else {
|
|
193
|
+
throw error;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (fileId) {
|
|
197
|
+
await this.drive.updateFile(fileId, {
|
|
198
|
+
body: previousContent + data,
|
|
199
|
+
mimeType: _types.MimeTypes.TEXT
|
|
200
|
+
});
|
|
201
|
+
} else {
|
|
202
|
+
const {
|
|
203
|
+
directories,
|
|
204
|
+
filename
|
|
205
|
+
} = this.resolvePathToDirectories(path);
|
|
206
|
+
const parentDirectoryId = await this.findParentDirectoryId(directories, scope);
|
|
207
|
+
if (parentDirectoryId === null) {
|
|
208
|
+
throw new _cloudStorageError.default(`Directory not found`, _native.NativeCloudStorageErrorCode.DIRECTORY_NOT_FOUND);
|
|
209
|
+
}
|
|
210
|
+
await this.drive.createFile({
|
|
211
|
+
name: filename,
|
|
212
|
+
parents: [parentDirectoryId]
|
|
213
|
+
}, {
|
|
214
|
+
body: data,
|
|
215
|
+
mimeType: _types.MimeTypes.TEXT
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async createFile(path, data, scope, overwrite) {
|
|
220
|
+
let fileId;
|
|
221
|
+
if (overwrite) {
|
|
222
|
+
try {
|
|
223
|
+
fileId = await this.getFileId(path, scope, 'directory');
|
|
224
|
+
} catch (error) {
|
|
225
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) {
|
|
226
|
+
/* do nothing, simply create the file */
|
|
227
|
+
} else {
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
} else {
|
|
232
|
+
try {
|
|
233
|
+
await this.getFileId(path, scope, 'directory');
|
|
234
|
+
throw new _cloudStorageError.default(`File ${path} already exists`, _native.NativeCloudStorageErrorCode.FILE_ALREADY_EXISTS);
|
|
235
|
+
} catch (error) {
|
|
236
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) {
|
|
237
|
+
/* do nothing, simply create the file */
|
|
238
|
+
} else {
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (fileId) {
|
|
244
|
+
await this.drive.updateFile(fileId, {
|
|
245
|
+
body: data,
|
|
246
|
+
mimeType: _types.MimeTypes.TEXT
|
|
247
|
+
});
|
|
248
|
+
} else {
|
|
249
|
+
const {
|
|
250
|
+
directories,
|
|
251
|
+
filename
|
|
252
|
+
} = this.resolvePathToDirectories(path);
|
|
253
|
+
const parentDirectoryId = await this.findParentDirectoryId(directories, scope);
|
|
254
|
+
if (parentDirectoryId === null) {
|
|
255
|
+
throw new _cloudStorageError.default(`Directory not found`, _native.NativeCloudStorageErrorCode.DIRECTORY_NOT_FOUND);
|
|
256
|
+
}
|
|
257
|
+
await this.drive.createFile({
|
|
258
|
+
name: filename,
|
|
259
|
+
parents: [parentDirectoryId]
|
|
260
|
+
}, {
|
|
261
|
+
body: data,
|
|
262
|
+
mimeType: _types.MimeTypes.TEXT
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async listFiles(path, scope) {
|
|
267
|
+
const parentDirectoryId = this.isRootPath(path) ? await this.getQueryRootParentId(scope) : await this.getFileId(path, scope);
|
|
268
|
+
const files = await this.findFilesByParent(parentDirectoryId, scope);
|
|
269
|
+
return [...new Set(files.map(f => f.name))];
|
|
270
|
+
}
|
|
271
|
+
async createDirectory(path, scope) {
|
|
272
|
+
if (this.isRootPath(path)) {
|
|
273
|
+
throw new _cloudStorageError.default(`Directory ${path} already exists`, _native.NativeCloudStorageErrorCode.FILE_ALREADY_EXISTS);
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
await this.getFileId(path, scope);
|
|
277
|
+
throw new _cloudStorageError.default(`File ${path} already exists`, _native.NativeCloudStorageErrorCode.FILE_ALREADY_EXISTS);
|
|
278
|
+
} catch (error) {
|
|
279
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) {
|
|
280
|
+
/* do nothing, simply create the directory */
|
|
281
|
+
} else if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.PATH_IS_DIRECTORY) {
|
|
282
|
+
throw new _cloudStorageError.default(`Directory ${path} already exists`, _native.NativeCloudStorageErrorCode.FILE_ALREADY_EXISTS);
|
|
283
|
+
} else {
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const {
|
|
288
|
+
directories,
|
|
289
|
+
filename
|
|
290
|
+
} = this.resolvePathToDirectories(path);
|
|
291
|
+
const parentDirectoryId = await this.findParentDirectoryId(directories, scope);
|
|
292
|
+
if (parentDirectoryId === null) {
|
|
293
|
+
throw new _cloudStorageError.default(`Directory not found`, _native.NativeCloudStorageErrorCode.DIRECTORY_NOT_FOUND);
|
|
294
|
+
}
|
|
295
|
+
await this.drive.createDirectory({
|
|
296
|
+
name: filename,
|
|
297
|
+
parents: [parentDirectoryId]
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
async readFile(path, scope) {
|
|
301
|
+
const fileId = await this.getFileId(path, scope, 'directory');
|
|
302
|
+
const content = await this.drive.getFileText(fileId);
|
|
303
|
+
return content;
|
|
304
|
+
}
|
|
305
|
+
async triggerSync(_path, _scope) {
|
|
306
|
+
// Triggering file synchronization in Google Drive is not necessary / possible, as they need to be downloaded on every read operation via the API anyway
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
async deleteFile(path, scope) {
|
|
310
|
+
// if trying to pass a directory, throw an error
|
|
311
|
+
const fileId = await this.getFileId(path, scope, 'directory');
|
|
312
|
+
await this.drive.deleteFile(fileId);
|
|
313
|
+
}
|
|
314
|
+
async deleteDirectory(path, recursive, scope) {
|
|
315
|
+
// if trying to pass a file, throw an error
|
|
316
|
+
const fileId = await this.getFileId(path, scope, 'file');
|
|
317
|
+
if (!recursive) {
|
|
318
|
+
// check if the directory is empty
|
|
319
|
+
const filesInDirectory = await this.findFilesByParent(fileId, scope);
|
|
320
|
+
if (filesInDirectory.length > 0) {
|
|
321
|
+
throw new _cloudStorageError.default(`Directory ${path} is not empty`, _native.NativeCloudStorageErrorCode.DELETE_ERROR, filesInDirectory);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
await this.drive.deleteFile(fileId);
|
|
325
|
+
}
|
|
326
|
+
async statFile(path, scope) {
|
|
327
|
+
const fileId = await this.getFileId(path, scope, false);
|
|
328
|
+
const file = await this.drive.getFile(fileId);
|
|
329
|
+
return {
|
|
330
|
+
size: file.size ?? 0,
|
|
331
|
+
birthtimeMs: new Date(file.createdTime).getTime(),
|
|
332
|
+
mtimeMs: new Date(file.modifiedTime).getTime(),
|
|
333
|
+
isDirectory: file.mimeType === _types.MimeTypes.FOLDER,
|
|
334
|
+
isFile: file.mimeType !== _types.MimeTypes.FOLDER
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
async downloadFile(remotePath, localPath, scope) {
|
|
338
|
+
const fileId = await this.getFileId(remotePath, scope, 'directory');
|
|
339
|
+
try {
|
|
340
|
+
await this.drive.downloadFile(fileId, localPath);
|
|
341
|
+
} catch (error) {
|
|
342
|
+
if (error instanceof _cloudStorageError.default) throw error;
|
|
343
|
+
throw new _cloudStorageError.default(`Could not download file ${remotePath} to ${localPath}`, _native.NativeCloudStorageErrorCode.UNKNOWN, error);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
async uploadFile(remotePath, localPath, mimeType, scope, overwrite) {
|
|
347
|
+
let fileId;
|
|
348
|
+
if (overwrite) {
|
|
349
|
+
try {
|
|
350
|
+
fileId = await this.getFileId(remotePath, scope, 'directory');
|
|
351
|
+
} catch (error) {
|
|
352
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) {
|
|
353
|
+
/* File doesn't exist -> we'll create it below */
|
|
354
|
+
} else {
|
|
355
|
+
throw error;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
} else {
|
|
359
|
+
try {
|
|
360
|
+
await this.getFileId(remotePath, scope, 'directory');
|
|
361
|
+
throw new _cloudStorageError.default(`File ${remotePath} already exists`, _native.NativeCloudStorageErrorCode.FILE_ALREADY_EXISTS);
|
|
362
|
+
} catch (error) {
|
|
363
|
+
if (error instanceof _cloudStorageError.default && error.code === _native.NativeCloudStorageErrorCode.FILE_NOT_FOUND) {
|
|
364
|
+
/* not found -> ok, we'll create */
|
|
365
|
+
} else if (error instanceof _cloudStorageError.default) {
|
|
366
|
+
throw error;
|
|
367
|
+
} else {
|
|
368
|
+
throw error;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (fileId) {
|
|
373
|
+
// Overwrite existing file
|
|
374
|
+
await this.drive.updateFile(fileId, {
|
|
375
|
+
mimeType,
|
|
376
|
+
localPath
|
|
377
|
+
});
|
|
378
|
+
} else {
|
|
379
|
+
// Need to create a new file first
|
|
380
|
+
const {
|
|
381
|
+
directories,
|
|
382
|
+
filename
|
|
383
|
+
} = this.resolvePathToDirectories(remotePath);
|
|
384
|
+
const parentDirectoryId = await this.findParentDirectoryId(directories, scope);
|
|
385
|
+
if (parentDirectoryId === null) {
|
|
386
|
+
throw new _cloudStorageError.default(`Directory not found`, _native.NativeCloudStorageErrorCode.DIRECTORY_NOT_FOUND);
|
|
387
|
+
}
|
|
388
|
+
await this.drive.createFile({
|
|
389
|
+
name: filename,
|
|
390
|
+
parents: [parentDirectoryId]
|
|
391
|
+
}, {
|
|
392
|
+
mimeType,
|
|
393
|
+
localPath
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
exports.default = GoogleDrive;
|
|
399
|
+
//# sourceMappingURL=index.js.map
|