@shushed/helpers 0.0.198-v2-20251121152811 → 0.0.198
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/index.d.ts +34970 -0
- package/dist/index.js +112969 -0
- package/dist/package.json +3 -6
- package/package.json +4 -7
- package/dist/cjs/dist-dereferenced/asset.js +0 -4
- package/dist/cjs/dist-dereferenced/category.js +0 -4
- package/dist/cjs/dist-dereferenced/country.js +0 -4
- package/dist/cjs/dist-dereferenced/currency.js +0 -4
- package/dist/cjs/dist-dereferenced/customer-segment.js +0 -4
- package/dist/cjs/dist-dereferenced/development-colour.js +0 -4
- package/dist/cjs/dist-dereferenced/index.js +0 -69
- package/dist/cjs/dist-dereferenced/marketing-preferences.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/ean-change.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/index.js +0 -50
- package/dist/cjs/dist-dereferenced/messages/order/delivered.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/order/index.js +0 -18
- package/dist/cjs/dist-dereferenced/messages/order/new.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/order/processed.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/order/return-initiated.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/order/returned.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/order/shipped.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/price-change.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/product-category.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/product-draft.js +0 -4
- package/dist/cjs/dist-dereferenced/messages/product.js +0 -4
- package/dist/cjs/dist-dereferenced/money.js +0 -4
- package/dist/cjs/dist-dereferenced/order/address.js +0 -4
- package/dist/cjs/dist-dereferenced/order/customer.js +0 -4
- package/dist/cjs/dist-dereferenced/order/index.js +0 -51
- package/dist/cjs/dist-dereferenced/order/item.js +0 -4
- package/dist/cjs/dist-dereferenced/order/orderMain.js +0 -4
- package/dist/cjs/dist-dereferenced/order/payment.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/index.js +0 -45
- package/dist/cjs/dist-dereferenced/order/shipment/item/index.js +0 -11
- package/dist/cjs/dist-dereferenced/order/shipment/item/itemMain.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/item/returned.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/pos/index.js +0 -13
- package/dist/cjs/dist-dereferenced/order/shipment/pos/outbound.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/pos/posMain.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/pos/return.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/shipmentMain.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/index.js +0 -13
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/outbound.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/return.js +0 -4
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/shippedMain.js +0 -4
- package/dist/cjs/dist-dereferenced/price.js +0 -4
- package/dist/cjs/dist-dereferenced/product-category.js +0 -4
- package/dist/cjs/dist-dereferenced/product-draft.js +0 -4
- package/dist/cjs/dist-dereferenced/product.js +0 -4
- package/dist/cjs/dist-dereferenced/stock.js +0 -4
- package/dist/cjs/dist-dereferenced/total.js +0 -4
- package/dist/cjs/dist-types/asset.js +0 -2
- package/dist/cjs/dist-types/category.js +0 -2
- package/dist/cjs/dist-types/country.js +0 -2
- package/dist/cjs/dist-types/currency.js +0 -2
- package/dist/cjs/dist-types/customer-segment.js +0 -2
- package/dist/cjs/dist-types/development-colour.js +0 -2
- package/dist/cjs/dist-types/index.js +0 -38
- package/dist/cjs/dist-types/marketing-preferences.js +0 -2
- package/dist/cjs/dist-types/messages/ean-change.js +0 -2
- package/dist/cjs/dist-types/messages/index.js +0 -37
- package/dist/cjs/dist-types/messages/order/delivered.js +0 -2
- package/dist/cjs/dist-types/messages/order/index.js +0 -2
- package/dist/cjs/dist-types/messages/order/new.js +0 -2
- package/dist/cjs/dist-types/messages/order/processed.js +0 -2
- package/dist/cjs/dist-types/messages/order/return-initiated.js +0 -2
- package/dist/cjs/dist-types/messages/order/returned.js +0 -2
- package/dist/cjs/dist-types/messages/order/shipped.js +0 -2
- package/dist/cjs/dist-types/messages/price-change.js +0 -2
- package/dist/cjs/dist-types/messages/product-category.js +0 -2
- package/dist/cjs/dist-types/messages/product-draft.js +0 -2
- package/dist/cjs/dist-types/messages/product.js +0 -2
- package/dist/cjs/dist-types/money.js +0 -2
- package/dist/cjs/dist-types/order/address.js +0 -2
- package/dist/cjs/dist-types/order/customer.js +0 -2
- package/dist/cjs/dist-types/order/index.js +0 -37
- package/dist/cjs/dist-types/order/item.js +0 -2
- package/dist/cjs/dist-types/order/orderMain.js +0 -2
- package/dist/cjs/dist-types/order/payment.js +0 -2
- package/dist/cjs/dist-types/order/shipment/index.js +0 -39
- package/dist/cjs/dist-types/order/shipment/item/index.js +0 -2
- package/dist/cjs/dist-types/order/shipment/item/itemMain.js +0 -2
- package/dist/cjs/dist-types/order/shipment/item/returned.js +0 -2
- package/dist/cjs/dist-types/order/shipment/pos/index.js +0 -2
- package/dist/cjs/dist-types/order/shipment/pos/outbound.js +0 -2
- package/dist/cjs/dist-types/order/shipment/pos/posMain.js +0 -2
- package/dist/cjs/dist-types/order/shipment/pos/return.js +0 -2
- package/dist/cjs/dist-types/order/shipment/shipmentMain.js +0 -2
- package/dist/cjs/dist-types/order/shipment/shipped/index.js +0 -2
- package/dist/cjs/dist-types/order/shipment/shipped/outbound.js +0 -2
- package/dist/cjs/dist-types/order/shipment/shipped/return.js +0 -2
- package/dist/cjs/dist-types/order/shipment/shipped/shippedMain.js +0 -2
- package/dist/cjs/dist-types/price.js +0 -2
- package/dist/cjs/dist-types/product-category.js +0 -2
- package/dist/cjs/dist-types/product-draft.js +0 -2
- package/dist/cjs/dist-types/product.js +0 -2
- package/dist/cjs/dist-types/stock.js +0 -2
- package/dist/cjs/dist-types/total.js +0 -2
- package/dist/cjs/index.js +0 -39
- package/dist/cjs/src-public/airtable.js +0 -590
- package/dist/cjs/src-public/bigquery.js +0 -59
- package/dist/cjs/src-public/cloudtasks.js +0 -207
- package/dist/cjs/src-public/dato.js +0 -260
- package/dist/cjs/src-public/env.js +0 -897
- package/dist/cjs/src-public/getEventTime.js +0 -28
- package/dist/cjs/src-public/index.js +0 -50
- package/dist/cjs/src-public/ipValidation.js +0 -167
- package/dist/cjs/src-public/jwks.js +0 -108
- package/dist/cjs/src-public/pubsub.js +0 -423
- package/dist/cjs/src-public/rateLimit.js +0 -140
- package/dist/cjs/src-public/redisClient.js +0 -44
- package/dist/cjs/src-public/runtime.js +0 -135
- package/dist/cjs/src-public/sanitize.js +0 -25
- package/dist/cjs/src-public/scheduler.js +0 -247
- package/dist/cjs/src-public/secret.js +0 -16
- package/dist/cjs/src-public/setHeaders.js +0 -16
- package/dist/cjs/src-public/types.js +0 -2
- package/dist/cjs/src-public/utils.js +0 -336
- package/dist/cjs/src-public/validate.js +0 -40
- package/dist/types/dist-dereferenced/asset.d.ts +0 -51
- package/dist/types/dist-dereferenced/category.d.ts +0 -58
- package/dist/types/dist-dereferenced/country.d.ts +0 -8
- package/dist/types/dist-dereferenced/currency.d.ts +0 -8
- package/dist/types/dist-dereferenced/customer-segment.d.ts +0 -26
- package/dist/types/dist-dereferenced/development-colour.d.ts +0 -114
- package/dist/types/dist-dereferenced/index.d.ts +0 -16
- package/dist/types/dist-dereferenced/marketing-preferences.d.ts +0 -31
- package/dist/types/dist-dereferenced/messages/ean-change.d.ts +0 -17
- package/dist/types/dist-dereferenced/messages/index.d.ts +0 -6
- package/dist/types/dist-dereferenced/messages/order/delivered.d.ts +0 -3414
- package/dist/types/dist-dereferenced/messages/order/index.d.ts +0 -6
- package/dist/types/dist-dereferenced/messages/order/new.d.ts +0 -3414
- package/dist/types/dist-dereferenced/messages/order/processed.d.ts +0 -3408
- package/dist/types/dist-dereferenced/messages/order/return-initiated.d.ts +0 -3414
- package/dist/types/dist-dereferenced/messages/order/returned.d.ts +0 -3413
- package/dist/types/dist-dereferenced/messages/order/shipped.d.ts +0 -3412
- package/dist/types/dist-dereferenced/messages/price-change.d.ts +0 -58
- package/dist/types/dist-dereferenced/messages/product-category.d.ts +0 -33
- package/dist/types/dist-dereferenced/messages/product-draft.d.ts +0 -589
- package/dist/types/dist-dereferenced/messages/product.d.ts +0 -628
- package/dist/types/dist-dereferenced/money.d.ts +0 -41
- package/dist/types/dist-dereferenced/order/address.d.ts +0 -98
- package/dist/types/dist-dereferenced/order/customer.d.ts +0 -309
- package/dist/types/dist-dereferenced/order/index.d.ts +0 -3404
- package/dist/types/dist-dereferenced/order/item.d.ts +0 -336
- package/dist/types/dist-dereferenced/order/orderMain.d.ts +0 -3399
- package/dist/types/dist-dereferenced/order/payment.d.ts +0 -94
- package/dist/types/dist-dereferenced/order/shipment/index.d.ts +0 -253
- package/dist/types/dist-dereferenced/order/shipment/item/index.d.ts +0 -19
- package/dist/types/dist-dereferenced/order/shipment/item/itemMain.d.ts +0 -18
- package/dist/types/dist-dereferenced/order/shipment/item/returned.d.ts +0 -34
- package/dist/types/dist-dereferenced/order/shipment/pos/index.d.ts +0 -282
- package/dist/types/dist-dereferenced/order/shipment/pos/outbound.d.ts +0 -320
- package/dist/types/dist-dereferenced/order/shipment/pos/posMain.d.ts +0 -280
- package/dist/types/dist-dereferenced/order/shipment/pos/return.d.ts +0 -331
- package/dist/types/dist-dereferenced/order/shipment/shipmentMain.d.ts +0 -250
- package/dist/types/dist-dereferenced/order/shipment/shipped/index.d.ts +0 -288
- package/dist/types/dist-dereferenced/order/shipment/shipped/outbound.d.ts +0 -286
- package/dist/types/dist-dereferenced/order/shipment/shipped/return.d.ts +0 -287
- package/dist/types/dist-dereferenced/order/shipment/shipped/shippedMain.d.ts +0 -286
- package/dist/types/dist-dereferenced/price.d.ts +0 -49
- package/dist/types/dist-dereferenced/product-category.d.ts +0 -24
- package/dist/types/dist-dereferenced/product-draft.d.ts +0 -580
- package/dist/types/dist-dereferenced/product.d.ts +0 -619
- package/dist/types/dist-dereferenced/stock.d.ts +0 -74
- package/dist/types/dist-dereferenced/total.d.ts +0 -172
- package/dist/types/dist-types/asset.d.ts +0 -16
- package/dist/types/dist-types/category.d.ts +0 -20
- package/dist/types/dist-types/country.d.ts +0 -2
- package/dist/types/dist-types/currency.d.ts +0 -2
- package/dist/types/dist-types/customer-segment.d.ts +0 -6
- package/dist/types/dist-types/development-colour.d.ts +0 -31
- package/dist/types/dist-types/index.d.ts +0 -16
- package/dist/types/dist-types/marketing-preferences.d.ts +0 -9
- package/dist/types/dist-types/messages/ean-change.d.ts +0 -5
- package/dist/types/dist-types/messages/index.d.ts +0 -6
- package/dist/types/dist-types/messages/order/delivered.d.ts +0 -292
- package/dist/types/dist-types/messages/order/index.d.ts +0 -6
- package/dist/types/dist-types/messages/order/new.d.ts +0 -292
- package/dist/types/dist-types/messages/order/processed.d.ts +0 -292
- package/dist/types/dist-types/messages/order/return-initiated.d.ts +0 -292
- package/dist/types/dist-types/messages/order/returned.d.ts +0 -293
- package/dist/types/dist-types/messages/order/shipped.d.ts +0 -293
- package/dist/types/dist-types/messages/price-change.d.ts +0 -15
- package/dist/types/dist-types/messages/product-category.d.ts +0 -7
- package/dist/types/dist-types/messages/product-draft.d.ts +0 -136
- package/dist/types/dist-types/messages/product.d.ts +0 -144
- package/dist/types/dist-types/money.d.ts +0 -11
- package/dist/types/dist-types/order/address.d.ts +0 -27
- package/dist/types/dist-types/order/customer.d.ts +0 -81
- package/dist/types/dist-types/order/index.d.ts +0 -8
- package/dist/types/dist-types/order/item.d.ts +0 -85
- package/dist/types/dist-types/order/orderMain.d.ts +0 -289
- package/dist/types/dist-types/order/payment.d.ts +0 -26
- package/dist/types/dist-types/order/shipment/index.d.ts +0 -6
- package/dist/types/dist-types/order/shipment/item/index.d.ts +0 -4
- package/dist/types/dist-types/order/shipment/item/itemMain.d.ts +0 -6
- package/dist/types/dist-types/order/shipment/item/returned.d.ts +0 -11
- package/dist/types/dist-types/order/shipment/pos/index.d.ts +0 -5
- package/dist/types/dist-types/order/shipment/pos/outbound.d.ts +0 -76
- package/dist/types/dist-types/order/shipment/pos/posMain.d.ts +0 -71
- package/dist/types/dist-types/order/shipment/pos/return.d.ts +0 -75
- package/dist/types/dist-types/order/shipment/shipmentMain.d.ts +0 -62
- package/dist/types/dist-types/order/shipment/shipped/index.d.ts +0 -5
- package/dist/types/dist-types/order/shipment/shipped/outbound.d.ts +0 -68
- package/dist/types/dist-types/order/shipment/shipped/return.d.ts +0 -68
- package/dist/types/dist-types/order/shipment/shipped/shippedMain.d.ts +0 -69
- package/dist/types/dist-types/price.d.ts +0 -14
- package/dist/types/dist-types/product-category.d.ts +0 -6
- package/dist/types/dist-types/product-draft.d.ts +0 -135
- package/dist/types/dist-types/product.d.ts +0 -143
- package/dist/types/dist-types/stock.d.ts +0 -19
- package/dist/types/dist-types/total.d.ts +0 -44
- package/dist/types/index.d.ts +0 -3
- package/dist/types/src-public/airtable.d.ts +0 -220
- package/dist/types/src-public/bigquery.d.ts +0 -17
- package/dist/types/src-public/cloudtasks.d.ts +0 -74
- package/dist/types/src-public/dato.d.ts +0 -55
- package/dist/types/src-public/env.d.ts +0 -144
- package/dist/types/src-public/getEventTime.d.ts +0 -1
- package/dist/types/src-public/index.d.ts +0 -16
- package/dist/types/src-public/ipValidation.d.ts +0 -15
- package/dist/types/src-public/jwks.d.ts +0 -15
- package/dist/types/src-public/pubsub.d.ts +0 -95
- package/dist/types/src-public/rateLimit.d.ts +0 -21
- package/dist/types/src-public/redisClient.d.ts +0 -6
- package/dist/types/src-public/runtime.d.ts +0 -56
- package/dist/types/src-public/sanitize.d.ts +0 -4
- package/dist/types/src-public/scheduler.d.ts +0 -71
- package/dist/types/src-public/secret.d.ts +0 -6
- package/dist/types/src-public/setHeaders.d.ts +0 -13
- package/dist/types/src-public/types.d.ts +0 -264
- package/dist/types/src-public/utils.d.ts +0 -67
- package/dist/types/src-public/validate.d.ts +0 -9
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
7
|
-
const runtime_1 = __importDefault(require("./runtime"));
|
|
8
|
-
const utils_1 = require("./utils");
|
|
9
|
-
async function gcpFetch(url, accessToken, options = {}) {
|
|
10
|
-
let res;
|
|
11
|
-
try {
|
|
12
|
-
res = await fetch(url, {
|
|
13
|
-
...options,
|
|
14
|
-
headers: {
|
|
15
|
-
...(options.headers || {}),
|
|
16
|
-
'Authorization': `Bearer ${accessToken}`,
|
|
17
|
-
'Content-Type': 'application/json',
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
if (!res.ok) {
|
|
21
|
-
const err = new Error(`GCP API error: ${res.status} ${res.statusText}`);
|
|
22
|
-
const body = await res.json().catch(() => ({
|
|
23
|
-
code: res.status,
|
|
24
|
-
}));
|
|
25
|
-
console.error('error', body);
|
|
26
|
-
err.message = body.error?.message || err.message;
|
|
27
|
-
err.code = body.error?.code || res.status;
|
|
28
|
-
throw err;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
const nextErr = Error(`GCP API error: ${err.message}`);
|
|
33
|
-
nextErr.code = err.code;
|
|
34
|
-
throw nextErr;
|
|
35
|
-
}
|
|
36
|
-
return res.json();
|
|
37
|
-
}
|
|
38
|
-
class CloudTasksHelper extends runtime_1.default {
|
|
39
|
-
projectId;
|
|
40
|
-
serviceAccount;
|
|
41
|
-
accessToken;
|
|
42
|
-
envName;
|
|
43
|
-
workflowId;
|
|
44
|
-
triggerId;
|
|
45
|
-
location = 'europe-west2';
|
|
46
|
-
constructor(opts) {
|
|
47
|
-
super(opts);
|
|
48
|
-
this.projectId = opts.projectId;
|
|
49
|
-
this.serviceAccount = opts.serviceAccount;
|
|
50
|
-
this.accessToken = opts.accessToken;
|
|
51
|
-
this.envName = opts.envName;
|
|
52
|
-
this.workflowId = opts.workflowId;
|
|
53
|
-
this.triggerId = opts.triggerId;
|
|
54
|
-
}
|
|
55
|
-
getQueueName(topicName) {
|
|
56
|
-
const infraPrefix = topicName.indexOf('---') !== -1 ? topicName : `${this.envName}---${topicName}-${crypto_1.default.createHash('sha256').update(this.triggerId).digest('hex').slice(0, 8)}`;
|
|
57
|
-
return `${infraPrefix}-${(0, utils_1.shortHash)(this.triggerId)}`;
|
|
58
|
-
}
|
|
59
|
-
getQueuePath(topicName) {
|
|
60
|
-
return `projects/${this.projectId}/locations/${this.location}/queues/${this.getQueueName(topicName)}`;
|
|
61
|
-
}
|
|
62
|
-
getQueueApiUrl(topicName) {
|
|
63
|
-
return `https://cloudtasks.googleapis.com/v2/${this.getQueuePath(topicName)}`;
|
|
64
|
-
}
|
|
65
|
-
getLocationApiUrl() {
|
|
66
|
-
return `https://cloudtasks.googleapis.com/v2/projects/${this.projectId}/locations/${this.location}`;
|
|
67
|
-
}
|
|
68
|
-
async getQueue(topicName) {
|
|
69
|
-
try {
|
|
70
|
-
const result = await gcpFetch(this.getQueueApiUrl(topicName), this.accessToken, { method: 'GET' });
|
|
71
|
-
return result;
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
console.error('error code', err.code);
|
|
75
|
-
if (err.code === 5 || err.message?.includes('notFound') || err.code === 404) {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
;
|
|
79
|
-
throw err;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
async createOrUpdateQueue(topicName, retryConfig = {
|
|
83
|
-
maxAttempts: 1,
|
|
84
|
-
maxRetryDuration: '60s',
|
|
85
|
-
minBackoff: '1s',
|
|
86
|
-
maxBackoff: '30s',
|
|
87
|
-
maxDoublings: 3,
|
|
88
|
-
}, rateLimits = {
|
|
89
|
-
maxDispatchesPerSecond: 20,
|
|
90
|
-
maxConcurrentDispatches: 1,
|
|
91
|
-
}) {
|
|
92
|
-
const queuePath = this.getQueuePath(topicName);
|
|
93
|
-
const queueApiUrl = this.getQueueApiUrl(topicName);
|
|
94
|
-
const locationApiUrl = this.getLocationApiUrl();
|
|
95
|
-
const queueConfig = {
|
|
96
|
-
name: queuePath,
|
|
97
|
-
retryConfig: retryConfig || { maxAttempts: 1 },
|
|
98
|
-
rateLimits: rateLimits || undefined,
|
|
99
|
-
};
|
|
100
|
-
const queue = await this.getQueue(topicName);
|
|
101
|
-
if (!queue) {
|
|
102
|
-
await gcpFetch(`${locationApiUrl}/queues`, this.accessToken, {
|
|
103
|
-
method: 'POST',
|
|
104
|
-
body: JSON.stringify(queueConfig),
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else if ((retryConfig && (queue.retryConfig?.maxAttempts !== retryConfig.maxAttempts ||
|
|
108
|
-
queue.retryConfig?.maxRetryDuration !== retryConfig.maxRetryDuration ||
|
|
109
|
-
queue.retryConfig?.minBackoff !== retryConfig.minBackoff ||
|
|
110
|
-
queue.retryConfig?.maxBackoff !== retryConfig.maxBackoff ||
|
|
111
|
-
queue.retryConfig?.maxDoublings !== retryConfig.maxDoublings)) ||
|
|
112
|
-
(rateLimits && ((queue.rateLimits?.maxDispatchesPerSecond !== rateLimits.maxDispatchesPerSecond) ||
|
|
113
|
-
queue.rateLimits?.maxConcurrentDispatches !== rateLimits.maxConcurrentDispatches))) {
|
|
114
|
-
await gcpFetch(queueApiUrl, this.accessToken, {
|
|
115
|
-
method: 'PATCH',
|
|
116
|
-
body: JSON.stringify(queueConfig),
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
async listTasks(topicName) {
|
|
121
|
-
const url = `${this.getQueueApiUrl(topicName)}/tasks`;
|
|
122
|
-
const res = await gcpFetch(url, this.accessToken, { method: 'GET' });
|
|
123
|
-
return res.tasks || [];
|
|
124
|
-
}
|
|
125
|
-
async deleteTask(taskName) {
|
|
126
|
-
const url = `https://cloudtasks.googleapis.com/v2/${taskName}`;
|
|
127
|
-
await gcpFetch(url, this.accessToken, { method: 'DELETE' }).catch(err => {
|
|
128
|
-
if (err.code === 404 || err.code === 6)
|
|
129
|
-
return;
|
|
130
|
-
throw err;
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
async create(opts) {
|
|
134
|
-
const queuePath = this.getQueuePath(opts.topicName);
|
|
135
|
-
if (opts.deleteExistingTasks) {
|
|
136
|
-
const tasks = await this.listTasks(opts.topicName);
|
|
137
|
-
await Promise.allSettled(tasks.map(async (task) => {
|
|
138
|
-
try {
|
|
139
|
-
await this.deleteTask(task.name);
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
if (err.code !== 5)
|
|
143
|
-
throw err;
|
|
144
|
-
}
|
|
145
|
-
}));
|
|
146
|
-
}
|
|
147
|
-
const repeat = opts.repeatCount || 1;
|
|
148
|
-
const scheduleSeconds = opts.scheduleSeconds || 0;
|
|
149
|
-
const createdTaskNames = [];
|
|
150
|
-
for (let i = 0; i < repeat; i++) {
|
|
151
|
-
const scheduledDate = scheduleSeconds ? new Date(Date.now() + 1000 * scheduleSeconds * (i + 1)) : new Date();
|
|
152
|
-
const taskId = opts.doNotCreateIfExists ? crypto_1.default.createHash('sha256').update(opts.doNotCreateIfExists + (Object.entries(opts.extraQuery || {}).sort().map(x => x.join('=')).join('&'))).digest('hex').slice(0, 8) : undefined;
|
|
153
|
-
const scheduleTime = scheduleSeconds ? scheduledDate.toISOString() : undefined;
|
|
154
|
-
const httpRequest = {
|
|
155
|
-
httpMethod: opts.httpTarget.httpMethod || 'POST',
|
|
156
|
-
url: opts.httpTarget.uri || this.runtimeUrl + `/executeWorkflow/${this.workflowId}/${this.triggerId}?cloud_task=${opts.topicName}&schedule_time=${scheduledDate.toISOString()}&${new URLSearchParams(opts.extraQuery).toString()}`,
|
|
157
|
-
headers: opts.httpTarget.headers || {
|
|
158
|
-
'Content-Type': 'application/json',
|
|
159
|
-
'User-Agent': 'CloudTasks-Google',
|
|
160
|
-
},
|
|
161
|
-
body: opts.httpTarget.body ? Buffer.from(JSON.stringify(opts.httpTarget.body)).toString('base64') : undefined,
|
|
162
|
-
oidcToken: {
|
|
163
|
-
serviceAccountEmail: this.serviceAccount,
|
|
164
|
-
audience: process.env.GCLOUD_PROJECT + "/" + this.triggerId,
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
try {
|
|
168
|
-
const url = `${this.getQueueApiUrl(opts.topicName)}/tasks`;
|
|
169
|
-
const body = {
|
|
170
|
-
task: {
|
|
171
|
-
name: taskId ? `${queuePath}/tasks/${taskId}` : undefined,
|
|
172
|
-
scheduleTime: scheduleTime ? scheduleTime : undefined,
|
|
173
|
-
httpRequest,
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
const res = await gcpFetch(url, this.accessToken, {
|
|
177
|
-
method: 'POST',
|
|
178
|
-
body: JSON.stringify(body),
|
|
179
|
-
});
|
|
180
|
-
if (res.name) {
|
|
181
|
-
createdTaskNames.push(res.name);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
if (err.code === 5)
|
|
186
|
-
return false;
|
|
187
|
-
if ((err.code === 6 || err.code === 409) && opts.doNotCreateIfExists)
|
|
188
|
-
return false;
|
|
189
|
-
throw err;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return createdTaskNames;
|
|
193
|
-
}
|
|
194
|
-
async delete(topicName) {
|
|
195
|
-
const queueApiUrl = this.getQueueApiUrl(topicName);
|
|
196
|
-
try {
|
|
197
|
-
await gcpFetch(queueApiUrl, this.accessToken, { method: 'DELETE' });
|
|
198
|
-
return true;
|
|
199
|
-
}
|
|
200
|
-
catch (err) {
|
|
201
|
-
if (err.code === 5 || err.code === 404)
|
|
202
|
-
return false;
|
|
203
|
-
throw err;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
exports.default = CloudTasksHelper;
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const fs_1 = __importDefault(require("fs"));
|
|
7
|
-
const path_1 = __importDefault(require("path"));
|
|
8
|
-
const mime_types_1 = require("mime-types");
|
|
9
|
-
const runtime_1 = __importDefault(require("./runtime"));
|
|
10
|
-
class DatoHelper extends runtime_1.default {
|
|
11
|
-
apiToken;
|
|
12
|
-
baseUrl;
|
|
13
|
-
constructor(opts, datoOpts) {
|
|
14
|
-
super(opts);
|
|
15
|
-
this.apiToken = datoOpts.apiToken;
|
|
16
|
-
this.baseUrl = datoOpts.baseUrl || 'https://site-api.datocms.com';
|
|
17
|
-
}
|
|
18
|
-
async requestUploadParameters(filename) {
|
|
19
|
-
const response = await fetch(`${this.baseUrl}/upload-requests`, {
|
|
20
|
-
method: 'POST',
|
|
21
|
-
headers: {
|
|
22
|
-
'X-Api-Version': '3',
|
|
23
|
-
'Authorization': `Bearer ${this.apiToken}`,
|
|
24
|
-
'Content-Type': "application/vnd.api+json",
|
|
25
|
-
'Accept': 'application/json',
|
|
26
|
-
},
|
|
27
|
-
body: JSON.stringify({
|
|
28
|
-
data: {
|
|
29
|
-
type: 'upload_request',
|
|
30
|
-
attributes: {
|
|
31
|
-
filename: filename,
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
}),
|
|
35
|
-
});
|
|
36
|
-
if (!response.ok) {
|
|
37
|
-
const errorText = await response.text();
|
|
38
|
-
this.logging.error(`Failed to request upload parameters: ${response.statusText} - ${errorText}`);
|
|
39
|
-
throw new Error(`Failed to request upload parameters: ${response.statusText} - ${errorText}`);
|
|
40
|
-
}
|
|
41
|
-
return await response.json();
|
|
42
|
-
}
|
|
43
|
-
async uploadToStorageBucket(opts, uploadData, fileStream) {
|
|
44
|
-
let blob;
|
|
45
|
-
if (fileStream instanceof ReadableStream) {
|
|
46
|
-
const response = new Response(fileStream);
|
|
47
|
-
blob = await response.blob();
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const chunks = [];
|
|
51
|
-
for await (const chunk of fileStream) {
|
|
52
|
-
chunks.push(chunk);
|
|
53
|
-
}
|
|
54
|
-
const buffer = Buffer.concat(chunks);
|
|
55
|
-
blob = new Blob([buffer]);
|
|
56
|
-
}
|
|
57
|
-
const response = await fetch(uploadData.attributes.url, {
|
|
58
|
-
method: 'PUT',
|
|
59
|
-
headers: {
|
|
60
|
-
'Content-Type': opts.contentType,
|
|
61
|
-
},
|
|
62
|
-
body: blob,
|
|
63
|
-
});
|
|
64
|
-
if (!response.ok) {
|
|
65
|
-
const errorText = await response.text();
|
|
66
|
-
this.logging.error(`Failed to upload to storage bucket: ${response.statusText} - ${errorText}`);
|
|
67
|
-
throw new Error(`Failed to upload to storage bucket: ${response.statusText} - ${errorText}`);
|
|
68
|
-
}
|
|
69
|
-
return response;
|
|
70
|
-
}
|
|
71
|
-
async createAssetFromUpload(uploadId, opts, uploadCollectionId) {
|
|
72
|
-
const body = {
|
|
73
|
-
data: {
|
|
74
|
-
type: 'upload',
|
|
75
|
-
attributes: {
|
|
76
|
-
path: uploadId,
|
|
77
|
-
author: opts.author,
|
|
78
|
-
copyright: opts.copyright,
|
|
79
|
-
notes: opts.notes || null,
|
|
80
|
-
defaultFieldMetadata: {
|
|
81
|
-
en: {
|
|
82
|
-
title: opts.title,
|
|
83
|
-
alt: opts.alt,
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
tags: opts.tags || [],
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
if (uploadCollectionId) {
|
|
91
|
-
body.data.relationships = {
|
|
92
|
-
upload_collection: {
|
|
93
|
-
data: {
|
|
94
|
-
type: 'upload_collection',
|
|
95
|
-
id: uploadCollectionId,
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
const response = await fetch(`${this.baseUrl}/uploads`, {
|
|
101
|
-
method: 'POST',
|
|
102
|
-
headers: {
|
|
103
|
-
'Authorization': `Bearer ${this.apiToken}`,
|
|
104
|
-
'Accept': 'application/json',
|
|
105
|
-
'X-Api-Version': '3',
|
|
106
|
-
'Content-Type': 'application/vnd.api+json',
|
|
107
|
-
},
|
|
108
|
-
body: JSON.stringify(body),
|
|
109
|
-
});
|
|
110
|
-
if (!response.ok) {
|
|
111
|
-
const errorText = await response.text();
|
|
112
|
-
this.logging.error(`Failed to create asset from upload: ${response.statusText} - ${errorText}`);
|
|
113
|
-
throw new Error(`Failed to create asset from upload: ${response.statusText} - ${errorText}`);
|
|
114
|
-
}
|
|
115
|
-
return await response.json();
|
|
116
|
-
}
|
|
117
|
-
async checkJobResult(jobId) {
|
|
118
|
-
const response = await fetch(`${this.baseUrl}/job-results/${jobId}`, {
|
|
119
|
-
method: 'GET',
|
|
120
|
-
headers: {
|
|
121
|
-
'Authorization': `Bearer ${this.apiToken}`,
|
|
122
|
-
'Accept': 'application/json',
|
|
123
|
-
'X-Api-Version': '3',
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
if (!response.ok) {
|
|
127
|
-
if (response.status === 404) {
|
|
128
|
-
return null;
|
|
129
|
-
}
|
|
130
|
-
const errorText = await response.text();
|
|
131
|
-
this.logging.error(`Failed to check job result: ${response.statusText} - ${errorText}`);
|
|
132
|
-
throw new Error(`Failed to check job result: ${response.statusText} - ${errorText}`);
|
|
133
|
-
}
|
|
134
|
-
return await response.json();
|
|
135
|
-
}
|
|
136
|
-
async waitForJobCompletion(jobId, maxAttempts = 30) {
|
|
137
|
-
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
138
|
-
const jobResult = await this.checkJobResult(jobId);
|
|
139
|
-
if (jobResult?.data.attributes.status >= 200 && jobResult?.data.attributes.status < 300) {
|
|
140
|
-
return jobResult.data.attributes.payload;
|
|
141
|
-
}
|
|
142
|
-
if (jobResult?.data.attributes.status) {
|
|
143
|
-
const errorMsg = `Job failed: ${JSON.stringify(jobResult.data)}`;
|
|
144
|
-
this.logging.error(errorMsg);
|
|
145
|
-
throw new Error(errorMsg);
|
|
146
|
-
}
|
|
147
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
148
|
-
}
|
|
149
|
-
const timeoutMsg = 'Job completion timeout';
|
|
150
|
-
this.logging.error(timeoutMsg);
|
|
151
|
-
throw new Error(timeoutMsg);
|
|
152
|
-
}
|
|
153
|
-
async uploadFromUrl(options) {
|
|
154
|
-
const { url, filename, uploadCollectionId } = options;
|
|
155
|
-
this.logging.log(`Starting upload from URL: ${url}`);
|
|
156
|
-
const fileResponse = await fetch(url);
|
|
157
|
-
if (!fileResponse.ok) {
|
|
158
|
-
const errorMsg = `Failed to fetch file from URL: ${fileResponse.statusText}`;
|
|
159
|
-
this.logging.error(errorMsg);
|
|
160
|
-
throw new Error(errorMsg);
|
|
161
|
-
}
|
|
162
|
-
let finalFilename = filename || path_1.default.basename(new URL(url).pathname) || 'bs-' + this.triggerId + '-' + new Date().getTime();
|
|
163
|
-
if (!path_1.default.extname(finalFilename) && fileResponse.headers.has('content-type')) {
|
|
164
|
-
finalFilename += `.${(0, mime_types_1.extension)(fileResponse.headers.get('content-type'))}`;
|
|
165
|
-
}
|
|
166
|
-
const uploadRequest = await this.requestUploadParameters(finalFilename);
|
|
167
|
-
const uploadId = uploadRequest.data.id;
|
|
168
|
-
if (!fileResponse.body) {
|
|
169
|
-
throw new Error('Response body is null');
|
|
170
|
-
}
|
|
171
|
-
const contentType = fileResponse.headers.get('content-type') || (0, mime_types_1.lookup)(finalFilename) || 'application/octet-stream';
|
|
172
|
-
await this.uploadToStorageBucket({ contentType }, uploadRequest.data, fileResponse.body);
|
|
173
|
-
const assetJob = await this.createAssetFromUpload(uploadId, options, uploadCollectionId);
|
|
174
|
-
const jobId = assetJob.data.id;
|
|
175
|
-
const assetPayload = await this.waitForJobCompletion(jobId);
|
|
176
|
-
this.logging.log(`Upload completed successfully: ${assetPayload.data.attributes.url}`);
|
|
177
|
-
return {
|
|
178
|
-
success: true,
|
|
179
|
-
upload: assetPayload.data.attributes.url,
|
|
180
|
-
assetId: assetPayload.data.id,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
async uploadFromFile(options) {
|
|
184
|
-
const { filePath, filename, uploadCollectionId } = options;
|
|
185
|
-
if (!fs_1.default.existsSync(filePath)) {
|
|
186
|
-
const errorMsg = `File not found: ${filePath}`;
|
|
187
|
-
this.logging.error(errorMsg);
|
|
188
|
-
throw new Error(errorMsg);
|
|
189
|
-
}
|
|
190
|
-
this.logging.log(`Starting upload from file: ${filePath}`);
|
|
191
|
-
const finalFilename = filename || path_1.default.basename(filePath);
|
|
192
|
-
const uploadRequest = await this.requestUploadParameters(finalFilename);
|
|
193
|
-
const uploadId = uploadRequest.data.id;
|
|
194
|
-
const fileStream = fs_1.default.createReadStream(filePath);
|
|
195
|
-
const contentType = (0, mime_types_1.lookup)(filePath) || 'application/octet-stream';
|
|
196
|
-
await this.uploadToStorageBucket({ contentType }, uploadRequest.data, fileStream);
|
|
197
|
-
const assetJob = await this.createAssetFromUpload(uploadId, options, uploadCollectionId);
|
|
198
|
-
const jobId = assetJob.data.id;
|
|
199
|
-
const assetPayload = await this.waitForJobCompletion(jobId);
|
|
200
|
-
this.logging.log(`Upload completed successfully: ${assetPayload.data.attributes.url}`);
|
|
201
|
-
return {
|
|
202
|
-
success: true,
|
|
203
|
-
upload: assetPayload.data.attributes.url,
|
|
204
|
-
assetId: assetPayload.data.id,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
async getUploadCollections() {
|
|
208
|
-
const response = await fetch(`${this.baseUrl}/upload-collections`, {
|
|
209
|
-
method: 'GET',
|
|
210
|
-
headers: {
|
|
211
|
-
'X-Api-Version': '3',
|
|
212
|
-
'Authorization': `Bearer ${this.apiToken}`,
|
|
213
|
-
'Accept': 'application/json',
|
|
214
|
-
},
|
|
215
|
-
});
|
|
216
|
-
if (!response.ok) {
|
|
217
|
-
const errorText = await response.text();
|
|
218
|
-
this.logging.error(`Failed to fetch upload collections: ${response.statusText} - ${errorText}`);
|
|
219
|
-
throw new Error(`Failed to fetch upload collections: ${response.statusText} - ${errorText}`);
|
|
220
|
-
}
|
|
221
|
-
return await response.json();
|
|
222
|
-
}
|
|
223
|
-
async findUploadCollectionByLabel(label) {
|
|
224
|
-
const collections = await this.getUploadCollections();
|
|
225
|
-
return collections.data?.find((collection) => collection.attributes.label === label) || null;
|
|
226
|
-
}
|
|
227
|
-
static buildUrl(asset, opts) {
|
|
228
|
-
const src = (asset ?? '').trim();
|
|
229
|
-
const hasAnyNewOption = typeof opts.width === 'number' ||
|
|
230
|
-
typeof opts.height === 'number' ||
|
|
231
|
-
typeof opts.crop === 'string' ||
|
|
232
|
-
typeof opts.quality === 'number' ||
|
|
233
|
-
typeof opts.format === 'string';
|
|
234
|
-
const qIndex = src.indexOf('?');
|
|
235
|
-
const base = qIndex === -1 ? src : src.slice(0, qIndex);
|
|
236
|
-
const existingQuery = qIndex === -1 ? '' : src.slice(qIndex + 1);
|
|
237
|
-
if (opts.overrideExisting && !hasAnyNewOption) {
|
|
238
|
-
return base;
|
|
239
|
-
}
|
|
240
|
-
const params = new URLSearchParams(opts.overrideExisting ? '' : existingQuery);
|
|
241
|
-
const setNum = (key, val) => {
|
|
242
|
-
if (typeof val === 'number' && Number.isFinite(val)) {
|
|
243
|
-
params.set(key, String(val));
|
|
244
|
-
}
|
|
245
|
-
};
|
|
246
|
-
const setStr = (key, val) => {
|
|
247
|
-
if (typeof val === 'string' && val.length > 0) {
|
|
248
|
-
params.set(key, val);
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
setNum('w', opts.width);
|
|
252
|
-
setNum('h', opts.height);
|
|
253
|
-
setStr('crop', opts.crop);
|
|
254
|
-
setNum('q', opts.quality);
|
|
255
|
-
setStr('fm', opts.format);
|
|
256
|
-
const query = params.toString();
|
|
257
|
-
return query ? `${base}?${query}` : base;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
exports.default = DatoHelper;
|