zephyr-agent
Version:
Zephyr plugin agent
73 lines (72 loc) • 3.33 kB
JavaScript
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