@pi-r/gcp 0.3.1 → 0.6.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/client/index.js +87 -63
- package/package.json +5 -5
- package/upload/index.js +11 -2
package/client/index.js
CHANGED
|
@@ -63,7 +63,7 @@ async function hasBucket(client) {
|
|
|
63
63
|
const [exists] = await client.exists().catch(err => isErrorConflict(err) ? [true] : [false]);
|
|
64
64
|
return exists;
|
|
65
65
|
}
|
|
66
|
-
function updatePredefinedAcl(acl, values, metadata = {}) {
|
|
66
|
+
async function updatePredefinedAcl(acl, values, metadata = {}) {
|
|
67
67
|
const items = [];
|
|
68
68
|
let projectNumber;
|
|
69
69
|
if ('projectNumber' in metadata || 'defaultObjectAcl' in metadata) {
|
|
@@ -102,7 +102,7 @@ function updatePredefinedAcl(acl, values, metadata = {}) {
|
|
|
102
102
|
})
|
|
103
103
|
.catch(err => [err]);
|
|
104
104
|
}
|
|
105
|
-
function setUniformBucketLevel(bucket, enabled) {
|
|
105
|
+
async function setUniformBucketLevel(bucket, enabled) {
|
|
106
106
|
return bucket.setMetadata({ iamConfiguration: { uniformBucketLevelAccess: { enabled } } });
|
|
107
107
|
}
|
|
108
108
|
const getFirebasePackageName = (credential) => credential.apiKey && credential.authDomain ? 'firebase' : 'firebase-admin';
|
|
@@ -135,7 +135,7 @@ function createStorageClient(credential, bucket) {
|
|
|
135
135
|
throw err;
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
|
-
|
|
138
|
+
getProjectId(credential);
|
|
139
139
|
return new storage.Storage(credential);
|
|
140
140
|
}
|
|
141
141
|
exports.createStorageClient = createStorageClient;
|
|
@@ -150,7 +150,7 @@ function createDatabaseClient(credential, data) {
|
|
|
150
150
|
packageName = getFirebasePackageName(credential);
|
|
151
151
|
return getApp(credential, true);
|
|
152
152
|
}
|
|
153
|
-
|
|
153
|
+
getProjectId(credential);
|
|
154
154
|
if (data) {
|
|
155
155
|
if (product === 'spanner' || !product && name && data.database) {
|
|
156
156
|
const { Spanner } = require(packageName = '@google-cloud/spanner');
|
|
@@ -263,9 +263,9 @@ async function setBucketPolicy(credential, bucket, options, service = 'gcp') {
|
|
|
263
263
|
return true;
|
|
264
264
|
}
|
|
265
265
|
exports.setBucketPolicy = setBucketPolicy;
|
|
266
|
-
function setBucketWebsite(credential, bucket, options, service = 'gcp') {
|
|
266
|
+
async function setBucketWebsite(credential, bucket, options, service = 'gcp') {
|
|
267
267
|
if (isFirebaseApp(credential, true, true)) {
|
|
268
|
-
return
|
|
268
|
+
return false;
|
|
269
269
|
}
|
|
270
270
|
const website = {};
|
|
271
271
|
const { indexPage, errorPage } = options;
|
|
@@ -286,7 +286,7 @@ function setBucketWebsite(credential, bucket, options, service = 'gcp') {
|
|
|
286
286
|
});
|
|
287
287
|
}
|
|
288
288
|
exports.setBucketWebsite = setBucketWebsite;
|
|
289
|
-
function deleteObjects(credential, Bucket, service) {
|
|
289
|
+
async function deleteObjects(credential, Bucket, service) {
|
|
290
290
|
return deleteObjectsV2.call(this, credential, Bucket, true, service);
|
|
291
291
|
}
|
|
292
292
|
exports.deleteObjects = deleteObjects;
|
|
@@ -314,7 +314,7 @@ async function deleteObjectsV2(credential, bucket, recursive = true, service = '
|
|
|
314
314
|
}
|
|
315
315
|
})('');
|
|
316
316
|
if (files.length) {
|
|
317
|
-
promise = Promise.allSettled(files.map(value => deleteObject(ref(instance, value))));
|
|
317
|
+
promise = Promise.allSettled(files.map(async (value) => deleteObject(ref(instance, value))));
|
|
318
318
|
}
|
|
319
319
|
}
|
|
320
320
|
else {
|
|
@@ -327,7 +327,7 @@ async function deleteObjectsV2(credential, bucket, recursive = true, service = '
|
|
|
327
327
|
try {
|
|
328
328
|
const result = await client.getFiles();
|
|
329
329
|
for (const { name } of result[0]) {
|
|
330
|
-
if (name.
|
|
330
|
+
if (!name.includes('/')) {
|
|
331
331
|
tasks.push(client.file(name).delete({ ignoreNotFound: true }).catch(err => this.formatFail(64 /* LOG_TYPE.CLOUD */, service, ["Delete failed" /* ERR_CLOUD.DELETE_FAIL */, name], err, { ...Cloud.LOG_CLOUD_FAIL, fatal: false })));
|
|
332
332
|
}
|
|
333
333
|
}
|
|
@@ -411,11 +411,10 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
411
411
|
const renewCache = ignoreCache === 0;
|
|
412
412
|
const cached = caching && ignoreCache !== true || ignoreCache === false || ignoreCache === 1 || renewCache;
|
|
413
413
|
const getCache = (value) => {
|
|
414
|
-
if (ignoreCache
|
|
415
|
-
|
|
414
|
+
if (ignoreCache !== 1) {
|
|
415
|
+
cacheValue.renewCache = renewCache;
|
|
416
|
+
return this.getQueryResult(service, credential, value, cacheValue);
|
|
416
417
|
}
|
|
417
|
-
cacheValue.renewCache = renewCache;
|
|
418
|
-
return this.getQueryResult(service, credential, value, cacheValue);
|
|
419
418
|
};
|
|
420
419
|
let rows, queryString = '';
|
|
421
420
|
if (product === 'bigtable' || !product && name && table && !database) {
|
|
@@ -464,7 +463,7 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
464
463
|
}
|
|
465
464
|
const { updateType, options = {} } = item;
|
|
466
465
|
if (cached) {
|
|
467
|
-
queryString = name + '_' + database + '_' + (table ? table + Module.asString(columns, true) : '') + Module.asString(query, true) + limit;
|
|
466
|
+
queryString = name + '_' + database + '_' + (table ? table + (columns ? Module.asString(columns, true) : '') : '') + Module.asString(query, true) + limit;
|
|
468
467
|
if (!update && (rows = getCache(queryString))) {
|
|
469
468
|
result[i] = rows;
|
|
470
469
|
continue;
|
|
@@ -493,7 +492,7 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
493
492
|
}
|
|
494
493
|
else {
|
|
495
494
|
transaction.runUpdate(update)
|
|
496
|
-
.then(() => transaction.commit().then(() => resolve()).catch(error => reject(error)))
|
|
495
|
+
.then(async () => transaction.commit().then(() => resolve()).catch(error => reject(error)))
|
|
497
496
|
.catch(error => reject(error));
|
|
498
497
|
}
|
|
499
498
|
});
|
|
@@ -581,13 +580,19 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
581
580
|
closeClient();
|
|
582
581
|
throw (0, util_1.formatError)(item, "Missing database query" /* ERR_DB.QUERY */);
|
|
583
582
|
}
|
|
584
|
-
if (cached
|
|
585
|
-
|
|
586
|
-
|
|
583
|
+
if (cached) {
|
|
584
|
+
queryString = Module.asString(keys || query, true) + Module.asString(item.options, true) + limit;
|
|
585
|
+
if (!update && (rows = getCache(queryString))) {
|
|
586
|
+
result[i] = rows;
|
|
587
|
+
continue;
|
|
588
|
+
}
|
|
587
589
|
}
|
|
588
590
|
const db = createClient(item, 2 /* DB.DATASTORE */);
|
|
589
591
|
if (keys) {
|
|
590
|
-
const items = !Array.isArray(keys) ? db.key(keys) : keys.map((key) => db.key(key));
|
|
592
|
+
const items = !Array.isArray(keys) || !Array.isArray(keys[0]) ? db.key(keys) : keys.map((key) => db.key(key));
|
|
593
|
+
if ((0, types_1.isPlainObject)(update)) {
|
|
594
|
+
await db.save({ key: items, data: update });
|
|
595
|
+
}
|
|
591
596
|
rows = await db.get(items, item.options);
|
|
592
597
|
if (rows.length > limit) {
|
|
593
598
|
rows = rows.slice(0, limit);
|
|
@@ -595,23 +600,36 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
595
600
|
}
|
|
596
601
|
else {
|
|
597
602
|
const task = db.createQuery(item.kind);
|
|
603
|
+
if ((0, types_1.isPlainObject)(update)) {
|
|
604
|
+
await new Promise((resolve, reject) => {
|
|
605
|
+
db.runQuery(task.select('__key__'), item.options).then(entities => {
|
|
606
|
+
if ((0, types_1.isArray)(entities)) {
|
|
607
|
+
const items = entities.map((entity) => db.key(entity[db.KEY]));
|
|
608
|
+
db.save({ key: items, data: update }).then(() => resolve()).catch(err => reject(err));
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
resolve();
|
|
612
|
+
}
|
|
613
|
+
})
|
|
614
|
+
.catch(err => reject(err));
|
|
615
|
+
});
|
|
616
|
+
}
|
|
598
617
|
for (const args of query) {
|
|
599
|
-
if (
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
break;
|
|
618
|
+
if ((0, types_1.isArray)(args)) {
|
|
619
|
+
const method = args[0];
|
|
620
|
+
switch (method) {
|
|
621
|
+
case 'end':
|
|
622
|
+
case 'filter':
|
|
623
|
+
case 'groupBy':
|
|
624
|
+
case 'hasAncestor':
|
|
625
|
+
case 'limit':
|
|
626
|
+
case 'offset':
|
|
627
|
+
case 'order':
|
|
628
|
+
case 'select':
|
|
629
|
+
case 'start':
|
|
630
|
+
task[method].apply(task, args.slice(1)); // eslint-disable-line prefer-spread
|
|
631
|
+
break;
|
|
632
|
+
}
|
|
615
633
|
}
|
|
616
634
|
}
|
|
617
635
|
if (limit > 0) {
|
|
@@ -652,24 +670,23 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
652
670
|
}
|
|
653
671
|
let db = createClient(item, 3 /* DB.FIRESTORE */).collection(table);
|
|
654
672
|
for (const args of query) {
|
|
655
|
-
if (
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
break;
|
|
673
|
+
if ((0, types_1.isArray)(args)) {
|
|
674
|
+
const method = args[0];
|
|
675
|
+
switch (method) {
|
|
676
|
+
case 'endAt':
|
|
677
|
+
case 'endBefore':
|
|
678
|
+
case 'limit':
|
|
679
|
+
case 'limitToLast':
|
|
680
|
+
case 'offset':
|
|
681
|
+
case 'orderBy':
|
|
682
|
+
case 'select':
|
|
683
|
+
case 'startAfter':
|
|
684
|
+
case 'startAt':
|
|
685
|
+
case 'where':
|
|
686
|
+
case 'withConverter':
|
|
687
|
+
db = db[method].apply(db, args.slice(1)); // eslint-disable-line prefer-spread
|
|
688
|
+
break;
|
|
689
|
+
}
|
|
673
690
|
}
|
|
674
691
|
}
|
|
675
692
|
if ((0, types_1.isArray)(orderBy)) {
|
|
@@ -777,7 +794,7 @@ async function setPredefinedAcl(target, value, bucket, pathname = '', metadata =
|
|
|
777
794
|
}
|
|
778
795
|
break;
|
|
779
796
|
default:
|
|
780
|
-
return
|
|
797
|
+
return;
|
|
781
798
|
}
|
|
782
799
|
}
|
|
783
800
|
}
|
|
@@ -821,18 +838,25 @@ function createBucketRequest(credential) {
|
|
|
821
838
|
}
|
|
822
839
|
exports.createBucketRequest = createBucketRequest;
|
|
823
840
|
function getProjectId(credential) {
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
if (
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
841
|
+
let pathname = credential.keyFilename || credential.keyFile;
|
|
842
|
+
if (pathname && Module.isPath(pathname = path.resolve(pathname)) || (pathname = process.env.GOOGLE_APPLICATION_CREDENTIALS) && Module.isPath(pathname = path.resolve(pathname))) {
|
|
843
|
+
if (credential.keyFilename) {
|
|
844
|
+
credential.keyFilename = pathname;
|
|
845
|
+
}
|
|
846
|
+
else {
|
|
847
|
+
credential.keyFile = pathname;
|
|
848
|
+
}
|
|
849
|
+
if (!credential.projectId) {
|
|
850
|
+
try {
|
|
851
|
+
const projectId = require(pathname).project_id;
|
|
852
|
+
if ((0, types_1.isString)(projectId)) {
|
|
853
|
+
credential.projectId = projectId;
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
catch {
|
|
830
857
|
}
|
|
831
858
|
}
|
|
832
859
|
}
|
|
833
|
-
catch {
|
|
834
|
-
}
|
|
835
|
-
return '';
|
|
836
860
|
}
|
|
837
861
|
exports.getProjectId = getProjectId;
|
|
838
862
|
exports.CLOUD_UPLOAD_FROMDISK = true;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-r/gcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Google (GCP) cloud functions for E-mc.",
|
|
5
5
|
"main": "client/index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -20,10 +20,10 @@
|
|
|
20
20
|
"license": "MIT",
|
|
21
21
|
"homepage": "https://github.com/anpham6/pi-r#readme",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@e-mc/cloud": "^0.
|
|
24
|
-
"@e-mc/module": "^0.
|
|
25
|
-
"@e-mc/types": "^0.
|
|
26
|
-
"@google-cloud/firestore": "^
|
|
23
|
+
"@e-mc/cloud": "^0.8.0",
|
|
24
|
+
"@e-mc/module": "^0.8.0",
|
|
25
|
+
"@e-mc/types": "^0.8.0",
|
|
26
|
+
"@google-cloud/firestore": "^7.1.0",
|
|
27
27
|
"@google-cloud/storage": "^7.7.0"
|
|
28
28
|
}
|
|
29
29
|
}
|
package/upload/index.js
CHANGED
|
@@ -27,6 +27,7 @@ function upload(credential, service = 'gcp') {
|
|
|
27
27
|
}
|
|
28
28
|
callback(err, url);
|
|
29
29
|
};
|
|
30
|
+
const addLog = (err) => err instanceof Error && this.addLog(this.statusType.WARN, err, service, bucket);
|
|
30
31
|
if (firebase) {
|
|
31
32
|
const { ref, listAll } = require('@firebase/storage');
|
|
32
33
|
bucketClient = ref(storage, bucket);
|
|
@@ -41,9 +42,10 @@ function upload(credential, service = 'gcp') {
|
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
else {
|
|
45
|
+
const configBucket = admin.configBucket;
|
|
44
46
|
if (!BUCKET_SESSION.has(bucket)) {
|
|
45
47
|
const bucketAcl = admin.publicRead ? 'publicRead' : admin.acl;
|
|
46
|
-
const response = BUCKET_RESPONSE[_a = bucketKey = getBucketKey(credential, bucket, bucketAcl)] || (BUCKET_RESPONSE[_a] = client_1.createBucketV2.call(this, credential, bucket, bucketAcl,
|
|
48
|
+
const response = BUCKET_RESPONSE[_a = bucketKey = getBucketKey(credential, bucket, bucketAcl)] || (BUCKET_RESPONSE[_a] = client_1.createBucketV2.call(this, credential, bucket, bucketAcl, configBucket?.create || (0, client_1.createBucketRequest)(credential)));
|
|
47
49
|
if (!await response) {
|
|
48
50
|
uploadResponse(null);
|
|
49
51
|
return;
|
|
@@ -51,6 +53,14 @@ function upload(credential, service = 'gcp') {
|
|
|
51
53
|
BUCKET_SESSION.add(bucket);
|
|
52
54
|
}
|
|
53
55
|
bucketClient = storage.bucket(bucket);
|
|
56
|
+
const retentionPolicy = configBucket?.retentionPolicy;
|
|
57
|
+
if (typeof retentionPolicy === 'number') {
|
|
58
|
+
bucketClient.setRetentionPeriod(retentionPolicy)
|
|
59
|
+
.then(([response]) => {
|
|
60
|
+
this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, ["Bucket configured" /* VAL_CLOUD.CONFIGURE_BUCKET */ + ' (retention policy)', bucket], response.retentionPolicy?.effectiveTime, { ...Cloud.LOG_CLOUD_COMMAND });
|
|
61
|
+
})
|
|
62
|
+
.catch(err => addLog(err));
|
|
63
|
+
}
|
|
54
64
|
}
|
|
55
65
|
if (!overwrite && (!listFiles || listFiles.length)) {
|
|
56
66
|
const current = filename;
|
|
@@ -79,7 +89,6 @@ function upload(credential, service = 'gcp') {
|
|
|
79
89
|
const Body = [data.buffer];
|
|
80
90
|
const ContentType = [contentType];
|
|
81
91
|
const getURL = (value) => endpoint ? Module.joinPath(endpoint, value) : Module.joinPath("https://storage.googleapis.com" /* STRINGS.BASE_URL */, bucket, value);
|
|
82
|
-
const addLog = (err) => err instanceof Error && this.addLog(this.statusType.WARN, err.message, service + ': ' + bucket);
|
|
83
92
|
if (fileGroup) {
|
|
84
93
|
for (const [content, ext, localFile] of fileGroup) {
|
|
85
94
|
Key.push(ext === '.map' && localFile ? path.basename(localFile) : filename + ext);
|