1- import { FPCloudClaim } from "@fireproof/core-types-protocols-cloud" ;
2- import { EventoResult , EventoResultType , param , Result } from "@adviser/cement" ;
3- import { ClerkClaim , ClerkEmailTemplateClaim , SuperThis } from "@fireproof/core" ;
4- import { sts } from "@fireproof/core-runtime" ;
5- import { SignJWT } from "jose/jwt/sign" ;
6- import { FPTokenContext } from "../types.js" ;
7- import { VerifiedAuthUserResult } from "@fireproof/core-types-protocols-dashboard" ;
1+ import { Result , EventoResultType , EventoResult } from "@adviser/cement" ;
82
9- export async function createFPToken ( ctx : FPTokenContext , claim : FPCloudClaim ) {
10- const privKeys = await sts . env2jwk ( ctx . secretToken ) ;
11- if ( privKeys . length !== 1 ) {
12- throw new Error ( `Expected exactly one private JWK, found ${ privKeys . length } ` ) ;
13- }
14- const privKey = privKeys [ 0 ] ;
15- let validFor = ctx . validFor ;
16- if ( validFor <= 0 ) {
17- validFor = 60 * 60 ; // 1 hour
18- }
19- const expiresDate = new Date ( Date . now ( ) + validFor * 1000 ) ; // epoch sec
20- const expiresInSec = Math . floor ( ( Math . floor ( expiresDate . getTime ( ) / 1000 ) + validFor ) / 1000 ) ;
21- const epochExp = Math . floor ( expiresDate . getTime ( ) / 1000 ) ;
22- return {
23- expiresDate,
24- expiresInSec,
25- token : await new SignJWT ( claim )
26- . setProtectedHeader ( { alg : "ES256" } ) // algorithm
27- . setIssuedAt ( )
28- . setIssuer ( ctx . issuer ) // issuer
29- . setAudience ( ctx . audience ) // audience
30- . setExpirationTime ( epochExp ) // expiration time
31- . sign ( privKey ) ,
32- } ;
33- }
34-
35- export async function getFPTokenContext ( sthis : SuperThis , ictx : Partial < FPTokenContext > = { } ) : Promise < Result < FPTokenContext > > {
36- const rCtx = sthis . env . gets ( {
37- CLOUD_SESSION_TOKEN_SECRET : ictx . secretToken ?? param . REQUIRED ,
38- CLOUD_SESSION_TOKEN_PUBLIC : ictx . publicToken ?? param . REQUIRED ,
39- CLOUD_SESSION_TOKEN_ISSUER : "FP_CLOUD" ,
40- CLOUD_SESSION_TOKEN_AUDIENCE : "PUBLIC" ,
41- CLOUD_SESSION_TOKEN_VALID_FOR : "" + 60 * 60 ,
42- CLOUD_SESSION_TOKEN_EXTEND_VALID_FOR : "" + 6 * 60 * 60 ,
43- } ) ;
44- if ( rCtx . isErr ( ) ) {
45- return Result . Err ( rCtx . Err ( ) ) ;
46- }
47- const ctx = rCtx . Ok ( ) ;
48- return Result . Ok ( {
49- secretToken : ctx . CLOUD_SESSION_TOKEN_SECRET ,
50- publicToken : ctx . CLOUD_SESSION_TOKEN_PUBLIC ,
51- issuer : ctx . CLOUD_SESSION_TOKEN_ISSUER ,
52- audience : ctx . CLOUD_SESSION_TOKEN_AUDIENCE ,
53- validFor : parseInt ( ctx . CLOUD_SESSION_TOKEN_VALID_FOR , 10 ) ,
54- extendValidFor : parseInt ( ctx . CLOUD_SESSION_TOKEN_EXTEND_VALID_FOR , 10 ) ,
55- ...ictx ,
56- } satisfies FPTokenContext ) ;
57- }
58-
59- export function nameFromAuth ( name : string | undefined , auth : VerifiedAuthUserResult ) : string {
60- return (
61- name ?? `${ auth . verifiedAuth . claims . params . email ?? nickFromClarkClaim ( auth . verifiedAuth . claims . params ) ?? auth . user . userId } `
62- ) ;
63- }
64-
65- export function nickFromClarkClaim ( auth : ClerkEmailTemplateClaim ) : string | undefined {
66- return auth . nick ?? auth . name ?? undefined ;
67- }
68-
69- export function toProvider ( i : ClerkClaim ) : FPCloudClaim [ "provider" ] {
70- if ( i . params . nick ) {
71- return "github" ;
72- }
73- return "google" ;
74- }
3+ export * from "./auth.js" ;
754
765export function wrapStop < T > ( res : Promise < Result < T > > ) : Promise < Result < EventoResultType > > {
776 return res . then ( ( r ) => {
@@ -81,5 +10,3 @@ export function wrapStop<T>(res: Promise<Result<T>>): Promise<Result<EventoResul
8110 return Result . Ok ( EventoResult . Stop ) ;
8211 } ) ;
8312}
84-
85- export * from "./auth.js" ;
0 commit comments