@mojsoski/server-crypto
Version:
Asymmetric key-exchange cryptography library
70 lines • 3.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CurrentServer = void 0;
const assert_1 = require("@mojsoski/assert");
const async_stream_1 = require("@mojsoski/async-stream");
const index_1 = require("./index");
class CurrentServer extends index_1.Server {
#publicKey;
#privateKey;
#name;
static async fromEnvironment(provider) {
(0, assert_1.assertNonNull)(process.env.CURRENT_SERVER_NAME, "CURRENT_SERVER_NAME");
(0, assert_1.assertNonNull)(process.env.CURRENT_SERVER_PUBLIC_KEY, "CURRENT_SERVER_PUBLIC_KEY");
(0, assert_1.assertNonNull)(process.env.CURRENT_SERVER_PRIVATE_KEY, "CURRENT_SERVER_PRIVATE_KEY");
return new CurrentServer(process.env.CURRENT_SERVER_NAME, await provider.crypto.parsePublicKey(process.env.CURRENT_SERVER_PUBLIC_KEY), await provider.crypto.parsePrivateKey(process.env.CURRENT_SERVER_PRIVATE_KEY), provider);
}
constructor(name, publicKey, privateKey, provider) {
super(provider);
this.#publicKey = publicKey;
this.#privateKey = privateKey;
this.#name = name.toLocaleLowerCase();
}
get name() {
return this.#name;
}
get publicKey() {
return this.#publicKey;
}
get privateKey() {
return this.#privateKey;
}
signJwt(obj, expiresIn) {
return this._provider.jwt.signRS256(obj, this.privateKey, expiresIn);
}
decryptStream(stream) {
const provider = this._provider;
const ref = this;
return {
async *read(signal) {
let context = undefined;
for await (const item of stream.read(signal)) {
if ("content" in item) {
(0, assert_1.assertNonNull)(context, "Received the first message before receiving the key.");
yield await index_1.Server.decrypt(context, item, provider);
}
else {
context = await ref.decryptContext(item);
}
}
},
transform() {
return new async_stream_1.AsyncTransform(this);
},
};
}
async decryptContext(header) {
const iv = Buffer.from(header.iv, "base64");
const encryptedKey = Buffer.from(header.key, "base64");
const key = await this._provider.crypto.privateDecrypt(encryptedKey, this.privateKey);
return { key, iv, header };
}
async decryptBase64(payloadB64) {
const payloadJson = Buffer.from(payloadB64, "base64");
const encrypted = JSON.parse(payloadJson.toString("utf-8"));
const decrypted = await index_1.Server.decrypt(await this.decryptContext({ key: encrypted.key, iv: encrypted.iv }), { content: encrypted.content, authTag: encrypted.authTag }, this._provider);
return JSON.parse(decrypted.toString("utf-8"));
}
}
exports.CurrentServer = CurrentServer;
//# sourceMappingURL=current-server.js.map