inngest
Version:
Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.
105 lines (103 loc) • 3.73 kB
JavaScript
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
const require_temporal = require('./temporal.cjs');
let json_stringify_safe = require("json-stringify-safe");
json_stringify_safe = require_rolldown_runtime.__toESM(json_stringify_safe);
let hash_js = require("hash.js");
hash_js = require_rolldown_runtime.__toESM(hash_js);
let ms = require("ms");
ms = require_rolldown_runtime.__toESM(ms);
let temporal_polyfill = require("temporal-polyfill");
//#region src/helpers/strings.ts
const { sha256 } = hash_js.default;
/**
* Constant-time equality check for two strings. Returns `false` immediately if
* lengths differ; otherwise XOR-accumulates every char code so the total time
* is independent of where (or whether) the strings diverge.
*
* Used for HMAC signature verification — `===`/`!==` short-circuit on the
* first mismatched character and leak the matching-prefix length via timing.
*/
function timingSafeEqual(a, b) {
if (a.length !== b.length) return false;
let diff = 0;
for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
return diff === 0;
}
/**
* Safely `JSON.stringify()` an `input`, handling circular refernences and
* removing `BigInt` values.
*/
const stringify = (input) => {
return (0, json_stringify_safe.default)(input, (_key, value) => {
if (typeof value !== "bigint") return value;
});
};
/**
* Returns a slugified string used to generate consistent IDs.
*
* This can be used to generate a consistent ID for a function when migrating
* from v2 to v3 of the SDK.
*
* @public
*/
const slugify = (str) => {
const join = "-";
return str.toLowerCase().replace(/[^a-z0-9-]+/g, join).replace(/-+/g, join).split(join).filter(Boolean).join(join);
};
const second = 1 * 1e3;
const minute = second * 60;
const hour = minute * 60;
const day = hour * 24;
/**
* A collection of periods in milliseconds and their suffixes used when creating
* time strings.
*/
const periods = [
["w", day * 7],
["d", day],
["h", hour],
["m", minute],
["s", second]
];
/**
* Convert a given `Date`, `number`, or `ms`-compatible `string` to a
* Inngest sleep-compatible time string (e.g. `"1d"` or `"2h3010s"`).
*/
const timeStr = (input) => {
if (input instanceof Date) return input.toISOString();
if (require_temporal.isTemporalInstant(input) || require_temporal.isTemporalZonedDateTime(input)) return require_temporal.getISOString(input);
let milliseconds;
if (require_temporal.isTemporalDuration(input)) milliseconds = input.total({
unit: "milliseconds",
relativeTo: temporal_polyfill.Temporal.Now.plainDateTimeISO("UTC").toString()
});
else if (typeof input === "string") milliseconds = (0, ms.default)(input);
else milliseconds = input;
const [, timeStr$1] = periods.reduce(([num, str], [suffix, period]) => {
const numPeriods = Math.floor(num / period);
if (numPeriods > 0) return [num % period, `${str}${numPeriods}${suffix}`];
return [num, str];
}, [milliseconds, ""]);
return timeStr$1;
};
const hashEventKey = (eventKey) => {
return sha256().update(eventKey).digest("hex");
};
const hashSigningKey = (signingKey) => {
if (!signingKey) return "";
const prefix = signingKey.match(/^signkey-[\w]+-/)?.shift() || "";
const key = removeSigningKeyPrefix(signingKey);
return `${prefix}${sha256().update(key, "hex").digest("hex")}`;
};
function removeSigningKeyPrefix(signingKey) {
return signingKey.replace(/^signkey-[\w]+-/, "");
}
//#endregion
exports.hashEventKey = hashEventKey;
exports.hashSigningKey = hashSigningKey;
exports.removeSigningKeyPrefix = removeSigningKeyPrefix;
exports.slugify = slugify;
exports.stringify = stringify;
exports.timeStr = timeStr;
exports.timingSafeEqual = timingSafeEqual;
//# sourceMappingURL=strings.cjs.map