@pi-r/azure 0.7.3 → 0.8.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 +22 -24
- package/download/index.js +9 -4
- package/package.json +5 -5
- package/upload/index.js +15 -6
package/client/index.js
CHANGED
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
exports.CLOUD_DOWNLOAD_CHUNK = exports.CLOUD_UPLOAD_CHUNK = exports.CLOUD_UPLOAD_STREAM =
|
|
2
|
+
exports.CLOUD_DOWNLOAD_CHUNK = exports.CLOUD_UPLOAD_CHUNK = exports.CLOUD_UPLOAD_STREAM = void 0;
|
|
3
|
+
exports.validateStorage = validateStorage;
|
|
4
|
+
exports.validateDatabase = validateDatabase;
|
|
5
|
+
exports.createStorageClient = createStorageClient;
|
|
6
|
+
exports.createDatabaseClient = createDatabaseClient;
|
|
7
|
+
exports.createBucket = createBucket;
|
|
8
|
+
exports.createBucketV2 = createBucketV2;
|
|
9
|
+
exports.setBucketWebsite = setBucketWebsite;
|
|
10
|
+
exports.deleteObjects = deleteObjects;
|
|
11
|
+
exports.deleteObjectsV2 = deleteObjectsV2;
|
|
12
|
+
exports.executeQuery = executeQuery;
|
|
13
|
+
exports.executeBatchQuery = executeBatchQuery;
|
|
3
14
|
const path = require("path");
|
|
4
15
|
const storage = require("@azure/storage-blob");
|
|
5
16
|
const cosmos = require("@azure/cosmos");
|
|
6
17
|
const identity = require("@azure/identity");
|
|
7
|
-
const types_1 = require("@e-mc/types");
|
|
8
|
-
const util_1 = require("@e-mc/cloud/util");
|
|
9
18
|
const Cloud = require("@e-mc/cloud");
|
|
19
|
+
const util_1 = require("@e-mc/cloud/util");
|
|
20
|
+
const types_1 = require("@e-mc/types");
|
|
10
21
|
function validateStorage(credential) {
|
|
11
22
|
const env = process.env;
|
|
12
23
|
if (credential.accountName && credential.accountKey || credential.connectionString || credential.sharedAccessSignature || env.AZURE_TENANT_ID && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET) {
|
|
@@ -14,11 +25,9 @@ function validateStorage(credential) {
|
|
|
14
25
|
}
|
|
15
26
|
return Cloud.enabled("process.env.apply") && !!((credential.connectionString = env.AZURE_STORAGE_CONNECTION_STRING) || (credential.sharedAccessSignature = env.AZURE_STORAGE_SAS_TOKEN) || (credential.accountName = env.AZURE_STORAGE_ACCOUNT) && (credential.accountKey = env.AZURE_STORAGE_KEY));
|
|
16
27
|
}
|
|
17
|
-
exports.validateStorage = validateStorage;
|
|
18
28
|
function validateDatabase(credential, data) {
|
|
19
29
|
return !!(data.name && data.table && (credential.endpoint && credential.key || credential.username && credential.password && (credential.tenantId && credential.clientId || (credential.tenantId = process.env.AZURE_TENANT_ID) && (credential.clientId = process.env.AZURE_CLIENT_ID)) || Cloud.enabled("process.env.apply") && (credential.endpoint = process.env.AZURE_COSMOS_ENDPOINT) && (credential.key = process.env.AZURE_COSMOS_KEY)));
|
|
20
30
|
}
|
|
21
|
-
exports.validateDatabase = validateDatabase;
|
|
22
31
|
function createStorageClient(credential) {
|
|
23
32
|
let { accountName, accountKey, connectionString, sharedAccessSignature } = credential;
|
|
24
33
|
if (connectionString) {
|
|
@@ -41,7 +50,6 @@ function createStorageClient(credential) {
|
|
|
41
50
|
}
|
|
42
51
|
return new storage.BlobServiceClient(url, accountName && accountKey ? new storage.StorageSharedKeyCredential(accountName, accountKey) : new identity.DefaultAzureCredential());
|
|
43
52
|
}
|
|
44
|
-
exports.createStorageClient = createStorageClient;
|
|
45
53
|
function createDatabaseClient(credential) {
|
|
46
54
|
if (credential.username && credential.password && credential.tenantId && credential.clientId) {
|
|
47
55
|
credential.aadCredentials = new identity.UsernamePasswordCredential(credential.username, credential.password, credential.tenantId, credential.clientId);
|
|
@@ -53,11 +61,9 @@ function createDatabaseClient(credential) {
|
|
|
53
61
|
}
|
|
54
62
|
return new cosmos.CosmosClient(credential);
|
|
55
63
|
}
|
|
56
|
-
exports.createDatabaseClient = createDatabaseClient;
|
|
57
64
|
async function createBucket(credential, bucket, publicRead, service = 'azure') {
|
|
58
65
|
return createBucketV2.call(this, credential, bucket, publicRead ? 'blob' : 'container', undefined, service);
|
|
59
66
|
}
|
|
60
|
-
exports.createBucket = createBucket;
|
|
61
67
|
async function createBucketV2(credential, bucket, access, options, service = 'azure') {
|
|
62
68
|
switch (access) {
|
|
63
69
|
case 'blob':
|
|
@@ -68,7 +74,11 @@ async function createBucketV2(credential, bucket, access, options, service = 'az
|
|
|
68
74
|
break;
|
|
69
75
|
}
|
|
70
76
|
const containerClient = createStorageClient.call(this, credential).getContainerClient(bucket);
|
|
71
|
-
const setAccessPolicy = async () =>
|
|
77
|
+
const setAccessPolicy = async () => {
|
|
78
|
+
return containerClient.setAccessPolicy(access).catch((err) => {
|
|
79
|
+
this.formatMessage(64, service, ["Unable to configure container", bucket], err, { ...Cloud.LOG_CLOUD_WARN });
|
|
80
|
+
});
|
|
81
|
+
};
|
|
72
82
|
if (await containerClient.exists().catch(() => false)) {
|
|
73
83
|
if (access) {
|
|
74
84
|
await setAccessPolicy();
|
|
@@ -102,7 +112,6 @@ async function createBucketV2(credential, bucket, access, options, service = 'az
|
|
|
102
112
|
return false;
|
|
103
113
|
});
|
|
104
114
|
}
|
|
105
|
-
exports.createBucketV2 = createBucketV2;
|
|
106
115
|
async function setBucketWebsite(credential, bucket, options, service = 'azure') {
|
|
107
116
|
const staticWebsite = { enabled: true };
|
|
108
117
|
const { indexPage, indexPath, errorPath } = options;
|
|
@@ -131,11 +140,9 @@ async function setBucketWebsite(credential, bucket, options, service = 'azure')
|
|
|
131
140
|
return false;
|
|
132
141
|
});
|
|
133
142
|
}
|
|
134
|
-
exports.setBucketWebsite = setBucketWebsite;
|
|
135
143
|
async function deleteObjects(credential, Bucket, service) {
|
|
136
144
|
return deleteObjectsV2.call(this, credential, Bucket, true, service);
|
|
137
145
|
}
|
|
138
|
-
exports.deleteObjects = deleteObjects;
|
|
139
146
|
async function deleteObjectsV2(credential, bucket, recursive = true, service = 'azure') {
|
|
140
147
|
const containerClient = createStorageClient.call(this, credential).getContainerClient(bucket);
|
|
141
148
|
if (await containerClient.exists().catch(() => false)) {
|
|
@@ -160,11 +167,9 @@ async function deleteObjectsV2(credential, bucket, recursive = true, service = '
|
|
|
160
167
|
}
|
|
161
168
|
}
|
|
162
169
|
}
|
|
163
|
-
exports.deleteObjectsV2 = deleteObjectsV2;
|
|
164
170
|
async function executeQuery(credential, data, sessionKey) {
|
|
165
171
|
return (await executeBatchQuery.call(this, credential, [data], sessionKey))[0] || [];
|
|
166
172
|
}
|
|
167
|
-
exports.executeQuery = executeQuery;
|
|
168
173
|
async function executeBatchQuery(credential, batch, sessionKey) {
|
|
169
174
|
const length = batch.length;
|
|
170
175
|
const result = new Array(length);
|
|
@@ -183,17 +188,11 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
183
188
|
closeClient();
|
|
184
189
|
throw (0, util_1.formatError)(item, name ? "Missing database table" : "Missing database name");
|
|
185
190
|
}
|
|
186
|
-
const getCache = (value) => {
|
|
187
|
-
if (ignoreCache !== 1) {
|
|
188
|
-
cacheValue.renewCache = ignoreCache === 0;
|
|
189
|
-
return this.getQueryResult(service, credential, value, cacheValue);
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
191
|
cacheValue.exclusiveOf = Array.isArray(ignoreCache) ? ignoreCache : undefined;
|
|
193
192
|
let rows, queryString = caching && ignoreCache !== true ? name + '_' + table + '_' : '';
|
|
194
193
|
if (storedProcedureId && params) {
|
|
195
194
|
const { options } = item;
|
|
196
|
-
if (queryString && (rows =
|
|
195
|
+
if (queryString && (rows = this.getCacheResult(service, credential, queryString += (partitionKey ? Cloud.asString(partitionKey, true) : '') + '_' + storedProcedureId + '_' + Cloud.asString(params, true) + Cloud.asString(options, true), cacheValue, ignoreCache))) {
|
|
197
196
|
result[i] = rows;
|
|
198
197
|
continue;
|
|
199
198
|
}
|
|
@@ -206,7 +205,7 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
206
205
|
const { options } = item;
|
|
207
206
|
if (queryString) {
|
|
208
207
|
queryString += (partitionKey ? Cloud.asString(partitionKey, true) : '') + '_' + id + '_' + Cloud.asString(options, true);
|
|
209
|
-
if (!update && (rows =
|
|
208
|
+
if (!update && (rows = this.getCacheResult(service, credential, queryString, cacheValue, ignoreCache))) {
|
|
210
209
|
result[i] = rows;
|
|
211
210
|
continue;
|
|
212
211
|
}
|
|
@@ -226,7 +225,7 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
226
225
|
(options ||= {}).maxItemCount = limit;
|
|
227
226
|
}
|
|
228
227
|
if (query || (0, types_1.isPlainObject)(options)) {
|
|
229
|
-
if (queryString && (rows =
|
|
228
|
+
if (queryString && (rows = this.getCacheResult(service, credential, queryString += (query ? Cloud.asString(query, true) : '') + Cloud.asString(options, true), cacheValue, ignoreCache))) {
|
|
230
229
|
result[i] = rows;
|
|
231
230
|
continue;
|
|
232
231
|
}
|
|
@@ -243,7 +242,6 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
243
242
|
closeClient();
|
|
244
243
|
return result;
|
|
245
244
|
}
|
|
246
|
-
exports.executeBatchQuery = executeBatchQuery;
|
|
247
245
|
exports.CLOUD_UPLOAD_STREAM = true;
|
|
248
246
|
exports.CLOUD_UPLOAD_CHUNK = true;
|
|
249
247
|
exports.CLOUD_DOWNLOAD_CHUNK = true;
|
package/download/index.js
CHANGED
|
@@ -3,7 +3,7 @@ const types_1 = require("@e-mc/types");
|
|
|
3
3
|
const path = require("path");
|
|
4
4
|
const Cloud = require("@e-mc/cloud");
|
|
5
5
|
const client_1 = require("@pi-r/azure");
|
|
6
|
-
|
|
6
|
+
function download(credential, service = 'azure') {
|
|
7
7
|
const blobServiceClient = client_1.createStorageClient.call(this, credential);
|
|
8
8
|
return (data, callback) => {
|
|
9
9
|
const { bucket: Bucket, download: target } = data;
|
|
@@ -16,7 +16,9 @@ module.exports = function download(credential, service = 'azure') {
|
|
|
16
16
|
const downloadResponse = (err, url) => {
|
|
17
17
|
callback(err, url);
|
|
18
18
|
if (tempDir) {
|
|
19
|
-
queueMicrotask(() =>
|
|
19
|
+
queueMicrotask(() => {
|
|
20
|
+
Cloud.removeDir(tempDir);
|
|
21
|
+
});
|
|
20
22
|
}
|
|
21
23
|
};
|
|
22
24
|
const { flags = 0 } = target;
|
|
@@ -44,6 +46,9 @@ module.exports = function download(credential, service = 'azure') {
|
|
|
44
46
|
});
|
|
45
47
|
}
|
|
46
48
|
})
|
|
47
|
-
.catch((err) =>
|
|
49
|
+
.catch((err) => {
|
|
50
|
+
downloadResponse(err);
|
|
51
|
+
});
|
|
48
52
|
};
|
|
49
|
-
}
|
|
53
|
+
}
|
|
54
|
+
module.exports = download;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-r/azure",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Azure cloud functions for E-mc.",
|
|
5
5
|
"main": "client/index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -20,11 +20,11 @@
|
|
|
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.
|
|
23
|
+
"@e-mc/cloud": "^0.10.0",
|
|
24
|
+
"@e-mc/module": "^0.10.0",
|
|
25
|
+
"@e-mc/types": "^0.10.0",
|
|
26
26
|
"@azure/cosmos": "^4.0.0",
|
|
27
|
-
"@azure/identity": "^4.4.
|
|
27
|
+
"@azure/identity": "^4.4.1",
|
|
28
28
|
"@azure/storage-blob": "^12.24.0"
|
|
29
29
|
}
|
|
30
30
|
}
|
package/upload/index.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
const path = require("path");
|
|
3
3
|
const fs = require("fs");
|
|
4
4
|
const stream = require("stream");
|
|
5
|
+
const Cloud = require("@e-mc/cloud");
|
|
5
6
|
const util_1 = require("@e-mc/cloud/util");
|
|
6
7
|
const types_1 = require("@e-mc/types");
|
|
7
|
-
const Cloud = require("@e-mc/cloud");
|
|
8
8
|
const client_1 = require("@pi-r/azure");
|
|
9
9
|
const BUCKET_SESSION = new Set();
|
|
10
10
|
const BUCKET_RESPONSE = {};
|
|
11
11
|
const getBucketKey = (credential, bucket, acl = '') => Cloud.asString(credential, true) + bucket + '_' + acl;
|
|
12
|
-
|
|
12
|
+
function upload(credential, service = 'azure') {
|
|
13
13
|
const blobServiceClient = client_1.createStorageClient.call(this, credential);
|
|
14
14
|
return async (data, callback) => {
|
|
15
15
|
const { bucket, localUri } = data;
|
|
@@ -26,7 +26,11 @@ module.exports = function upload(credential, service = 'azure') {
|
|
|
26
26
|
cleanup();
|
|
27
27
|
callback(err);
|
|
28
28
|
};
|
|
29
|
-
const addLog = (err) =>
|
|
29
|
+
const addLog = (err) => {
|
|
30
|
+
if (err instanceof Error) {
|
|
31
|
+
this.addLog(this.statusType.WARN, err, service, bucket);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
30
34
|
const configBucket = admin.configBucket;
|
|
31
35
|
if (!BUCKET_SESSION.has(bucket)) {
|
|
32
36
|
const bucketAcl = admin.publicRead ? 'blob' : admin.acl;
|
|
@@ -44,7 +48,9 @@ module.exports = function upload(credential, service = 'azure') {
|
|
|
44
48
|
}
|
|
45
49
|
try {
|
|
46
50
|
if (this.hasCoerce(service, 'options')) {
|
|
47
|
-
|
|
51
|
+
for (const policy of retentionPolicy) {
|
|
52
|
+
(0, types_1.coerceObject)(policy);
|
|
53
|
+
}
|
|
48
54
|
}
|
|
49
55
|
}
|
|
50
56
|
catch {
|
|
@@ -54,7 +60,9 @@ module.exports = function upload(credential, service = 'azure') {
|
|
|
54
60
|
const { expiresOn, startsOn, permissions } = retentionPolicy[0].accessPolicy;
|
|
55
61
|
this.formatMessage(64, service, ["Bucket configured" + ' (retention policy)', bucket], expiresOn ? expiresOn.toLocaleString() + ' (expires)' : startsOn ? startsOn.toLocaleString() + ' (starts)' : permissions, { ...Cloud.LOG_CLOUD_COMMAND });
|
|
56
62
|
})
|
|
57
|
-
.catch((err) =>
|
|
63
|
+
.catch((err) => {
|
|
64
|
+
addLog(err);
|
|
65
|
+
});
|
|
58
66
|
}
|
|
59
67
|
if (!overwrite) {
|
|
60
68
|
try {
|
|
@@ -188,4 +196,5 @@ module.exports = function upload(credential, service = 'azure') {
|
|
|
188
196
|
});
|
|
189
197
|
}
|
|
190
198
|
};
|
|
191
|
-
}
|
|
199
|
+
}
|
|
200
|
+
module.exports = upload;
|