holosphere
Version:
Holonic Geospatial Communication Infrastructure
139 lines (119 loc) • 4.39 kB
JavaScript
// holo_schema.js
import Ajv2019 from 'ajv/dist/2019.js';
/**
* Sets the JSON schema for a specific lens.
* @param {HoloSphere} holoInstance - The HoloSphere instance.
* @param {string} lens - The lens identifier.
* @param {object} schema - The JSON schema to set.
* @returns {Promise<boolean>} - Resolves when the schema is set.
*/
export async function setSchema(holoInstance, lens, schema) {
if (!lens || !schema) {
throw new Error('setSchema: Missing required parameters');
}
// Basic schema validation
if (!schema.type || typeof schema.type !== 'string') {
throw new Error('setSchema: Schema must have a type field');
}
const metaSchema = {
type: 'object',
required: ['type', 'properties'],
properties: {
type: { type: 'string' },
properties: {
type: 'object',
additionalProperties: {
type: 'object',
required: ['type'],
properties: {
type: { type: 'string' }
}
}
},
required: {
type: 'array',
items: { type: 'string' }
}
}
};
// Use the validator from the instance
const valid = holoInstance.validator.validate(metaSchema, schema);
if (!valid) {
throw new Error(`Invalid schema structure: ${JSON.stringify(holoInstance.validator.errors)}`);
}
if (!schema.properties || typeof schema.properties !== 'object') {
throw new Error('Schema must have properties in strict mode');
}
if (!schema.required || !Array.isArray(schema.required) || schema.required.length === 0) {
throw new Error('Schema must have required fields in strict mode');
}
// Store schema in global table with lens as key using instance's method
await holoInstance.putGlobal('schemas', {
id: lens,
schema: schema,
timestamp: Date.now()
});
// Update the instance's cache with the new schema
holoInstance.schemaCache.set(lens, {
schema,
timestamp: Date.now()
});
return true;
}
/**
* Retrieves the JSON schema for a specific lens.
* @param {HoloSphere} holoInstance - The HoloSphere instance.
* @param {string} lens - The lens identifier.
* @param {object} [options] - Additional options
* @param {boolean} [options.useCache=true] - Whether to use the schema cache
* @param {number} [options.maxCacheAge=3600000] - Maximum cache age in milliseconds (default: 1 hour)
* @returns {Promise<object|null>} - The retrieved schema or null if not found.
*/
export async function getSchema(holoInstance, lens, options = {}) {
if (!lens) {
throw new Error('getSchema: Missing lens parameter');
}
const { useCache = true, maxCacheAge = 3600000 } = options;
// Check instance's cache first if enabled
if (useCache && holoInstance.schemaCache.has(lens)) {
const cached = holoInstance.schemaCache.get(lens);
const cacheAge = Date.now() - cached.timestamp;
// Use cache if it's fresh enough
if (cacheAge < maxCacheAge) {
return cached.schema;
}
}
// Cache miss or expired, fetch from storage using instance's method
const schemaData = await holoInstance.getGlobal('schemas', lens);
if (!schemaData || !schemaData.schema) {
return null;
}
// Update instance's cache with fetched schema
holoInstance.schemaCache.set(lens, {
schema: schemaData.schema,
timestamp: Date.now()
});
return schemaData.schema;
}
/**
* Clears the schema cache or a specific schema from the cache.
* @param {HoloSphere} holoInstance - The HoloSphere instance.
* @param {string} [lens] - Optional lens to clear from cache. If not provided, clears entire cache.
* @returns {boolean} - Returns true if successful
*/
export function clearSchemaCache(holoInstance, lens = null) {
if (lens) {
// Clear specific schema from instance's cache
return holoInstance.schemaCache.delete(lens);
} else {
// Clear entire instance's cache
holoInstance.schemaCache.clear();
return true;
}
}
// Export all schema operations as default
export default {
setSchema,
getSchema,
clearSchemaCache
};