UNPKG

zephyr-agent

Version:
73 lines (72 loc) • 3.33 kB
import "node:module"; import { createHash } from "node:crypto"; import { ZEPHYR_API_ENDPOINT, ZE_API_ENDPOINT, ZE_ENV, ZE_IS_PREVIEW } from "zephyr-edge-contract"; import { ZeErrors, ZephyrError } from "../errors/index.mjs"; import { StorageKeys } from "./storage-keys.mjs"; import { getItem, removeItem, setPrivateItem, storage } from "./storage.mjs"; const STORED_APPLICATION_CONFIG_VERSION = 2; const PRINCIPAL_FINGERPRINT_CONTEXT = 'zephyr-application-config-principal\0'; function normalizeEndpoint(endpoint) { return new URL(endpoint).toString(); } function getApplicationConfigPrincipalFingerprint(token) { return createHash('sha256').update(PRINCIPAL_FINGERPRINT_CONTEXT).update(token ?? '<anonymous>').digest('base64url'); } function getApplicationConfigStorageScope(token) { return Object.freeze({ apiEndpoint: normalizeEndpoint(ZEPHYR_API_ENDPOINT()), apiGatewayEndpoint: normalizeEndpoint(ZE_API_ENDPOINT()), environment: ZE_ENV()?.trim() || null, preview: Boolean(ZE_IS_PREVIEW()), principalFingerprint: getApplicationConfigPrincipalFingerprint(token) }); } function scopesMatch(left, right) { return left.apiEndpoint === right.apiEndpoint && left.apiGatewayEndpoint === right.apiGatewayEndpoint && left.environment === right.environment && left.preview === right.preview && left.principalFingerprint === right.principalFingerprint; } function scopeKey(scope) { return createHash('sha256').update(JSON.stringify(scope)).digest('base64url'); } function get_key(application_uid, scope) { return [ StorageKeys.ze_app_config_token, scopeKey(scope), application_uid ].join('.'); } function isStoredApplicationConfig(value, application_uid, scope) { if (!value || 'object' != typeof value) return false; const stored = value; return Boolean(stored.version === STORED_APPLICATION_CONFIG_VERSION && stored.applicationUid === application_uid && stored.scope && scopesMatch(stored.scope, scope) && stored.config && stored.config.application_uid === application_uid); } async function saveAppConfig(application_uid, json, scope = getApplicationConfigStorageScope()) { if (json.application_uid !== application_uid) throw new ZephyrError(ZeErrors.ERR_LOAD_APP_CONFIG, { application_uid, data: { reason: 'application UID mismatch' } }); await storage; const stored = { version: STORED_APPLICATION_CONFIG_VERSION, applicationUid: application_uid, scope: { ...scope }, config: json }; await setPrivateItem(get_key(application_uid, scope), stored, { ttl: 300000 }); } async function getAppConfig(application_uid, scope = getApplicationConfigStorageScope()) { await storage; const stored = await getItem(get_key(application_uid, scope)); return isStoredApplicationConfig(stored, application_uid, scope) ? stored.config : void 0; } async function removeAppConfig(application_uid, scope = getApplicationConfigStorageScope()) { await storage; await removeItem(get_key(application_uid, scope)); } export { getAppConfig, getApplicationConfigPrincipalFingerprint, getApplicationConfigStorageScope, removeAppConfig, saveAppConfig }; //# sourceMappingURL=application-configuration.mjs.map