@shushed/helpers 0.0.199 → 0.0.200-runtime-url-fix-20251125155626
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/cjs/dist-dereferenced/asset.js +4 -0
- package/dist/cjs/dist-dereferenced/category.js +4 -0
- package/dist/cjs/dist-dereferenced/country.js +4 -0
- package/dist/cjs/dist-dereferenced/currency.js +4 -0
- package/dist/cjs/dist-dereferenced/customer-segment.js +4 -0
- package/dist/cjs/dist-dereferenced/development-colour.js +4 -0
- package/dist/cjs/dist-dereferenced/index.js +69 -0
- package/dist/cjs/dist-dereferenced/marketing-preferences.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/ean-change.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/index.js +50 -0
- package/dist/cjs/dist-dereferenced/messages/order/delivered.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/order/index.js +18 -0
- package/dist/cjs/dist-dereferenced/messages/order/new.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/order/processed.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/order/return-initiated.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/order/returned.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/order/shipped.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/price-change.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/product-category.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/product-draft.js +4 -0
- package/dist/cjs/dist-dereferenced/messages/product.js +4 -0
- package/dist/cjs/dist-dereferenced/money.js +4 -0
- package/dist/cjs/dist-dereferenced/order/address.js +4 -0
- package/dist/cjs/dist-dereferenced/order/customer.js +4 -0
- package/dist/cjs/dist-dereferenced/order/index.js +51 -0
- package/dist/cjs/dist-dereferenced/order/item.js +4 -0
- package/dist/cjs/dist-dereferenced/order/orderMain.js +4 -0
- package/dist/cjs/dist-dereferenced/order/payment.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/index.js +45 -0
- package/dist/cjs/dist-dereferenced/order/shipment/item/index.js +11 -0
- package/dist/cjs/dist-dereferenced/order/shipment/item/itemMain.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/item/returned.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/pos/index.js +13 -0
- package/dist/cjs/dist-dereferenced/order/shipment/pos/outbound.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/pos/posMain.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/pos/return.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/shipmentMain.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/index.js +13 -0
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/outbound.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/return.js +4 -0
- package/dist/cjs/dist-dereferenced/order/shipment/shipped/shippedMain.js +4 -0
- package/dist/cjs/dist-dereferenced/price.js +4 -0
- package/dist/cjs/dist-dereferenced/product-category.js +4 -0
- package/dist/cjs/dist-dereferenced/product-draft.js +4 -0
- package/dist/cjs/dist-dereferenced/product.js +4 -0
- package/dist/cjs/dist-dereferenced/stock.js +4 -0
- package/dist/cjs/dist-dereferenced/total.js +4 -0
- package/dist/cjs/dist-types/asset.js +2 -0
- package/dist/cjs/dist-types/category.js +2 -0
- package/dist/cjs/dist-types/country.js +2 -0
- package/dist/cjs/dist-types/currency.js +2 -0
- package/dist/cjs/dist-types/customer-segment.js +2 -0
- package/dist/cjs/dist-types/development-colour.js +2 -0
- package/dist/cjs/dist-types/index.js +38 -0
- package/dist/cjs/dist-types/marketing-preferences.js +2 -0
- package/dist/cjs/dist-types/messages/ean-change.js +2 -0
- package/dist/cjs/dist-types/messages/index.js +37 -0
- package/dist/cjs/dist-types/messages/order/delivered.js +2 -0
- package/dist/cjs/dist-types/messages/order/index.js +2 -0
- package/dist/cjs/dist-types/messages/order/new.js +2 -0
- package/dist/cjs/dist-types/messages/order/processed.js +2 -0
- package/dist/cjs/dist-types/messages/order/return-initiated.js +2 -0
- package/dist/cjs/dist-types/messages/order/returned.js +2 -0
- package/dist/cjs/dist-types/messages/order/shipped.js +2 -0
- package/dist/cjs/dist-types/messages/price-change.js +2 -0
- package/dist/cjs/dist-types/messages/product-category.js +2 -0
- package/dist/cjs/dist-types/messages/product-draft.js +2 -0
- package/dist/cjs/dist-types/messages/product.js +2 -0
- package/dist/cjs/dist-types/money.js +2 -0
- package/dist/cjs/dist-types/order/address.js +2 -0
- package/dist/cjs/dist-types/order/customer.js +2 -0
- package/dist/cjs/dist-types/order/index.js +37 -0
- package/dist/cjs/dist-types/order/item.js +2 -0
- package/dist/cjs/dist-types/order/orderMain.js +2 -0
- package/dist/cjs/dist-types/order/payment.js +2 -0
- package/dist/cjs/dist-types/order/shipment/index.js +39 -0
- package/dist/cjs/dist-types/order/shipment/item/index.js +2 -0
- package/dist/cjs/dist-types/order/shipment/item/itemMain.js +2 -0
- package/dist/cjs/dist-types/order/shipment/item/returned.js +2 -0
- package/dist/cjs/dist-types/order/shipment/pos/index.js +2 -0
- package/dist/cjs/dist-types/order/shipment/pos/outbound.js +2 -0
- package/dist/cjs/dist-types/order/shipment/pos/posMain.js +2 -0
- package/dist/cjs/dist-types/order/shipment/pos/return.js +2 -0
- package/dist/cjs/dist-types/order/shipment/shipmentMain.js +2 -0
- package/dist/cjs/dist-types/order/shipment/shipped/index.js +2 -0
- package/dist/cjs/dist-types/order/shipment/shipped/outbound.js +2 -0
- package/dist/cjs/dist-types/order/shipment/shipped/return.js +2 -0
- package/dist/cjs/dist-types/order/shipment/shipped/shippedMain.js +2 -0
- package/dist/cjs/dist-types/price.js +2 -0
- package/dist/cjs/dist-types/product-category.js +2 -0
- package/dist/cjs/dist-types/product-draft.js +2 -0
- package/dist/cjs/dist-types/product.js +2 -0
- package/dist/cjs/dist-types/stock.js +2 -0
- package/dist/cjs/dist-types/total.js +2 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/src-public/airtable.js +562 -0
- package/dist/cjs/src-public/bigquery.js +59 -0
- package/dist/cjs/src-public/cloudtasks.js +207 -0
- package/dist/cjs/src-public/dato.js +637 -0
- package/dist/cjs/src-public/env.js +897 -0
- package/dist/cjs/src-public/getEventTime.js +28 -0
- package/dist/cjs/src-public/index.js +50 -0
- package/dist/cjs/src-public/ipValidation.js +167 -0
- package/dist/cjs/src-public/jwks.js +108 -0
- package/dist/cjs/src-public/pubsub.js +423 -0
- package/dist/cjs/src-public/rateLimit.js +140 -0
- package/dist/cjs/src-public/redisClient.js +44 -0
- package/dist/cjs/src-public/runtime.js +141 -0
- package/dist/cjs/src-public/sanitize.js +25 -0
- package/dist/cjs/src-public/scheduler.js +247 -0
- package/dist/cjs/src-public/secret.js +16 -0
- package/dist/cjs/src-public/setHeaders.js +16 -0
- package/dist/cjs/src-public/types.js +2 -0
- package/dist/cjs/src-public/utils.js +336 -0
- package/dist/cjs/src-public/validate.js +40 -0
- package/dist/package.json +6 -3
- package/dist/types/dist-dereferenced/asset.d.ts +51 -0
- package/dist/types/dist-dereferenced/category.d.ts +58 -0
- package/dist/types/dist-dereferenced/country.d.ts +8 -0
- package/dist/types/dist-dereferenced/currency.d.ts +8 -0
- package/dist/types/dist-dereferenced/customer-segment.d.ts +26 -0
- package/dist/types/dist-dereferenced/development-colour.d.ts +114 -0
- package/dist/types/dist-dereferenced/index.d.ts +16 -0
- package/dist/types/dist-dereferenced/marketing-preferences.d.ts +31 -0
- package/dist/types/dist-dereferenced/messages/ean-change.d.ts +17 -0
- package/dist/types/dist-dereferenced/messages/index.d.ts +6 -0
- package/dist/types/dist-dereferenced/messages/order/delivered.d.ts +3432 -0
- package/dist/types/dist-dereferenced/messages/order/index.d.ts +6 -0
- package/dist/types/dist-dereferenced/messages/order/new.d.ts +3432 -0
- package/dist/types/dist-dereferenced/messages/order/processed.d.ts +3426 -0
- package/dist/types/dist-dereferenced/messages/order/return-initiated.d.ts +3432 -0
- package/dist/types/dist-dereferenced/messages/order/returned.d.ts +3431 -0
- package/dist/types/dist-dereferenced/messages/order/shipped.d.ts +3430 -0
- package/dist/types/dist-dereferenced/messages/price-change.d.ts +58 -0
- package/dist/types/dist-dereferenced/messages/product-category.d.ts +33 -0
- package/dist/types/dist-dereferenced/messages/product-draft.d.ts +589 -0
- package/dist/types/dist-dereferenced/messages/product.d.ts +628 -0
- package/dist/types/dist-dereferenced/money.d.ts +41 -0
- package/dist/types/dist-dereferenced/order/address.d.ts +98 -0
- package/dist/types/dist-dereferenced/order/customer.d.ts +309 -0
- package/dist/types/dist-dereferenced/order/index.d.ts +3422 -0
- package/dist/types/dist-dereferenced/order/item.d.ts +336 -0
- package/dist/types/dist-dereferenced/order/orderMain.d.ts +3417 -0
- package/dist/types/dist-dereferenced/order/payment.d.ts +110 -0
- package/dist/types/dist-dereferenced/order/shipment/index.d.ts +253 -0
- package/dist/types/dist-dereferenced/order/shipment/item/index.d.ts +19 -0
- package/dist/types/dist-dereferenced/order/shipment/item/itemMain.d.ts +18 -0
- package/dist/types/dist-dereferenced/order/shipment/item/returned.d.ts +34 -0
- package/dist/types/dist-dereferenced/order/shipment/pos/index.d.ts +282 -0
- package/dist/types/dist-dereferenced/order/shipment/pos/outbound.d.ts +319 -0
- package/dist/types/dist-dereferenced/order/shipment/pos/posMain.d.ts +280 -0
- package/dist/types/dist-dereferenced/order/shipment/pos/return.d.ts +330 -0
- package/dist/types/dist-dereferenced/order/shipment/shipmentMain.d.ts +250 -0
- package/dist/types/dist-dereferenced/order/shipment/shipped/index.d.ts +288 -0
- package/dist/types/dist-dereferenced/order/shipment/shipped/outbound.d.ts +286 -0
- package/dist/types/dist-dereferenced/order/shipment/shipped/return.d.ts +287 -0
- package/dist/types/dist-dereferenced/order/shipment/shipped/shippedMain.d.ts +286 -0
- package/dist/types/dist-dereferenced/price.d.ts +49 -0
- package/dist/types/dist-dereferenced/product-category.d.ts +24 -0
- package/dist/types/dist-dereferenced/product-draft.d.ts +580 -0
- package/dist/types/dist-dereferenced/product.d.ts +619 -0
- package/dist/types/dist-dereferenced/stock.d.ts +74 -0
- package/dist/types/dist-dereferenced/total.d.ts +172 -0
- package/dist/types/dist-types/asset.d.ts +16 -0
- package/dist/types/dist-types/category.d.ts +20 -0
- package/dist/types/dist-types/country.d.ts +2 -0
- package/dist/types/dist-types/currency.d.ts +2 -0
- package/dist/types/dist-types/customer-segment.d.ts +6 -0
- package/dist/types/dist-types/development-colour.d.ts +31 -0
- package/dist/types/dist-types/index.d.ts +16 -0
- package/dist/types/dist-types/marketing-preferences.d.ts +9 -0
- package/dist/types/dist-types/messages/ean-change.d.ts +5 -0
- package/dist/types/dist-types/messages/index.d.ts +6 -0
- package/dist/types/dist-types/messages/order/delivered.d.ts +298 -0
- package/dist/types/dist-types/messages/order/index.d.ts +6 -0
- package/dist/types/dist-types/messages/order/new.d.ts +298 -0
- package/dist/types/dist-types/messages/order/processed.d.ts +298 -0
- package/dist/types/dist-types/messages/order/return-initiated.d.ts +298 -0
- package/dist/types/dist-types/messages/order/returned.d.ts +299 -0
- package/dist/types/dist-types/messages/order/shipped.d.ts +299 -0
- package/dist/types/dist-types/messages/price-change.d.ts +15 -0
- package/dist/types/dist-types/messages/product-category.d.ts +7 -0
- package/dist/types/dist-types/messages/product-draft.d.ts +136 -0
- package/dist/types/dist-types/messages/product.d.ts +144 -0
- package/dist/types/dist-types/money.d.ts +11 -0
- package/dist/types/dist-types/order/address.d.ts +27 -0
- package/dist/types/dist-types/order/customer.d.ts +81 -0
- package/dist/types/dist-types/order/index.d.ts +8 -0
- package/dist/types/dist-types/order/item.d.ts +85 -0
- package/dist/types/dist-types/order/orderMain.d.ts +295 -0
- package/dist/types/dist-types/order/payment.d.ts +30 -0
- package/dist/types/dist-types/order/shipment/index.d.ts +6 -0
- package/dist/types/dist-types/order/shipment/item/index.d.ts +4 -0
- package/dist/types/dist-types/order/shipment/item/itemMain.d.ts +6 -0
- package/dist/types/dist-types/order/shipment/item/returned.d.ts +11 -0
- package/dist/types/dist-types/order/shipment/pos/index.d.ts +5 -0
- package/dist/types/dist-types/order/shipment/pos/outbound.d.ts +76 -0
- package/dist/types/dist-types/order/shipment/pos/posMain.d.ts +71 -0
- package/dist/types/dist-types/order/shipment/pos/return.d.ts +75 -0
- package/dist/types/dist-types/order/shipment/shipmentMain.d.ts +62 -0
- package/dist/types/dist-types/order/shipment/shipped/index.d.ts +5 -0
- package/dist/types/dist-types/order/shipment/shipped/outbound.d.ts +68 -0
- package/dist/types/dist-types/order/shipment/shipped/return.d.ts +68 -0
- package/dist/types/dist-types/order/shipment/shipped/shippedMain.d.ts +69 -0
- package/dist/types/dist-types/price.d.ts +14 -0
- package/dist/types/dist-types/product-category.d.ts +6 -0
- package/dist/types/dist-types/product-draft.d.ts +135 -0
- package/dist/types/dist-types/product.d.ts +143 -0
- package/dist/types/dist-types/stock.d.ts +19 -0
- package/dist/types/dist-types/total.d.ts +44 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/src-public/airtable.d.ts +220 -0
- package/dist/types/src-public/bigquery.d.ts +17 -0
- package/dist/types/src-public/cloudtasks.d.ts +74 -0
- package/dist/types/src-public/dato.d.ts +88 -0
- package/dist/types/src-public/env.d.ts +144 -0
- package/dist/types/src-public/getEventTime.d.ts +1 -0
- package/dist/types/src-public/index.d.ts +16 -0
- package/dist/types/src-public/ipValidation.d.ts +15 -0
- package/dist/types/src-public/jwks.d.ts +15 -0
- package/dist/types/src-public/pubsub.d.ts +95 -0
- package/dist/types/src-public/rateLimit.d.ts +21 -0
- package/dist/types/src-public/redisClient.d.ts +6 -0
- package/dist/types/src-public/runtime.d.ts +57 -0
- package/dist/types/src-public/sanitize.d.ts +4 -0
- package/dist/types/src-public/scheduler.d.ts +71 -0
- package/dist/types/src-public/secret.d.ts +6 -0
- package/dist/types/src-public/setHeaders.d.ts +13 -0
- package/dist/types/src-public/types.d.ts +264 -0
- package/dist/types/src-public/utils.d.ts +67 -0
- package/dist/types/src-public/validate.d.ts +9 -0
- package/package.json +7 -4
- package/dist/index.d.ts +0 -34970
- package/dist/index.js +0 -112969
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = getEventTime;
|
|
4
|
+
function getEventTime(x, defaultValue) {
|
|
5
|
+
const possibleKeys = [
|
|
6
|
+
'last_modified_date_time',
|
|
7
|
+
'last_modified_date',
|
|
8
|
+
'last_modified_datetime',
|
|
9
|
+
'last_modified_date_time',
|
|
10
|
+
'lastModifiedAt',
|
|
11
|
+
'last_modified_at',
|
|
12
|
+
'SystemModifiedAt',
|
|
13
|
+
'system_modified_at',
|
|
14
|
+
'lastUpdatedAt',
|
|
15
|
+
'modified_at',
|
|
16
|
+
'last_updated_at',
|
|
17
|
+
'modifiedAt'
|
|
18
|
+
];
|
|
19
|
+
for (let i = 0; i < possibleKeys.length; i++) {
|
|
20
|
+
if (x[possibleKeys[i]]) {
|
|
21
|
+
const possibleDateTime = new Date(x[possibleKeys[i]]);
|
|
22
|
+
if (!isNaN(possibleDateTime.getTime())) {
|
|
23
|
+
return possibleDateTime;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return defaultValue;
|
|
28
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.RedisConnectionError = exports.RateLimit = exports.setHeaders = exports.DatoHelper = exports.AirtableHelper = exports.BigQueryHelper = exports.JWKSHelper = exports.CloudTasksHelper = exports.Secrets = exports.SchedulerHelper = exports.Logging = exports.Runtime = exports.PubSubHelper = exports.EnvEngine = exports.validate = void 0;
|
|
21
|
+
var validate_1 = require("./validate");
|
|
22
|
+
Object.defineProperty(exports, "validate", { enumerable: true, get: function () { return __importDefault(validate_1).default; } });
|
|
23
|
+
__exportStar(require("./sanitize"), exports);
|
|
24
|
+
__exportStar(require("./utils"), exports);
|
|
25
|
+
var env_1 = require("./env");
|
|
26
|
+
Object.defineProperty(exports, "EnvEngine", { enumerable: true, get: function () { return __importDefault(env_1).default; } });
|
|
27
|
+
var pubsub_1 = require("./pubsub");
|
|
28
|
+
Object.defineProperty(exports, "PubSubHelper", { enumerable: true, get: function () { return __importDefault(pubsub_1).default; } });
|
|
29
|
+
var runtime_1 = require("./runtime");
|
|
30
|
+
Object.defineProperty(exports, "Runtime", { enumerable: true, get: function () { return __importDefault(runtime_1).default; } });
|
|
31
|
+
Object.defineProperty(exports, "Logging", { enumerable: true, get: function () { return runtime_1.Logging; } });
|
|
32
|
+
var scheduler_1 = require("./scheduler");
|
|
33
|
+
Object.defineProperty(exports, "SchedulerHelper", { enumerable: true, get: function () { return __importDefault(scheduler_1).default; } });
|
|
34
|
+
var secret_1 = require("./secret");
|
|
35
|
+
Object.defineProperty(exports, "Secrets", { enumerable: true, get: function () { return __importDefault(secret_1).default; } });
|
|
36
|
+
var cloudtasks_1 = require("./cloudtasks");
|
|
37
|
+
Object.defineProperty(exports, "CloudTasksHelper", { enumerable: true, get: function () { return __importDefault(cloudtasks_1).default; } });
|
|
38
|
+
var jwks_1 = require("./jwks");
|
|
39
|
+
Object.defineProperty(exports, "JWKSHelper", { enumerable: true, get: function () { return __importDefault(jwks_1).default; } });
|
|
40
|
+
var bigquery_1 = require("./bigquery");
|
|
41
|
+
Object.defineProperty(exports, "BigQueryHelper", { enumerable: true, get: function () { return __importDefault(bigquery_1).default; } });
|
|
42
|
+
var airtable_1 = require("./airtable");
|
|
43
|
+
Object.defineProperty(exports, "AirtableHelper", { enumerable: true, get: function () { return __importDefault(airtable_1).default; } });
|
|
44
|
+
var dato_1 = require("./dato");
|
|
45
|
+
Object.defineProperty(exports, "DatoHelper", { enumerable: true, get: function () { return __importDefault(dato_1).default; } });
|
|
46
|
+
var setHeaders_1 = require("./setHeaders");
|
|
47
|
+
Object.defineProperty(exports, "setHeaders", { enumerable: true, get: function () { return __importDefault(setHeaders_1).default; } });
|
|
48
|
+
var rateLimit_1 = require("./rateLimit");
|
|
49
|
+
Object.defineProperty(exports, "RateLimit", { enumerable: true, get: function () { return __importDefault(rateLimit_1).default; } });
|
|
50
|
+
Object.defineProperty(exports, "RedisConnectionError", { enumerable: true, get: function () { return rateLimit_1.RedisConnectionError; } });
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidIp = isValidIp;
|
|
4
|
+
exports.isValidCidr = isValidCidr;
|
|
5
|
+
exports.validateIpOrCidr = validateIpOrCidr;
|
|
6
|
+
exports.isIpInCidr = isIpInCidr;
|
|
7
|
+
exports.isIpInCidrs = isIpInCidrs;
|
|
8
|
+
exports.getClientIp = getClientIp;
|
|
9
|
+
const net_1 = require("net");
|
|
10
|
+
function isValidIp(value) {
|
|
11
|
+
if (!value)
|
|
12
|
+
return false;
|
|
13
|
+
return (0, net_1.isIP)(value.trim()) !== 0;
|
|
14
|
+
}
|
|
15
|
+
function isValidCidr(value) {
|
|
16
|
+
if (!value)
|
|
17
|
+
return false;
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
const parts = trimmed.split('/');
|
|
20
|
+
if (parts.length !== 2)
|
|
21
|
+
return false;
|
|
22
|
+
const [ip, maskStr] = parts;
|
|
23
|
+
const ipVersion = (0, net_1.isIP)(ip);
|
|
24
|
+
if (ipVersion === 0)
|
|
25
|
+
return false;
|
|
26
|
+
if (!/^[0-9]{1,3}$/.test(maskStr))
|
|
27
|
+
return false;
|
|
28
|
+
const mask = Number(maskStr);
|
|
29
|
+
if (!Number.isInteger(mask))
|
|
30
|
+
return false;
|
|
31
|
+
if (ipVersion === 4)
|
|
32
|
+
return mask >= 0 && mask <= 32;
|
|
33
|
+
return mask >= 0 && mask <= 128;
|
|
34
|
+
}
|
|
35
|
+
function validateIpOrCidr(value) {
|
|
36
|
+
if (!value)
|
|
37
|
+
return false;
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
return trimmed.includes('/') ? isValidCidr(trimmed) : isValidIp(trimmed);
|
|
40
|
+
}
|
|
41
|
+
function ipv4ToInt(ip) {
|
|
42
|
+
const parts = ip.split('.');
|
|
43
|
+
if (parts.length !== 4)
|
|
44
|
+
return null;
|
|
45
|
+
let val = 0 >>> 0;
|
|
46
|
+
for (let i = 0; i < 4; i++) {
|
|
47
|
+
const n = Number(parts[i]);
|
|
48
|
+
if (!Number.isInteger(n) || n < 0 || n > 255)
|
|
49
|
+
return null;
|
|
50
|
+
val = ((val << 8) | n) >>> 0;
|
|
51
|
+
}
|
|
52
|
+
return val >>> 0;
|
|
53
|
+
}
|
|
54
|
+
function ipv6ToBigInt(ip) {
|
|
55
|
+
const hasIpv4Tail = ip.includes('.');
|
|
56
|
+
let head = ip;
|
|
57
|
+
let tailHextets = [];
|
|
58
|
+
if (hasIpv4Tail) {
|
|
59
|
+
const lastColon = ip.lastIndexOf(':');
|
|
60
|
+
const ipv4 = ip.slice(lastColon + 1);
|
|
61
|
+
const ipv4Num = ipv4ToInt(ipv4);
|
|
62
|
+
if (ipv4Num == null)
|
|
63
|
+
return null;
|
|
64
|
+
const hi = ((ipv4Num >>> 16) & 0xffff) >>> 0;
|
|
65
|
+
const lo = (ipv4Num & 0xffff) >>> 0;
|
|
66
|
+
tailHextets = [hi.toString(16), lo.toString(16)];
|
|
67
|
+
head = ip.slice(0, lastColon);
|
|
68
|
+
}
|
|
69
|
+
const doubleColon = head.indexOf('::');
|
|
70
|
+
let groups = [];
|
|
71
|
+
if (doubleColon !== -1) {
|
|
72
|
+
const left = head.slice(0, doubleColon).split(':').filter(Boolean);
|
|
73
|
+
const right = head.slice(doubleColon + 2).split(':').filter(Boolean);
|
|
74
|
+
const missing = Math.max(0, 8 - (left.length + right.length + tailHextets.length));
|
|
75
|
+
groups = [...left, ...new Array(missing).fill('0'), ...right];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
groups = head.split(':').filter(Boolean);
|
|
79
|
+
}
|
|
80
|
+
if (groups.length + tailHextets.length !== 8) {
|
|
81
|
+
if (groups.length + tailHextets.length < 8) {
|
|
82
|
+
const missing = 8 - (groups.length + tailHextets.length);
|
|
83
|
+
groups = [...groups, ...new Array(missing).fill('0')];
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (tailHextets.length) {
|
|
90
|
+
groups = [...groups.slice(0, 6), ...tailHextets];
|
|
91
|
+
}
|
|
92
|
+
if (groups.length !== 8)
|
|
93
|
+
return null;
|
|
94
|
+
let result = 0n;
|
|
95
|
+
for (let i = 0; i < 8; i++) {
|
|
96
|
+
const part = groups[i];
|
|
97
|
+
if (!/^[0-9a-fA-F]{1,4}$/.test(part))
|
|
98
|
+
return null;
|
|
99
|
+
const n = BigInt(parseInt(part, 16));
|
|
100
|
+
result = (result << 16n) | n;
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
function ipv4CidrContains(ip, cidr) {
|
|
105
|
+
const [base, maskStr] = cidr.split('/');
|
|
106
|
+
const ipInt = ipv4ToInt(ip);
|
|
107
|
+
const baseInt = ipv4ToInt(base);
|
|
108
|
+
if (ipInt == null || baseInt == null)
|
|
109
|
+
return false;
|
|
110
|
+
const maskBits = Number(maskStr);
|
|
111
|
+
if (!Number.isInteger(maskBits) || maskBits < 0 || maskBits > 32)
|
|
112
|
+
return false;
|
|
113
|
+
const mask = maskBits === 0 ? 0 : (~0 << (32 - maskBits)) >>> 0;
|
|
114
|
+
return ((ipInt & mask) >>> 0) === ((baseInt & mask) >>> 0);
|
|
115
|
+
}
|
|
116
|
+
function ipv6CidrContains(ip, cidr) {
|
|
117
|
+
const [base, maskStr] = cidr.split('/');
|
|
118
|
+
const ipBig = ipv6ToBigInt(ip);
|
|
119
|
+
const baseBig = ipv6ToBigInt(base);
|
|
120
|
+
if (ipBig == null || baseBig == null)
|
|
121
|
+
return false;
|
|
122
|
+
const maskBits = Number(maskStr);
|
|
123
|
+
if (!Number.isInteger(maskBits) || maskBits < 0 || maskBits > 128)
|
|
124
|
+
return false;
|
|
125
|
+
const prefix = BigInt(maskBits);
|
|
126
|
+
const mask = prefix === 0n ? 0n : ((1n << prefix) - 1n) << (128n - prefix);
|
|
127
|
+
return (ipBig & mask) === (baseBig & mask);
|
|
128
|
+
}
|
|
129
|
+
function isIpInCidr(ip, cidr) {
|
|
130
|
+
const version = (0, net_1.isIP)(ip.trim());
|
|
131
|
+
if (version === 0)
|
|
132
|
+
return false;
|
|
133
|
+
if (!isValidCidr(cidr))
|
|
134
|
+
return false;
|
|
135
|
+
const cidrIpVersion = (0, net_1.isIP)(cidr.split('/')[0]);
|
|
136
|
+
if (cidrIpVersion !== version)
|
|
137
|
+
return false;
|
|
138
|
+
return version === 4 ? ipv4CidrContains(ip, cidr) : ipv6CidrContains(ip, cidr);
|
|
139
|
+
}
|
|
140
|
+
function isIpInCidrs(ip, cidrs) {
|
|
141
|
+
if (!Array.isArray(cidrs) || cidrs.length === 0)
|
|
142
|
+
return false;
|
|
143
|
+
for (let i = 0; i < cidrs.length; i++) {
|
|
144
|
+
const c = cidrs[i];
|
|
145
|
+
if (typeof c !== 'string')
|
|
146
|
+
continue;
|
|
147
|
+
if (isIpInCidr(ip, c.trim()))
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
function getClientIp(req) {
|
|
153
|
+
const xForwardedFor = req.headers["x-forwarded-for"];
|
|
154
|
+
if (typeof xForwardedFor === "string" && xForwardedFor.length > 0) {
|
|
155
|
+
const clientIp = xForwardedFor.split(",")[0].trim();
|
|
156
|
+
if (clientIp)
|
|
157
|
+
return clientIp;
|
|
158
|
+
}
|
|
159
|
+
return req.socket.remoteAddress ?? undefined;
|
|
160
|
+
}
|
|
161
|
+
exports.default = {
|
|
162
|
+
isValidIp,
|
|
163
|
+
isValidCidr,
|
|
164
|
+
validateIpOrCidr,
|
|
165
|
+
isIpInCidr,
|
|
166
|
+
isIpInCidrs,
|
|
167
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
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
|
+
exports.CACHE_TABLE = void 0;
|
|
7
|
+
const jose_1 = require("jose");
|
|
8
|
+
const runtime_1 = __importDefault(require("./runtime"));
|
|
9
|
+
exports.CACHE_TABLE = 'cache-global';
|
|
10
|
+
class JWKSHelper extends runtime_1.default {
|
|
11
|
+
firestore;
|
|
12
|
+
constructor(opts, firestore) {
|
|
13
|
+
super(opts);
|
|
14
|
+
this.firestore = firestore;
|
|
15
|
+
}
|
|
16
|
+
async validateAuthorizationHeader(authorizationHeader, expectedServiceAccount = null) {
|
|
17
|
+
const splitted = authorizationHeader.split(".");
|
|
18
|
+
const keyMeta = JSON.parse(Buffer.from(splitted[0], "base64").toString('utf-8')) || {};
|
|
19
|
+
const meta = JSON.parse(Buffer.from(splitted[1], "base64").toString('utf-8')) || {};
|
|
20
|
+
if (!meta.email_verified) {
|
|
21
|
+
throw new Error("Authorization header - Email not verified");
|
|
22
|
+
}
|
|
23
|
+
if (expectedServiceAccount !== false) {
|
|
24
|
+
if (expectedServiceAccount === null) {
|
|
25
|
+
expectedServiceAccount = `runtime@${process.env.GCLOUD_PROJECT}.iam.gserviceaccount.com`;
|
|
26
|
+
}
|
|
27
|
+
if (meta.email !== expectedServiceAccount) {
|
|
28
|
+
throw new Error(`Authorization header - Wrong service account, got ${meta?.email}, expected ${expectedServiceAccount}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!keyMeta.kid || !keyMeta.alg) {
|
|
32
|
+
throw new Error("Malformed Authorization Header. KID is missing");
|
|
33
|
+
}
|
|
34
|
+
const key = await this.getKey(keyMeta.kid);
|
|
35
|
+
if (!key) {
|
|
36
|
+
throw new Error("Incorrect Authorization Header. The key has not been found in the Google JWKS set");
|
|
37
|
+
}
|
|
38
|
+
const importedKey = await (0, jose_1.importJWK)(key, keyMeta.alg);
|
|
39
|
+
let validationCorrect = true;
|
|
40
|
+
try {
|
|
41
|
+
await (0, jose_1.jwtVerify)(authorizationHeader, importedKey, {
|
|
42
|
+
issuer: ['https://accounts.google.com', 'accounts.google.com'],
|
|
43
|
+
clockTolerance: 0,
|
|
44
|
+
audience: process.env.GCLOUD_PROJECT + "/" + this.triggerId,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
validationCorrect = false;
|
|
49
|
+
}
|
|
50
|
+
if (!validationCorrect) {
|
|
51
|
+
throw new Error("Incorrect Authorization Header. The JWT is not valid");
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
email: meta.email,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async getKey(keyId) {
|
|
58
|
+
const jwks = typeof global.jwks !== 'undefined' ? global.jwks : null;
|
|
59
|
+
let parsedJwks = null;
|
|
60
|
+
if (jwks) {
|
|
61
|
+
try {
|
|
62
|
+
parsedJwks = JSON.parse(jwks);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
err.message.toString();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
let keyData = parsedJwks?.keys?.find((x) => x.kid === keyId);
|
|
69
|
+
let cachedItem;
|
|
70
|
+
if (!keyData) {
|
|
71
|
+
cachedItem = await this.firestore.collection(exports.CACHE_TABLE).doc('google-jwks').get();
|
|
72
|
+
if (cachedItem.exists && cachedItem.data()?.expires_at.toDate() > new Date()) {
|
|
73
|
+
keyData = cachedItem.data()?.value;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
keyData = parsedJwks?.keys.find((x) => x.kid === keyId);
|
|
77
|
+
if (!keyData) {
|
|
78
|
+
const result = (await this.fetchJWKS());
|
|
79
|
+
parsedJwks = result.jwks;
|
|
80
|
+
if (cachedItem) {
|
|
81
|
+
cachedItem.ref.set({
|
|
82
|
+
value: parsedJwks,
|
|
83
|
+
expires_at: result.expiresAt
|
|
84
|
+
}, { merge: true });
|
|
85
|
+
}
|
|
86
|
+
keyData = parsedJwks?.keys.find((x) => x.kid === keyId);
|
|
87
|
+
}
|
|
88
|
+
if (parsedJwks && cachedItem) {
|
|
89
|
+
global.jwks = JSON.stringify(parsedJwks);
|
|
90
|
+
}
|
|
91
|
+
return keyData;
|
|
92
|
+
}
|
|
93
|
+
async fetchJWKS() {
|
|
94
|
+
const date = new Date();
|
|
95
|
+
let expiresAt = new Date(Date.now() + 1000 * 60 * 60);
|
|
96
|
+
const response = await fetch("https://www.googleapis.com/oauth2/v3/certs");
|
|
97
|
+
const maxAgePair = response.headers.get("Cache-Control")?.split(',').map(x => x.trim().split('=')).find(x => x[0] === 'max-age');
|
|
98
|
+
if (maxAgePair && maxAgePair.length === 2) {
|
|
99
|
+
expiresAt = new Date(date.getTime() + parseInt(maxAgePair[1], 10) * 1000);
|
|
100
|
+
}
|
|
101
|
+
const jwks = await response.json();
|
|
102
|
+
return {
|
|
103
|
+
expiresAt,
|
|
104
|
+
jwks: jwks
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.default = JWKSHelper;
|