ts-jose
Version:
Wrap functions of JOSE in steady interface
61 lines • 2.1 kB
JavaScript
import { JoseError } from './error.js';
import { JWK } from './jwk.js';
export class JWKS {
constructor(keys) {
this.keys = keys;
}
getKey(options = {}) {
if (options.kid !== undefined) {
const key = this.getKeyByKid(options.kid);
if (key === undefined) {
throw new JoseError('Keys', 'kid', options.kid);
}
else if (options.use !== undefined && key.use !== options.use) {
throw new JoseError('Keys', 'use', key.use, options.use);
}
else if (options.alg !== undefined && key.alg !== undefined) {
if (key.alg !== options.alg) {
throw new JoseError('Keys', 'alg', key.alg, options.alg);
}
}
return key;
}
const keys1 = options.use !== undefined ? this.getKeyByUse(options.use) : this.keys;
if (keys1.length === 0)
throw new JoseError('Keys', 'use', options.use);
const keys2 = options.alg !== undefined ? this.getKeyByAlg(options.alg, keys1) : keys1;
if (keys2.length === 0)
throw new JoseError('Keys', 'alg', options.alg);
return keys2[0];
}
getKeyByKid(kid) {
return this.keys.find((key) => key.kid === kid);
}
getKeyByUse(use, keys) {
if (keys === undefined) {
keys = this.keys;
}
return keys.filter((key) => key.use === use);
}
getKeyByAlg(alg, keys) {
if (keys === undefined) {
keys = this.keys;
}
return keys.filter((key) => key.alg === alg);
}
toObject() {
return { keys: this.keys.map((key) => ({ ...key.metadata })) };
}
async toPublic() {
const keys = await Promise.all(this.keys.map((key) => key.toPublic()));
return new JWKS(keys);
}
static async fromObject(jwks) {
const keys = [];
for (const key of jwks.keys) {
keys.push(await JWK.fromObject(key));
}
return new JWKS(keys);
}
}
//# sourceMappingURL=jwks.js.map