@sphereon/ssi-sdk.agent-config
Version:
405 lines (399 loc) • 12.9 kB
JavaScript
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
// src/agentContextUtils.ts
function contextHasPlugin(context, requiredMethod) {
const methods = Array.isArray(requiredMethod) ? requiredMethod : [
requiredMethod
];
const allMethods = context.agent.availableMethods();
return methods.every((method) => allMethods.includes(method));
}
__name(contextHasPlugin, "contextHasPlugin");
function contextHasKeyManager(context) {
return contextHasPlugin(context, "keyManagerGet");
}
__name(contextHasKeyManager, "contextHasKeyManager");
function contextHasDidManager(context) {
return contextHasPlugin(context, "didManagerGet");
}
__name(contextHasDidManager, "contextHasDidManager");
function contextHasDidResolver(context) {
return contextHasPlugin(context, "resolveDid");
}
__name(contextHasDidResolver, "contextHasDidResolver");
function contextHasCredentialIssuer(context) {
return contextHasPlugin(context, [
"createVerifiableCredential",
"createVerifiablePresentation"
]);
}
__name(contextHasCredentialIssuer, "contextHasCredentialIssuer");
function contextHasCredentialVerifier(context) {
return contextHasPlugin(context, [
"verifyCredential",
"verifyPresentation"
]);
}
__name(contextHasCredentialVerifier, "contextHasCredentialVerifier");
function contextHasCredentialStatusVerifier(context) {
return contextHasPlugin(context, [
"checkCredentialStatus"
]);
}
__name(contextHasCredentialStatusVerifier, "contextHasCredentialStatusVerifier");
function contextHasDataStore(context) {
return contextHasPlugin(context, [
"dataStoreGetVerifiableCredential",
"dataStoreGetVerifiablePresentation"
]);
}
__name(contextHasDataStore, "contextHasDataStore");
function contextHasDataStoreORM(context) {
return contextHasPlugin(context, [
"dataStoreORMGetVerifiableCredentials",
"dataStoreORMGetVerifiablePresentations"
]);
}
__name(contextHasDataStoreORM, "contextHasDataStoreORM");
// src/dataSources.ts
import Debug from "debug";
import { DataSource } from "typeorm/data-source/DataSource.js";
var debug = Debug(`sphereon:ssi-sdk:database`);
var DataSources = class _DataSources {
static {
__name(this, "DataSources");
}
get defaultDbType() {
return this._defaultDbType;
}
set defaultDbType(value) {
this._defaultDbType = value;
}
dataSources = /* @__PURE__ */ new Map();
configs = /* @__PURE__ */ new Map();
_defaultDbType = "sqlite";
static singleton;
static singleInstance() {
if (!_DataSources.singleton) {
_DataSources.singleton = new _DataSources();
}
return _DataSources.singleton;
}
static newInstance(configs) {
return new _DataSources(configs);
}
constructor(configs) {
;
(configs ?? /* @__PURE__ */ new Map()).forEach((config, name) => this.addConfig(name, config));
}
addConfig(dbName, config) {
this.configs.set(dbName, config);
this._defaultDbType = config.type;
return this;
}
deleteConfig(dbName) {
this.configs.delete(dbName);
return this;
}
has(dbName) {
return this.configs.has(dbName) && this.dataSources.has(dbName);
}
delete(dbName) {
this.deleteConfig(dbName);
this.dataSources.delete(dbName);
return this;
}
getConfig(dbName) {
const config = this.configs.get(dbName);
if (!config) {
throw Error(`No DB config found for ${dbName}`);
}
return config;
}
getDbNames() {
return [
...this.configs.keys()
];
}
async getDbConnection(dbName, allowAutomaticMigrations = true) {
const config = this.getConfig(dbName);
if (!this._defaultDbType) {
this._defaultDbType = config.type;
}
let dataSource = this.dataSources.get(dbName);
if (dataSource) {
return dataSource;
}
dataSource = await new DataSource({
...config,
name: dbName
}).initialize();
this.dataSources.set(dbName, dataSource);
if (config.synchronize) {
debug(`WARNING: Automatic migrations need to be disabled in this app! Adjust the database configuration and set synchronize to false`);
} else if (config.migrationsRun) {
debug(`Migrations are currently managed from config. Please set migrationsRun and synchronize to false to get consistent behaviour. We run migrations from code explicitly`);
} else if (allowAutomaticMigrations) {
debug(`Running ${dataSource.migrations.length} migration(s) from code if needed...`);
await dataSource.runMigrations();
debug(`${dataSource.migrations.length} migration(s) from code were inspected and applied`);
}
return dataSource;
}
};
var getDbConnection = /* @__PURE__ */ __name(async (connectionName, opts) => {
if (!DataSources.singleInstance().has(connectionName) && opts?.config) {
DataSources.singleInstance().addConfig(connectionName, opts?.config);
}
return DataSources.singleInstance().getDbConnection(connectionName);
}, "getDbConnection");
var dropDatabase = /* @__PURE__ */ __name(async (dbName, opts) => {
const { removeDataSource = false } = {
...opts
};
if (!DataSources.singleInstance().has(dbName)) {
return Promise.reject(Error(`No database present with name: ${dbName}`));
}
const connection = await getDbConnection(dbName);
await connection.dropDatabase();
if (removeDataSource) {
DataSources.singleInstance().delete(dbName);
} else if (!connection.isInitialized) {
await connection.initialize();
}
}, "dropDatabase");
var revertMigration = /* @__PURE__ */ __name(async (dataSource) => {
if (dataSource.isInitialized) {
await dataSource.undoLastMigration();
} else {
console.error("DataSource is not initialized");
}
}, "revertMigration");
var resetDatabase = /* @__PURE__ */ __name(async (dbName) => {
await dropDatabase(dbName);
const connection = await getDbConnection(dbName);
await connection.runMigrations();
}, "resetDatabase");
// src/agentCreator.ts
import { Agent } from "@veramo/core";
// src/objectCreator.ts
import { set, get } from "jsonpointer";
import parse from "url-parse";
async function createObjects(config, pointers) {
const objects = {};
async function resolveRefs(input) {
if (Array.isArray(input)) {
const resolved = [];
for (const item of input) {
resolved.push(await resolveRefs(item));
}
return resolved;
}
if (typeof input === "object") {
const resolved = {};
for (const property in input) {
if (input.hasOwnProperty(property)) {
if (property === "$ref") {
const pointer = input[property];
return await objectFromPointer(pointer);
} else if (property === "$require") {
return await objectFromConfig(input);
} else if (property === "$env") {
return process.env[input[property]];
} else {
resolved[property] = await resolveRefs(input[property]);
}
}
}
return resolved;
}
return input;
}
__name(resolveRefs, "resolveRefs");
async function objectFromConfig(objectConfig) {
console.log("Requiring", objectConfig["$require"]);
const parsed = parse(objectConfig["$require"], {}, true);
let npmModule = parsed.pathname;
const member = parsed.hash.length > 1 ? parsed.hash.slice(1) : void 0;
console.log(`member: ${member}`);
const type = parsed.query["t"] || "class";
const pointer = parsed.query["p"];
const args = objectConfig["$args"];
console.log({
module,
member,
type,
query: parsed.query,
pointer,
args
});
if (npmModule.slice(0, 2) === "./" || npmModule.slice(0, 3) === "../") {
console.log("objectFromConfig: Resolving relative path", npmModule);
const { resolve } = await import("path");
npmModule = resolve(npmModule);
}
const resolvedArgs = args !== void 0 ? await resolveRefs(args) : [];
console.error(`npmModule: ${npmModule}`);
return await Promise.resolve(await import(
/*@metro-ignore*/
npmModule
).then((mod) => {
if (member) {
return mod[member];
}
return mod;
}).then((required) => {
let object;
if (type === "class") {
object = new required(...resolvedArgs);
} else if (type === "function") {
object = required(...resolvedArgs);
} else if (type === "object") {
object = required;
} else {
console.error(`Likely we have a bug in agent object creation. type = ${type} is not of type class, function or object`);
}
if (!pointer) {
return object;
}
if (!object) {
return Promise.reject(Error(`Error creating ${npmModule}['${member}']: Object is undefined and pointer was present requiring an object.`));
}
return get(object, pointer);
}).catch((e) => {
console.error(e);
return Promise.reject(Error(`Error creating ${npmModule}['${member}']: ${e.message}`));
}));
}
__name(objectFromConfig, "objectFromConfig");
async function objectFromPointer(pointer) {
const existingObject = get(objects, pointer);
if (existingObject) {
return existingObject;
} else {
const objectConfig = get(config, pointer);
if (!objectConfig) throw Error("Pointer not found: " + pointer);
try {
let object;
if (objectConfig["$require"]) {
object = await objectFromConfig(objectConfig);
} else if (objectConfig["$env"]) {
object = process.env[objectConfig["$env"]];
} else {
object = await resolveRefs(objectConfig);
}
set(objects, pointer, object);
return object;
} catch (e) {
console.log(e);
throw Error(e.message + ". While creating object from pointer: " + pointer);
}
}
}
__name(objectFromPointer, "objectFromPointer");
const result = {};
for (const key of Object.keys(pointers)) {
if (pointers.hasOwnProperty(key)) {
result[key] = await objectFromPointer(pointers[key]);
}
}
return result;
}
__name(createObjects, "createObjects");
// src/agentCreator.ts
import yaml from "yaml";
async function createAgentFromConfig(config) {
const { agent } = await createObjects(config, {
agent: "/agent"
});
return agent;
}
__name(createAgentFromConfig, "createAgentFromConfig");
async function createAgent(options) {
return new Agent(options);
}
__name(createAgent, "createAgent");
var getConfig = /* @__PURE__ */ __name(async (filePath) => {
let fileContent;
try {
const fs = await import(
/* webpackIgnore: true */
"fs"
);
fileContent = await fs.promises.readFile(filePath, "utf8");
} catch (e) {
console.log("Config file not found: " + filePath);
console.log('Use "veramo config create" to create one');
process.exit(1);
}
let config;
try {
config = yaml.parse(fileContent, {
prettyErrors: true
});
} catch (e) {
console.error(`Unable to parse config file: ${e.message} ${e.linePos}`);
process.exit(1);
}
if (config?.version != 3) {
console.error("Unsupported configuration file version:", config.version);
process.exit(1);
}
return config;
}, "getConfig");
async function getAgent(fileName) {
try {
return await createAgentFromConfig(await getConfig(fileName));
} catch (e) {
console.log("Unable to create agent from " + fileName + ".", e.message);
process.exit(1);
}
}
__name(getAgent, "getAgent");
// src/typeormTypes.ts
var getDbType = /* @__PURE__ */ __name((opts) => {
const type = (typeof process === "object" ? process?.env?.DB_TYPE : void 0) ?? DataSources.singleInstance().defaultDbType ?? opts?.defaultType;
if (!type) {
throw Error(`Could not determine DB type. Please set the DB_TYPE global variable or env var to one of 'postgres' or 'sqlite'`);
}
return type;
}, "getDbType");
var typeOrmDateTime = /* @__PURE__ */ __name((opts) => {
switch (getDbType(opts)) {
case "postgres":
return "timestamp";
case "sqlite":
case "react-native":
return "datetime";
default:
throw Error(`DB type ${getDbType(opts)} not supported. Right now only sqlite, react-native and postgresql are supported`);
}
}, "typeOrmDateTime");
var typeormDate = /* @__PURE__ */ __name((opts) => {
return "date";
}, "typeormDate");
export {
DataSources,
contextHasCredentialIssuer,
contextHasCredentialStatusVerifier,
contextHasCredentialVerifier,
contextHasDataStore,
contextHasDataStoreORM,
contextHasDidManager,
contextHasDidResolver,
contextHasKeyManager,
contextHasPlugin,
createAgent,
createAgentFromConfig,
createObjects,
dropDatabase,
getAgent,
getConfig,
getDbConnection,
getDbType,
resetDatabase,
revertMigration,
typeOrmDateTime,
typeormDate
};
//# sourceMappingURL=index.js.map