101 lines · 3.0 KB · TypeScript
RawDownload
import * as NodeCrypto from "node:crypto"; import { assert, describe, it } from "@effect/vitest";import * as Effect from "effect/Effect";import * as Schema from "effect/Schema"; import {  RelayJwtSignError,  RelayJwtVerifyError,  signRelayJwt,  verifyRelayJwt,} from "./relayJwt.ts"; const keyPair = NodeCrypto.generateKeyPairSync("ed25519", {  privateKeyEncoding: { format: "pem", type: "pkcs8" },  publicKeyEncoding: { format: "pem", type: "spki" },}); const isRelayJwtSignError = Schema.is(RelayJwtSignError);const isRelayJwtVerifyError = Schema.is(RelayJwtVerifyError); describe("relayJwt", () => {  it.effect("signs and verifies relay JWTs", () =>    Effect.gen(function* () {      const token = yield* signRelayJwt({        privateKey: keyPair.privateKey,        typ: "test+jwt",        payload: {          iss: "https://relay.example.test",          aud: "https://relay.example.test",          sub: "user_123",          jti: "nonce-1",          iat: 100,          exp: 200,        },      });       const payload = yield* verifyRelayJwt({        publicKey: keyPair.publicKey,        token,        typ: "test+jwt",        issuer: "https://relay.example.test",        audience: "https://relay.example.test",        nowEpochSeconds: 150,      });       assert.equal(payload.sub, "user_123");      assert.equal(payload.jti, "nonce-1");    }),  );   it.effect("returns a structured sign error for invalid private key material", () =>    Effect.gen(function* () {      const error = yield* signRelayJwt({        privateKey: "not a pem",        typ: "test+jwt",        payload: {},      }).pipe(Effect.flip);       assert.equal(error._tag, "RelayJwtSignError");      assert.equal(error.typ, "test+jwt");      assert.equal(error.message, "Failed to sign relay JWT (test+jwt).");      assert.equal(isRelayJwtSignError(error), true);    }),  );   it.effect("returns a structured verify error with expected claim context", () =>    Effect.gen(function* () {      const token = yield* signRelayJwt({        privateKey: keyPair.privateKey,        typ: "test+jwt",        payload: {          iss: "https://relay.example.test",          aud: "https://relay.example.test",          sub: "user_123",          iat: 100,          exp: 200,        },      });       const error = yield* verifyRelayJwt({        publicKey: keyPair.publicKey,        token,        typ: "other+jwt",        issuer: "https://relay.example.test",        audience: "https://relay.example.test",        nowEpochSeconds: 150,      }).pipe(Effect.flip);       assert.equal(error._tag, "RelayJwtVerifyError");      if (error._tag !== "RelayJwtVerifyError") {        assert.fail(`Expected RelayJwtVerifyError, got ${error._tag}`);      }      assert.equal(error.typ, "other+jwt");      assert.equal(error.issuer, "https://relay.example.test");      assert.equal(error.audience, "https://relay.example.test");      assert.equal(error.message, "Failed to verify relay JWT (other+jwt).");      assert.equal(isRelayJwtVerifyError(error), true);    }),  );});