@mojsoski/server-crypto
Version:
Asymmetric key-exchange cryptography library
76 lines (69 loc) • 1.99 kB
text/typescript
import { ICryptoProvider } from "./base";
import { CurrentServer } from "./current-server";
import { RemoteServer } from "./remote-server";
import { Server } from "./server";
export class ServerManager<TKey> {
private _currentServer: CurrentServer<TKey>;
private _servers: Map<string, RemoteServer<TKey>>;
private _provider: ICryptoProvider<TKey>;
get provider() {
return this._provider;
}
constructor(
currentServer: CurrentServer<TKey>,
remotes: Iterable<RemoteServer<TKey>>,
provider: ICryptoProvider<TKey>
) {
this._provider = provider;
this._currentServer = currentServer;
this._servers = new Map<string, RemoteServer<TKey>>(
[...remotes].map(
(remote) =>
[remote.name.toLocaleLowerCase(), remote] as [
string,
RemoteServer<TKey>
]
)
);
}
get self(): CurrentServer<TKey> {
return this._currentServer;
}
async *publicKeys(): AsyncIterable<
[
string,
{ "application/pkix-spki": string; "application/jwk+json": object }
]
> {
yield [
this.self.name,
{
"application/pkix-spki": await this._provider.crypto.stringifyPublicKey(
this.self.publicKey
),
"application/jwk+json": await this._provider.crypto.jwkPublicKey(
this.self.publicKey
),
},
];
for (const [name, server] of this._servers) {
yield [
name,
{
"application/pkix-spki":
await this._provider.crypto.stringifyPublicKey(server.publicKey),
"application/jwk+json": await this._provider.crypto.jwkPublicKey(
server.publicKey
),
},
];
}
}
get(name: string): Server<TKey> | undefined {
const lowercaseName = name.toLocaleLowerCase();
if (lowercaseName === this._currentServer.name.toLocaleLowerCase()) {
return this._currentServer;
}
return this._servers.get(lowercaseName);
}
}