@webda/gcp 2.0.0-beta.3 → 2.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/lib/index.d.ts +4 -1
- package/lib/index.js +4 -17
- package/lib/index.js.map +1 -1
- package/lib/index.spec.d.ts +1 -1
- package/lib/index.spec.js +4 -22
- package/lib/index.spec.js.map +1 -1
- package/lib/services/firestore.js +207 -256
- package/lib/services/firestore.js.map +1 -1
- package/lib/services/firestore.spec.js +132 -169
- package/lib/services/firestore.spec.js.map +1 -1
- package/lib/services/index.d.ts +1 -1
- package/lib/services/index.js +1 -17
- package/lib/services/index.js.map +1 -1
- package/lib/services/pubsub.js +19 -40
- package/lib/services/pubsub.js.map +1 -1
- package/lib/services/pubsub.spec.js +45 -58
- package/lib/services/pubsub.spec.js.map +1 -1
- package/lib/services/queue.js +63 -90
- package/lib/services/queue.js.map +1 -1
- package/lib/services/queue.spec.js +75 -92
- package/lib/services/queue.spec.js.map +1 -1
- package/lib/services/storage.d.ts +2 -0
- package/lib/services/storage.js +93 -126
- package/lib/services/storage.js.map +1 -1
- package/lib/services/storage.spec.js +113 -169
- package/lib/services/storage.spec.js.map +1 -1
- package/package.json +13 -10
- package/webda.module.json +98 -66
package/lib/services/storage.js
CHANGED
|
@@ -1,37 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.Storage = exports.StorageParameters = void 0;
|
|
13
|
-
const storage_1 = require("@google-cloud/storage");
|
|
14
|
-
const core_1 = require("@webda/core");
|
|
15
|
-
const fs_1 = require("fs");
|
|
16
|
-
const mime = require("mime-types");
|
|
17
|
-
const stream_1 = require("stream");
|
|
18
|
-
class StorageParameters extends core_1.BinaryParameters {
|
|
2
|
+
import { Storage as GCS } from "@google-cloud/storage";
|
|
3
|
+
import { BinaryParameters, CloudBinary, getCommonJS } from "@webda/core";
|
|
4
|
+
import { createReadStream } from "fs";
|
|
5
|
+
import * as mime from "mime-types";
|
|
6
|
+
import { Readable, Stream } from "stream";
|
|
7
|
+
const { __dirname } = getCommonJS(import.meta.url);
|
|
8
|
+
export class StorageParameters extends BinaryParameters {
|
|
19
9
|
constructor(params, service) {
|
|
20
10
|
super(params, service);
|
|
21
11
|
this.prefix = "";
|
|
22
12
|
}
|
|
23
13
|
}
|
|
24
|
-
exports.StorageParameters = StorageParameters;
|
|
25
14
|
/**
|
|
26
15
|
* Storage handles the storage of binary on a Google Cloud Storage bucket
|
|
27
16
|
*
|
|
28
17
|
* See Binary the general interface
|
|
29
18
|
* @WebdaModda GoogleCloudStorage
|
|
30
19
|
*/
|
|
31
|
-
class Storage extends
|
|
20
|
+
export default class Storage extends CloudBinary {
|
|
32
21
|
get storage() {
|
|
33
22
|
if (!this._storage) {
|
|
34
|
-
this._storage = new
|
|
23
|
+
this._storage = new GCS();
|
|
35
24
|
}
|
|
36
25
|
return this._storage;
|
|
37
26
|
}
|
|
@@ -46,11 +35,9 @@ class Storage extends core_1.CloudBinary {
|
|
|
46
35
|
/**
|
|
47
36
|
* @override
|
|
48
37
|
*/
|
|
49
|
-
_get(info) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return this.getContent({ key });
|
|
53
|
-
});
|
|
38
|
+
async _get(info) {
|
|
39
|
+
const key = this._getKey(info.hash);
|
|
40
|
+
return this.getContent({ key });
|
|
54
41
|
}
|
|
55
42
|
/**
|
|
56
43
|
* @override
|
|
@@ -62,10 +49,8 @@ class Storage extends core_1.CloudBinary {
|
|
|
62
49
|
* Get object content in Buffer
|
|
63
50
|
* @param {StorageObject} params
|
|
64
51
|
*/
|
|
65
|
-
getContent({ bucket, key }) {
|
|
66
|
-
return
|
|
67
|
-
return this.getStorageBucket(bucket).file(key).createReadStream();
|
|
68
|
-
});
|
|
52
|
+
async getContent({ bucket, key }) {
|
|
53
|
+
return this.getStorageBucket(bucket).file(key).createReadStream();
|
|
69
54
|
}
|
|
70
55
|
/**
|
|
71
56
|
* Upload a local file to GCS bucket destination
|
|
@@ -75,39 +60,37 @@ class Storage extends core_1.CloudBinary {
|
|
|
75
60
|
* @param metadatas to put along the object
|
|
76
61
|
* @param bucket to use
|
|
77
62
|
*/
|
|
78
|
-
putObject(key, body, metadata = {}, bucket = this.parameters.bucket
|
|
63
|
+
async putObject(key, body, metadata = {}, bucket = this.parameters.bucket
|
|
79
64
|
//{ bucket, localPath, content, key }: PutObjectParams
|
|
80
65
|
) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
.on("finish", resolve);
|
|
105
|
-
});
|
|
106
|
-
// Save metadata now
|
|
107
|
-
if (metadata) {
|
|
108
|
-
yield file.setMetadata({ metadata: metadata });
|
|
109
|
-
}
|
|
66
|
+
const file = this.getStorageBucket(bucket).file(key);
|
|
67
|
+
let contentType = "application/octet-stream";
|
|
68
|
+
let stream;
|
|
69
|
+
if (body instanceof Readable) {
|
|
70
|
+
stream = body;
|
|
71
|
+
}
|
|
72
|
+
else if (body instanceof Buffer) {
|
|
73
|
+
const bufferStream = new Stream.PassThrough();
|
|
74
|
+
bufferStream.end(body);
|
|
75
|
+
stream = bufferStream;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
contentType = mime.lookup(body, "application/octet-stream");
|
|
79
|
+
stream = createReadStream(body);
|
|
80
|
+
}
|
|
81
|
+
// NODE16-REFACTOR: const { pipeline } = require('stream/promises');
|
|
82
|
+
await new Promise((resolve, reject) => {
|
|
83
|
+
stream
|
|
84
|
+
.pipe(file.createWriteStream({
|
|
85
|
+
contentType,
|
|
86
|
+
}))
|
|
87
|
+
.on("error", reject)
|
|
88
|
+
.on("finish", resolve);
|
|
110
89
|
});
|
|
90
|
+
// Save metadata now
|
|
91
|
+
if (metadata) {
|
|
92
|
+
await file.setMetadata({ metadata: metadata });
|
|
93
|
+
}
|
|
111
94
|
}
|
|
112
95
|
/**
|
|
113
96
|
* Return the Google Bucket directly
|
|
@@ -121,76 +104,67 @@ class Storage extends core_1.CloudBinary {
|
|
|
121
104
|
/**
|
|
122
105
|
* @inheritdoc
|
|
123
106
|
*/
|
|
124
|
-
_cleanUsage(hash, uuid) {
|
|
125
|
-
|
|
126
|
-
yield this.getStorageBucket().file(this._getKey(hash, uuid)).delete();
|
|
127
|
-
});
|
|
107
|
+
async _cleanUsage(hash, uuid) {
|
|
108
|
+
await this.getStorageBucket().file(this._getKey(hash, uuid)).delete();
|
|
128
109
|
}
|
|
129
110
|
/**
|
|
130
111
|
* @inheritdoc
|
|
131
112
|
*/
|
|
132
|
-
getUsageCount(hash) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
prefix: this._getKey(hash, ""),
|
|
136
|
-
});
|
|
137
|
-
return files.filter(n => !n.name.endsWith("/data")).length;
|
|
113
|
+
async getUsageCount(hash) {
|
|
114
|
+
const [files] = await this.getStorageBucket().getFiles({
|
|
115
|
+
prefix: this._getKey(hash, ""),
|
|
138
116
|
});
|
|
117
|
+
return files.filter(n => !n.name.endsWith("/data")).length;
|
|
139
118
|
}
|
|
140
119
|
/**
|
|
141
120
|
* @inheritdoc
|
|
142
121
|
*/
|
|
143
|
-
store(object, property, file) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
122
|
+
async store(object, property, file) {
|
|
123
|
+
this.checkMap(object.getStore().getName(), property);
|
|
124
|
+
await file.getHashes();
|
|
125
|
+
const [exists] = await this.getStorageBucket().file(this._getKey(file.hash)).exists();
|
|
126
|
+
// If data already exist no need to upload
|
|
127
|
+
if (!exists) {
|
|
128
|
+
await this.putObject(this._getKey(file.hash), await file.get(), {
|
|
129
|
+
...file.metadata,
|
|
130
|
+
challenge: file.challenge,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
await this.putMarker(file.hash, object.getUuid(), object.getStore().getName());
|
|
134
|
+
await this.uploadSuccess(object, property, file);
|
|
155
135
|
}
|
|
156
136
|
/**
|
|
157
137
|
* Delete a file inside an existing bucket
|
|
158
138
|
* @param {DeleteObjectParams} params
|
|
159
139
|
*/
|
|
160
|
-
deleteObject({ bucket, key }) {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
this._webda.log("DEBUG", `gs://${bucket}/${key} deleted`);
|
|
164
|
-
});
|
|
140
|
+
async deleteObject({ bucket, key }) {
|
|
141
|
+
await this.getStorageBucket(bucket).file(key).delete();
|
|
142
|
+
this._webda.log("DEBUG", `gs://${bucket}/${key} deleted`);
|
|
165
143
|
}
|
|
166
144
|
/**
|
|
167
145
|
* Move a file from one bucket to an other
|
|
168
146
|
* @param {StorageObject} source
|
|
169
147
|
* @param {StorageObject} destination
|
|
170
148
|
*/
|
|
171
|
-
moveObject(source, destination) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
yield this.getStorageBucket(source.bucket).file(source.key).move(newFile);
|
|
176
|
-
});
|
|
149
|
+
async moveObject(source, destination) {
|
|
150
|
+
const newFile = this.getStorageBucket(destination.bucket).file(destination.key);
|
|
151
|
+
this._webda.log("DEBUG", `moveObject gs://${source.bucket}/${source.key} => gs://${destination.bucket}/${destination.key}`);
|
|
152
|
+
await this.getStorageBucket(source.bucket).file(source.key).move(newFile);
|
|
177
153
|
}
|
|
178
154
|
/**
|
|
179
155
|
* Retrieve one signed URL to download the file in parameter
|
|
180
156
|
* @param {GetSignedUrlParams} params
|
|
181
157
|
* @returns {string} URL in order to download the file
|
|
182
158
|
*/
|
|
183
|
-
getSignedUrl({ bucket, key, action, expires = 3600 }) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
return url;
|
|
193
|
-
});
|
|
159
|
+
async getSignedUrl({ bucket, key, action, expires = 3600 }) {
|
|
160
|
+
const options = {
|
|
161
|
+
version: "v4",
|
|
162
|
+
action,
|
|
163
|
+
expires: Date.now() + expires * 1000,
|
|
164
|
+
};
|
|
165
|
+
const [url] = await this.getStorageBucket(bucket).file(key).getSignedUrl(options);
|
|
166
|
+
this._webda.log("TRACE", `The signed url for ${bucket}/${key} is ${url}.`);
|
|
167
|
+
return url;
|
|
194
168
|
}
|
|
195
169
|
/**
|
|
196
170
|
* Retrieve mandatory headers if needed by the cloud provider (ie. Azure)
|
|
@@ -205,40 +179,33 @@ class Storage extends core_1.CloudBinary {
|
|
|
205
179
|
* @param {StorageModel} store
|
|
206
180
|
* @returns {string} Public URL in order to download the file
|
|
207
181
|
*/
|
|
208
|
-
getPublicUrl({ bucket, key }) {
|
|
209
|
-
return
|
|
210
|
-
return this.getStorageBucket(bucket).file(key).publicUrl();
|
|
211
|
-
});
|
|
182
|
+
async getPublicUrl({ bucket, key }) {
|
|
183
|
+
return this.getStorageBucket(bucket).file(key).publicUrl();
|
|
212
184
|
}
|
|
213
185
|
/**
|
|
214
186
|
* Fetch an object's metadata
|
|
215
187
|
* @param {StorageModel} store
|
|
216
188
|
* @returns {any} Metadata
|
|
217
189
|
*/
|
|
218
|
-
getMeta({ bucket, key }) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
};
|
|
225
|
-
});
|
|
190
|
+
async getMeta({ bucket, key }) {
|
|
191
|
+
const [metadata] = await this.getStorageBucket(bucket).file(key).getMetadata();
|
|
192
|
+
return {
|
|
193
|
+
size: parseInt(metadata.size),
|
|
194
|
+
contentType: metadata.contentType,
|
|
195
|
+
};
|
|
226
196
|
}
|
|
227
197
|
/**
|
|
228
198
|
* @inheritdoc
|
|
229
199
|
*/
|
|
230
|
-
putMarker(hash, uuid, storeName) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
},
|
|
238
|
-
});
|
|
200
|
+
async putMarker(hash, uuid, storeName) {
|
|
201
|
+
await this.getStorageBucket()
|
|
202
|
+
.file(this._getKey(hash, uuid))
|
|
203
|
+
.save("", {
|
|
204
|
+
metadata: {
|
|
205
|
+
webdaStore: storeName,
|
|
206
|
+
},
|
|
239
207
|
});
|
|
240
208
|
}
|
|
241
209
|
}
|
|
242
|
-
|
|
243
|
-
exports.Storage = Storage;
|
|
210
|
+
export { Storage };
|
|
244
211
|
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/services/storage.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/services/storage.ts"],"names":[],"mappings":"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"}
|