Skip to content

Commit 9dd7d2f

Browse files
authored
Make NatsJwt Static (#43)
As noted in #42, NatsJwt could provide simpler access if made static. I'm currently reusing a singleton instance, but making it static would eliminate the need for this Unless there are reasons against it, this PR marks NatsJwt as static.
1 parent 8aaac6a commit 9dd7d2f

File tree

6 files changed

+106
-131
lines changed

6 files changed

+106
-131
lines changed

src/NATS.Jwt/NatsJwt.cs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace NATS.Jwt;
2020
/// <summary>
2121
/// Class for managing NATS JWT encoding and decoding.
2222
/// </summary>
23-
public class NatsJwt
23+
public static class NatsJwt
2424
{
2525
/// <summary>
2626
/// Represents the JSON Web Token (JWT) header used for encoding NATS JWT claims.
@@ -106,7 +106,7 @@ public class NatsJwt
106106
/// <param name="seed">The seed.</param>
107107
/// <returns>The formatted user configuration.</returns>
108108
/// <exception cref="NatsJwtException">Thrown when the seed is not an operator, account, or user seed.</exception>
109-
public string FormatUserConfig(string jwt, string seed)
109+
public static string FormatUserConfig(string jwt, string seed)
110110
{
111111
// TODO: Decode JWT and validate
112112
var parts = jwt.Split('.');
@@ -147,49 +147,49 @@ NKEYs are sensitive and should be treated as secrets.
147147
/// </summary>
148148
/// <param name="subject">The subject for the activation claims.</param>
149149
/// <returns>A new instance of NatsActivationClaims with the specified subject.</returns>
150-
public NatsActivationClaims NewActivationClaims(string subject) => new() { Subject = subject };
150+
public static NatsActivationClaims NewActivationClaims(string subject) => new() { Subject = subject };
151151

152152
/// <summary>
153153
/// Creates a new instance of the NatsAuthorizationRequestClaims class with the specified subject.
154154
/// </summary>
155155
/// <param name="subject">The subject of the authorization request.</param>
156156
/// <returns>A new instance of the NatsAuthorizationRequestClaims class.</returns>
157-
public NatsAuthorizationRequestClaims NewAuthorizationRequestClaims(string subject) => new() { Subject = subject };
157+
public static NatsAuthorizationRequestClaims NewAuthorizationRequestClaims(string subject) => new() { Subject = subject };
158158

159159
/// <summary>
160160
/// Creates a new instance of NatsAuthorizationResponseClaims with the specified subject.
161161
/// </summary>
162162
/// <param name="subject">The subject of the claims.</param>
163163
/// <returns>A new instance of NatsAuthorizationResponseClaims.</returns>
164-
public NatsAuthorizationResponseClaims NewAuthorizationResponseClaims(string subject) => new() { Subject = subject };
164+
public static NatsAuthorizationResponseClaims NewAuthorizationResponseClaims(string subject) => new() { Subject = subject };
165165

166166
/// <summary>
167167
/// Creates a new instance of NatsGenericClaims with the specified subject.
168168
/// </summary>
169169
/// <param name="subject">The subject of the claim.</param>
170170
/// <returns>A new instance of NatsGenericClaims.</returns>
171-
public NatsGenericClaims NewGenericClaims(string subject) => new() { Subject = subject };
171+
public static NatsGenericClaims NewGenericClaims(string subject) => new() { Subject = subject };
172172

173173
/// <summary>
174174
/// Creates new operator claims for generating a NATS JWT token.
175175
/// </summary>
176176
/// <param name="subject">The subject of the operator claims.</param>
177177
/// <returns>A new instance of the <see cref="NatsOperatorClaims"/> class.</returns>
178-
public NatsOperatorClaims NewOperatorClaims(string subject) => new() { Subject = subject, Issuer = subject };
178+
public static NatsOperatorClaims NewOperatorClaims(string subject) => new() { Subject = subject, Issuer = subject };
179179

180180
/// <summary>
181181
/// Creates a new instance of the NatsUserClaims class with the specified subject.
182182
/// </summary>
183183
/// <param name="subject">The subject of the user claims.</param>
184184
/// <returns>A new instance of the NatsUserClaims class.</returns>
185-
public NatsUserClaims NewUserClaims(string subject) => new() { Subject = subject };
185+
public static NatsUserClaims NewUserClaims(string subject) => new() { Subject = subject };
186186

187187
/// <summary>
188188
/// Creates a new instance of the NatsAccountClaims class with the specified subject.
189189
/// </summary>
190190
/// <param name="subject">The subject for the account claims.</param>
191191
/// <returns>A new instance of NatsAccountClaims.</returns>
192-
public NatsAccountClaims NewAccountClaims(string subject) => new() { Subject = subject };
192+
public static NatsAccountClaims NewAccountClaims(string subject) => new() { Subject = subject };
193193

194194
/// <summary>
195195
/// Encodes the activation claims into a JWT token.
@@ -198,7 +198,7 @@ NKEYs are sensitive and should be treated as secrets.
198198
/// <param name="keyPair">The key pair used for signing the JWT token.</param>
199199
/// <param name="issuedAt">The optional issued at timestamp. If not provided, the current time will be used.</param>
200200
/// <returns>The encoded JWT token.</returns>
201-
public string EncodeActivationClaims(NatsActivationClaims activationClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
201+
public static string EncodeActivationClaims(NatsActivationClaims activationClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
202202
{
203203
SetVersion(activationClaims.Activation, ActivationClaim);
204204
return DoEncode(NatsJwtHeader, keyPair, activationClaims, JsonContext.Default.NatsActivationClaims, issuedAt);
@@ -211,7 +211,7 @@ public string EncodeActivationClaims(NatsActivationClaims activationClaims, KeyP
211211
/// <param name="keyPair">The key pair used for signing the token.</param>
212212
/// <param name="issuedAt">The optional issued At timestamp for the token. If not provided, the current timestamp will be used.</param>
213213
/// <returns>The encoded JWT token.</returns>
214-
public string EncodeAuthorizationRequestClaims(NatsAuthorizationRequestClaims authorizationRequestClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
214+
public static string EncodeAuthorizationRequestClaims(NatsAuthorizationRequestClaims authorizationRequestClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
215215
{
216216
SetVersion(authorizationRequestClaims.AuthorizationRequest, AuthorizationRequestClaim);
217217
return DoEncode(NatsJwtHeader, keyPair, authorizationRequestClaims, JsonContext.Default.NatsAuthorizationRequestClaims, issuedAt);
@@ -224,7 +224,7 @@ public string EncodeAuthorizationRequestClaims(NatsAuthorizationRequestClaims au
224224
/// <param name="keyPair">The key pair to use for encryption.</param>
225225
/// <param name="issuedAt">The optional issued at date and time.</param>
226226
/// <returns>The encoded string representation of the authorization response claims.</returns>
227-
public string EncodeAuthorizationResponseClaims(NatsAuthorizationResponseClaims authorizationResponseClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
227+
public static string EncodeAuthorizationResponseClaims(NatsAuthorizationResponseClaims authorizationResponseClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
228228
{
229229
SetVersion(authorizationResponseClaims.AuthorizationResponse, AuthorizationResponseClaim);
230230
return DoEncode(NatsJwtHeader, keyPair, authorizationResponseClaims, JsonContext.Default.NatsAuthorizationResponseClaims, issuedAt);
@@ -237,7 +237,7 @@ public string EncodeAuthorizationResponseClaims(NatsAuthorizationResponseClaims
237237
/// <param name="keyPair">The key pair used for encoding.</param>
238238
/// <param name="issuedAt">The optional issued at datetime offset.</param>
239239
/// <returns>The encoded JWT token.</returns>
240-
public string EncodeGenericClaims(NatsGenericClaims genericClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
240+
public static string EncodeGenericClaims(NatsGenericClaims genericClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
241241
{
242242
return DoEncode(NatsJwtHeader, keyPair, genericClaims, JsonContext.Default.NatsGenericClaims, issuedAt);
243243
}
@@ -249,7 +249,7 @@ public string EncodeGenericClaims(NatsGenericClaims genericClaims, KeyPair keyPa
249249
/// <param name="keyPair">The key pair used for signing the token.</param>
250250
/// <param name="issuedAt">The optional issued at timestamp.</param>
251251
/// <returns>The encoded JWT token.</returns>
252-
public string EncodeOperatorClaims(NatsOperatorClaims operatorClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
252+
public static string EncodeOperatorClaims(NatsOperatorClaims operatorClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
253253
{
254254
SetVersion(operatorClaims.Operator, OperatorClaim);
255255
return DoEncode(NatsJwtHeader, keyPair, operatorClaims, JsonContext.Default.NatsOperatorClaims, issuedAt);
@@ -262,7 +262,7 @@ public string EncodeOperatorClaims(NatsOperatorClaims operatorClaims, KeyPair ke
262262
/// <param name="keyPair">The key pair to sign the JWT token.</param>
263263
/// <param name="issuedAt">The optional issued at datetime offset.</param>
264264
/// <returns>The encoded JWT token.</returns>
265-
public string EncodeUserClaims(NatsUserClaims userClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
265+
public static string EncodeUserClaims(NatsUserClaims userClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
266266
{
267267
SetVersion(userClaims.User, UserClaim);
268268
return DoEncode(NatsJwtHeader, keyPair, userClaims, JsonContext.Default.NatsUserClaims, issuedAt);
@@ -275,7 +275,7 @@ public string EncodeUserClaims(NatsUserClaims userClaims, KeyPair keyPair, DateT
275275
/// <param name="keyPair">The key pair used for signing the token.</param>
276276
/// <param name="issuedAt">The optional time when the token was issued. If not specified, the current time will be used.</param>
277277
/// <returns>The encoded JWT token.</returns>
278-
public string EncodeAccountClaims(NatsAccountClaims accountClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
278+
public static string EncodeAccountClaims(NatsAccountClaims accountClaims, KeyPair keyPair, DateTimeOffset? issuedAt = null)
279279
{
280280
SetVersion(accountClaims.Account, AccountClaim);
281281
accountClaims.Account.Imports?.Sort(ImportComparer);
@@ -295,7 +295,7 @@ public string EncodeAccountClaims(NatsAccountClaims accountClaims, KeyPair keyPa
295295
/// The payload is base64-encoded JSON representing the claims data.
296296
/// The method verifies the signature by comparing it against the signing input generated from the header and payload.
297297
/// </remarks>
298-
public T DecodeClaims<T>(string jwt)
298+
public static T DecodeClaims<T>(string jwt)
299299
where T : JwtClaimsData
300300
{
301301
return DecodeClaims(jwt, (JsonTypeInfo<T>)JsonContext.Default.GetTypeInfo(typeof(T))!);
@@ -307,7 +307,7 @@ public T DecodeClaims<T>(string jwt)
307307
/// <param name="jwt">The JWT token to decode.</param>
308308
/// <returns>The decoded operator claims.</returns>
309309
/// <exception cref="NatsJwtException">Thrown when the operator claim type is invalid.</exception>
310-
public NatsOperatorClaims DecodeOperatorClaims(string jwt)
310+
public static NatsOperatorClaims DecodeOperatorClaims(string jwt)
311311
{
312312
var claims = DecodeClaims(jwt, JsonContext.Default.NatsOperatorClaims);
313313
if (claims.Operator.Type != OperatorClaim)
@@ -324,7 +324,7 @@ public NatsOperatorClaims DecodeOperatorClaims(string jwt)
324324
/// <param name="jwt">The JWT token.</param>
325325
/// <returns>The decoded account claims.</returns>
326326
/// <exception cref="NatsJwtException">Thrown when the account claims type is not as expected.</exception>
327-
public NatsAccountClaims DecodeAccountClaims(string jwt)
327+
public static NatsAccountClaims DecodeAccountClaims(string jwt)
328328
{
329329
var claims = DecodeClaims(jwt, JsonContext.Default.NatsAccountClaims);
330330
if (claims.Account.Type != AccountClaim)
@@ -341,7 +341,7 @@ public NatsAccountClaims DecodeAccountClaims(string jwt)
341341
/// <param name="jwt">The JWT token.</param>
342342
/// <returns>The decoded user claims.</returns>
343343
/// <exception cref="NatsJwtException">Thrown when the user claim is not found or has an invalid type.</exception>
344-
public NatsUserClaims DecodeUserClaims(string jwt)
344+
public static NatsUserClaims DecodeUserClaims(string jwt)
345345
{
346346
var claims = DecodeClaims(jwt, JsonContext.Default.NatsUserClaims);
347347
if (claims.User.Type != UserClaim)
@@ -358,7 +358,7 @@ public NatsUserClaims DecodeUserClaims(string jwt)
358358
/// <param name="jwt">The JWT token.</param>
359359
/// <returns>The decoded activation claims.</returns>
360360
/// <exception cref="NatsJwtException">Thrown when the activation type in the claims is not as expected.</exception>
361-
public NatsActivationClaims DecodeActivationClaims(string jwt)
361+
public static NatsActivationClaims DecodeActivationClaims(string jwt)
362362
{
363363
var claims = DecodeClaims(jwt, JsonContext.Default.NatsActivationClaims);
364364
if (claims.Activation.Type != ActivationClaim)
@@ -382,7 +382,7 @@ public NatsActivationClaims DecodeActivationClaims(string jwt)
382382
/// The payload is base64-encoded JSON representing the claims data.
383383
/// The method verifies the signature by comparing it against the signing input generated from the header and payload.
384384
/// </remarks>
385-
private T DecodeClaims<T>(string jwt, JsonTypeInfo<T> jsonTypeInfo)
385+
private static T DecodeClaims<T>(string jwt, JsonTypeInfo<T> jsonTypeInfo)
386386
where T : JwtClaimsData
387387
{
388388
string[] parts = jwt.Split('.');
@@ -451,14 +451,14 @@ static void VerifyClaims(JwtClaimsData claimsData, string payload, byte[] signat
451451
}
452452
}
453453

454-
private void SetVersion<T>(T claims, string type)
454+
private static void SetVersion<T>(T claims, string type)
455455
where T : NatsGenericFields
456456
{
457457
claims.Type = type;
458458
claims.Version = LibraryVersion;
459459
}
460460

461-
private string DoEncode<T>(JwtHeader jwtHeader, KeyPair keyPair, T claim, JsonTypeInfo<T> typeInfo, DateTimeOffset? now)
461+
private static string DoEncode<T>(JwtHeader jwtHeader, KeyPair keyPair, T claim, JsonTypeInfo<T> typeInfo, DateTimeOffset? now)
462462
where T : JwtClaimsData
463463
{
464464
using var writer = new NatsBufferWriter<byte>();
@@ -494,7 +494,7 @@ private string DoEncode<T>(JwtHeader jwtHeader, KeyPair keyPair, T claim, JsonTy
494494
return $"{toSign}.{eSig}";
495495
}
496496

497-
private string Hash<T>(T c, JsonTypeInfo<T> typeInfo)
497+
private static string Hash<T>(T c, JsonTypeInfo<T> typeInfo)
498498
{
499499
using var writer = new NatsBufferWriter<byte>();
500500
var jsonWriter = new Utf8JsonWriter(writer);

src/NATS.Jwt/PublicAPI.Unshipped.txt

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -386,27 +386,6 @@ NATS.Jwt.Models.TimeRange.Start.get -> string!
386386
NATS.Jwt.Models.TimeRange.Start.set -> void
387387
NATS.Jwt.ModelValidationExtensions
388388
NATS.Jwt.NatsJwt
389-
NATS.Jwt.NatsJwt.DecodeAccountClaims(string! jwt) -> NATS.Jwt.Models.NatsAccountClaims!
390-
NATS.Jwt.NatsJwt.DecodeActivationClaims(string! jwt) -> NATS.Jwt.Models.NatsActivationClaims!
391-
NATS.Jwt.NatsJwt.DecodeClaims<T>(string! jwt) -> T!
392-
NATS.Jwt.NatsJwt.DecodeOperatorClaims(string! jwt) -> NATS.Jwt.Models.NatsOperatorClaims!
393-
NATS.Jwt.NatsJwt.DecodeUserClaims(string! jwt) -> NATS.Jwt.Models.NatsUserClaims!
394-
NATS.Jwt.NatsJwt.EncodeAccountClaims(NATS.Jwt.Models.NatsAccountClaims! accountClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
395-
NATS.Jwt.NatsJwt.EncodeActivationClaims(NATS.Jwt.Models.NatsActivationClaims! activationClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
396-
NATS.Jwt.NatsJwt.EncodeAuthorizationRequestClaims(NATS.Jwt.Models.NatsAuthorizationRequestClaims! authorizationRequestClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
397-
NATS.Jwt.NatsJwt.EncodeAuthorizationResponseClaims(NATS.Jwt.Models.NatsAuthorizationResponseClaims! authorizationResponseClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
398-
NATS.Jwt.NatsJwt.EncodeGenericClaims(NATS.Jwt.Models.NatsGenericClaims! genericClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
399-
NATS.Jwt.NatsJwt.EncodeOperatorClaims(NATS.Jwt.Models.NatsOperatorClaims! operatorClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
400-
NATS.Jwt.NatsJwt.EncodeUserClaims(NATS.Jwt.Models.NatsUserClaims! userClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
401-
NATS.Jwt.NatsJwt.FormatUserConfig(string! jwt, string! seed) -> string!
402-
NATS.Jwt.NatsJwt.NatsJwt() -> void
403-
NATS.Jwt.NatsJwt.NewAccountClaims(string! subject) -> NATS.Jwt.Models.NatsAccountClaims!
404-
NATS.Jwt.NatsJwt.NewActivationClaims(string! subject) -> NATS.Jwt.Models.NatsActivationClaims!
405-
NATS.Jwt.NatsJwt.NewAuthorizationRequestClaims(string! subject) -> NATS.Jwt.Models.NatsAuthorizationRequestClaims!
406-
NATS.Jwt.NatsJwt.NewAuthorizationResponseClaims(string! subject) -> NATS.Jwt.Models.NatsAuthorizationResponseClaims!
407-
NATS.Jwt.NatsJwt.NewGenericClaims(string! subject) -> NATS.Jwt.Models.NatsGenericClaims!
408-
NATS.Jwt.NatsJwt.NewOperatorClaims(string! subject) -> NATS.Jwt.Models.NatsOperatorClaims!
409-
NATS.Jwt.NatsJwt.NewUserClaims(string! subject) -> NATS.Jwt.Models.NatsUserClaims!
410389
NATS.Jwt.NatsJwtException
411390
NATS.Jwt.NatsJwtException.NatsJwtException(string! message) -> void
412391
override NATS.Jwt.Models.NatsTags.Equals(object? obj) -> bool
@@ -415,6 +394,26 @@ override NATS.Jwt.Models.NatsTags.ToString() -> string!
415394
static NATS.Jwt.EncodingUtils.FromBase64UrlEncoded(string! encodedString) -> byte[]!
416395
static NATS.Jwt.ModelValidationExtensions.ExpectedPrefixes(this NATS.Jwt.Models.JwtClaimsData! claims) -> NATS.NKeys.PrefixByte[]!
417396
static NATS.Jwt.ModelValidationExtensions.Validate(this NATS.Jwt.Models.JwtHeader! header) -> void
397+
static NATS.Jwt.NatsJwt.DecodeAccountClaims(string! jwt) -> NATS.Jwt.Models.NatsAccountClaims!
398+
static NATS.Jwt.NatsJwt.DecodeActivationClaims(string! jwt) -> NATS.Jwt.Models.NatsActivationClaims!
399+
static NATS.Jwt.NatsJwt.DecodeClaims<T>(string! jwt) -> T!
400+
static NATS.Jwt.NatsJwt.DecodeOperatorClaims(string! jwt) -> NATS.Jwt.Models.NatsOperatorClaims!
401+
static NATS.Jwt.NatsJwt.DecodeUserClaims(string! jwt) -> NATS.Jwt.Models.NatsUserClaims!
402+
static NATS.Jwt.NatsJwt.EncodeAccountClaims(NATS.Jwt.Models.NatsAccountClaims! accountClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
403+
static NATS.Jwt.NatsJwt.EncodeActivationClaims(NATS.Jwt.Models.NatsActivationClaims! activationClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
404+
static NATS.Jwt.NatsJwt.EncodeAuthorizationRequestClaims(NATS.Jwt.Models.NatsAuthorizationRequestClaims! authorizationRequestClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
405+
static NATS.Jwt.NatsJwt.EncodeAuthorizationResponseClaims(NATS.Jwt.Models.NatsAuthorizationResponseClaims! authorizationResponseClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
406+
static NATS.Jwt.NatsJwt.EncodeGenericClaims(NATS.Jwt.Models.NatsGenericClaims! genericClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
407+
static NATS.Jwt.NatsJwt.EncodeOperatorClaims(NATS.Jwt.Models.NatsOperatorClaims! operatorClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
408+
static NATS.Jwt.NatsJwt.EncodeUserClaims(NATS.Jwt.Models.NatsUserClaims! userClaims, NATS.NKeys.KeyPair! keyPair, System.DateTimeOffset? issuedAt = null) -> string!
409+
static NATS.Jwt.NatsJwt.FormatUserConfig(string! jwt, string! seed) -> string!
410+
static NATS.Jwt.NatsJwt.NewAccountClaims(string! subject) -> NATS.Jwt.Models.NatsAccountClaims!
411+
static NATS.Jwt.NatsJwt.NewActivationClaims(string! subject) -> NATS.Jwt.Models.NatsActivationClaims!
412+
static NATS.Jwt.NatsJwt.NewAuthorizationRequestClaims(string! subject) -> NATS.Jwt.Models.NatsAuthorizationRequestClaims!
413+
static NATS.Jwt.NatsJwt.NewAuthorizationResponseClaims(string! subject) -> NATS.Jwt.Models.NatsAuthorizationResponseClaims!
414+
static NATS.Jwt.NatsJwt.NewGenericClaims(string! subject) -> NATS.Jwt.Models.NatsGenericClaims!
415+
static NATS.Jwt.NatsJwt.NewOperatorClaims(string! subject) -> NATS.Jwt.Models.NatsOperatorClaims!
416+
static NATS.Jwt.NatsJwt.NewUserClaims(string! subject) -> NATS.Jwt.Models.NatsUserClaims!
418417
static readonly NATS.Jwt.NatsJwt.NatsJwtHeader -> NATS.Jwt.Models.JwtHeader!
419418
static NATS.Jwt.EncodingUtils.ToBase64UrlEncoded(byte[]! bytes) -> string!
420419
override NATS.Jwt.Models.NatsAccountSigningKey.ToString() -> string!

0 commit comments

Comments
 (0)