@m-ld/gateway
Version:
m-ld gateway for services
48 lines • 4.76 kB
JavaScript
import { fetchJson as defaultFetchJson } from '@m-ld/io-web-runtime/dist/server/fetch';
import { AuthKey } from '../lib/index.js';
import { as, validate } from '../lib/validate.js';
export class AblyKeyStore {
constructor(cfg, fetchJson = defaultFetchJson) {
const config = validate(cfg, as.object({
ably: as.object({ apiKey: as.string().required() }).required()
}).unknown());
const [appId] = config.auth.key.split('.');
this.fetchJson = ((path, params, options) => fetchJson(`https://control.ably.net/v1/apps/${appId}/${path}`, params, {
headers: { Authorization: `Bearer ${config.ably.apiKey}` }, ...options
}));
this.domainName = config['@domain'];
}
/**
* @see https://ably.com/docs/api/control-api#tag/keys/paths/~1apps~1{app_id}~1keys/post
*/
async mintKey(name) {
return this.ablyToAuthDetail(await this.fetchJson('keys', {}, {
method: 'POST', body: JSON.stringify({ name, capability: this.keyCapability() })
}));
}
/**
* Note: this call works even if both name and capability are missing; and can
* therefore be used to check if a keyid exists
*
* @see https://ably.com/docs/api/control-api#tag/keys/paths/~1apps~1{app_id}~1keys/post
*/
async pingKey(keyid, getAuthorisedTsIds) {
return this.ablyToAuthDetail(await this.fetchJson(`keys/${keyid}`, {}, {
method: 'PATCH', body: JSON.stringify({
capability: this.keyCapability(...await getAuthorisedTsIds())
})
}));
}
ablyToAuthDetail({ key, name, status }) {
return { key: AuthKey.fromString(key), name, revoked: status === 1 };
}
keyCapability(...tsIds) {
return Object.assign({
// Ably keys must have a capability. Assign a notification channels as a minimum.
[`${this.domainName}:notify`]: ['subscribe']
}, ...tsIds.map(tsId => ({
[`${tsId.toDomain()}:*`]: ['publish', 'subscribe', 'presence']
})));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJseUtleVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FibHkvQWJseUtleVN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLElBQUksZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RixPQUFPLEVBQWtCLE9BQU8sRUFBMkMsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRyxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBWWxELE1BQU0sT0FBTyxZQUFZO0lBSXZCLFlBQVksR0FBa0IsRUFBRSxTQUFTLEdBQUcsZ0JBQWdCO1FBQzFELE1BQU0sTUFBTSxHQUFzQixRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDeEQsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDL0QsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQ3BELG9DQUFvQyxLQUFLLElBQUksSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFO1lBQzNELE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU87U0FDdkUsQ0FBQyxDQUFDLENBQUM7UUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDNUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7U0FDakYsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQWEsRUFBRSxrQkFBc0M7UUFDakUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ3JFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO2FBQzlELENBQUM7U0FDSCxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUVuQztRQUNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQUcsS0FBdUI7UUFDdEMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ25CLGlGQUFpRjtZQUNqRixDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUM7U0FDN0MsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUM7U0FDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDRiJ9