11import * as jose from "jose" ;
22import type { License , Realm } from "@/lib/types" ;
33
4+ export const KEYWRIT_VERSION = 1 ;
5+ export const KEYWRIT_ISSUER = "keywrit" ;
6+
47export interface LicenseParams {
5- sub : string ;
68 label ?: string ;
7- iss ?: string ;
8- aud ?: string | string [ ] ;
99 kind ?: string ;
1010 flags ?: string [ ] ;
1111 features ?: Record < string , unknown > ;
@@ -16,7 +16,8 @@ export interface LicenseParams {
1616
1717export async function createLicense (
1818 realm : Realm ,
19- params : LicenseParams ,
19+ sub : string ,
20+ params : LicenseParams = { } ,
2021) : Promise < License > {
2122 const privateKey = await jose . importJWK ( realm . keyPair . privateKey , "EdDSA" ) ;
2223
@@ -28,8 +29,6 @@ export async function createLicense(
2829 const jti = crypto . randomUUID ( ) ;
2930
3031 // Merge realm defaults with provided params (params take precedence)
31- const iss = params . iss ?? realm . defaults . iss ;
32- const aud = params . aud ?? realm . defaults . aud ;
3332 const kind = params . kind ?? realm . defaults . kind ;
3433 const flags = params . flags ?? realm . defaults . flags ;
3534 const features = params . features ?? realm . defaults . features ;
@@ -45,11 +44,10 @@ export async function createLicense(
4544 // Build JWT payload
4645 const payload : jose . JWTPayload = {
4746 jti,
48- sub : params . sub ,
47+ sub,
48+ iss : KEYWRIT_ISSUER ,
49+ aud : realm . name ,
4950 } ;
50-
51- if ( iss ) payload . iss = iss ;
52- if ( aud ) payload . aud = aud ;
5351 if ( kind ) payload . kind = kind ;
5452 if ( flags && flags . length > 0 ) payload . flags = flags ;
5553 if ( features && Object . keys ( features ) . length > 0 )
@@ -60,16 +58,15 @@ export async function createLicense(
6058 if ( params . nbf ) payload . nbf = params . nbf ;
6159
6260 const token = await new jose . SignJWT ( payload )
63- . setProtectedHeader ( { alg : "EdDSA" } )
61+ . setProtectedHeader ( { alg : "EdDSA" , typ : "JWT" , kwv : KEYWRIT_VERSION } )
6462 . setIssuedAt ( now )
6563 . sign ( privateKey ) ;
6664
6765 const license : License = {
68- id : crypto . randomUUID ( ) ,
6966 jti,
70- sub : params . sub ,
71- iss,
72- aud,
67+ sub,
68+ iss : KEYWRIT_ISSUER ,
69+ aud : realm . name ,
7370 kind,
7471 flags,
7572 features,
0 commit comments