@m-ld/gateway
Version:
m-ld gateway for services
117 lines • 9.2 kB
JavaScript
import { domainRelativeIri } from './util.js';
import { as } from '../lib/validate.js';
/**
* Combination of gateway, account and timesheet/project. Representations:
* 1. Presentation string `[<account>/]<name>[@<gateway>]`,
* see {@link toString} and {@link #fromString}.
* 2. Configuration/persistence path array
* see {@link #toPath} and {@link #fromPath}.
* 3. m-ld domain name `<name>.<account>.<gateway>`
* see {@link #fromDomain}.
*/
export class AccountOwnedId {
static fromString(str) {
const [accName, gateway] = str.split('@');
const [account, name] = accName.split('/');
if (name != null) // account included
return new AccountOwnedId({ account, name, gateway });
else // No account included
return new AccountOwnedId({ name: account, gateway });
}
static fromPath(dir) {
const [name, account, ...gateway] = [...dir].reverse();
return new AccountOwnedId({
account, name, gateway: gateway.join('.')
});
}
static fromDomain(domain) {
return AccountOwnedId.fromPath(domain.split('.').reverse());
}
static fromIri(iri, gateway) {
if (typeof iri == 'string') {
if (!gateway && !iri.includes('//')) {
const [account, name] = iri.split('/');
return new AccountOwnedId({ account, name });
}
iri = new URL(gateway == null ? iri : domainRelativeIri(iri, gateway));
}
gateway = iri.hostname;
const [, account, name] = iri.pathname.split('/');
return new AccountOwnedId({ gateway, account, name });
}
static fromReference(ref, gateway) {
return this.fromIri(ref['@id'], gateway);
}
/**
* @param name
* @param account
* @param gateway dot-separated gateway "domain name"
*/
constructor({ gateway, account, name }) {
this.gateway = gateway ?? '';
this.account = account ?? '';
this.name = name;
}
get isRelative() {
return !this.gateway;
}
get isValid() {
return (this.isRelative ||
this.gateway.split('.').every(AccountOwnedId.isComponentId))
&& AccountOwnedId.isComponentId(this.account)
&& AccountOwnedId.isComponentId(this.name);
}
/** Validates this ID */
validate() {
// Gateway is allowed to be undefined or false
if (!this.isRelative)
this.gateway.split('.').forEach(AccountOwnedId.checkComponentId);
AccountOwnedId.checkComponentId(this.account);
AccountOwnedId.checkComponentId(this.name);
return this;
}
static checkComponentId(id) {
as.assert(id, AccountOwnedId.asComponentId);
}
static isComponentId(id) {
return !AccountOwnedId.asComponentId.validate(id).error;
}
/**
* @returns path relative directory path suitable for persistence
*/
toPath() {
return [
...this.gateway.split('.').reverse(),
this.account,
this.name
];
}
toDomain() {
return `${this.name}.${this.account}.${this.gateway}`;
}
toIri() {
const path = this.toRelativeIri();
return this.isRelative ? path : domainRelativeIri(path, this.gateway);
}
toRelativeIri() {
return `${this.account}/${this.name}`;
}
toReference() {
return { '@id': this.toIri() };
}
toStateId(tick) {
return `${this.toIri()}?tick=${tick}`;
}
toString() {
let rtn = this.account ? `${this.account}/` : '';
rtn += this.name;
rtn += this.gateway ? `@${this.gateway}` : '';
return rtn;
}
toJSON() {
const { gateway, account, name } = this;
return { gateway, account, name };
}
}
AccountOwnedId.asComponentId = as.string().regex(/^[a-z0-9_-]+$/).required();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjb3VudE93bmVkSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL0FjY291bnRPd25lZElkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUU5QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFeEM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUN6QixNQUFNLENBQUMsVUFBVSxDQUFDLEdBQVc7UUFDM0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsbUJBQW1CO1lBQ25DLE9BQU8sSUFBSSxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDbkQsc0JBQXNCO1lBQ3pCLE9BQU8sSUFBSSxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBYTtRQUMzQixNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2RCxPQUFPLElBQUksY0FBYyxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQzFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxD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