@@ -110,27 +110,26 @@ export const v2OrchestrationErrorPolicy = {
110110 } ,
111111} satisfies V2ErrorPolicy
112112
113- export async function admitV2Request (
114- request : NextRequest ,
115- operation : ApplicationOperation ,
116- authPolicy : typeof v2ApiKeyAuth ,
117- rateLimitPolicy : V2RateLimitPolicy
118- ) : Promise <
119- { success : true ; auth : V2ApiKeyAuthContext } | { success : false ; response : NextResponse }
120- > {
113+ async function enforceV2PreAuthIpLimit ( request : NextRequest ) : Promise < NextResponse | null > {
121114 const ip = getClientIp ( request )
122115 const abuseLimit = await rateLimiter . checkRateLimitDirect (
123116 `v2:preauth:ip:${ ip } ` ,
124117 V2_PREAUTH_IP_LIMIT ,
125118 { failClosed : true }
126119 )
127- if ( ! abuseLimit . allowed ) {
128- return {
129- success : false ,
130- response : v2RateLimitError ( { ...abuseLimit , limit : V2_PREAUTH_IP_LIMIT . maxTokens } ) ,
131- }
132- }
120+ return abuseLimit . allowed
121+ ? null
122+ : v2RateLimitError ( { ...abuseLimit , limit : V2_PREAUTH_IP_LIMIT . maxTokens } )
123+ }
133124
125+ async function admitAuthenticatedV2Request (
126+ request : NextRequest ,
127+ operation : ApplicationOperation ,
128+ authPolicy : typeof v2ApiKeyAuth ,
129+ rateLimitPolicy : V2RateLimitPolicy
130+ ) : Promise <
131+ { success : true ; auth : V2ApiKeyAuthContext } | { success : false ; response : NextResponse }
132+ > {
134133 let auth : V2ApiKeyAuthContext
135134 try {
136135 auth = await authPolicy . authenticate ( request )
@@ -153,6 +152,33 @@ export async function admitV2Request(
153152 return limited ? { success : false , response : limited } : { success : true , auth }
154153}
155154
155+ export async function admitV2Request (
156+ request : NextRequest ,
157+ operation : ApplicationOperation ,
158+ authPolicy : typeof v2ApiKeyAuth ,
159+ rateLimitPolicy : V2RateLimitPolicy
160+ ) : Promise <
161+ { success : true ; auth : V2ApiKeyAuthContext } | { success : false ; response : NextResponse }
162+ > {
163+ const preAuthResponse = await enforceV2PreAuthIpLimit ( request )
164+ if ( preAuthResponse ) return { success : false , response : preAuthResponse }
165+ return admitAuthenticatedV2Request ( request , operation , authPolicy , rateLimitPolicy )
166+ }
167+
168+ export async function admitOptionalV2Request (
169+ request : NextRequest ,
170+ operation : ApplicationOperation ,
171+ authPolicy : typeof v2ApiKeyAuth ,
172+ rateLimitPolicy : V2RateLimitPolicy
173+ ) : Promise <
174+ { success : true ; auth ?: V2ApiKeyAuthContext } | { success : false ; response : NextResponse }
175+ > {
176+ const preAuthResponse = await enforceV2PreAuthIpLimit ( request )
177+ if ( preAuthResponse ) return { success : false , response : preAuthResponse }
178+ if ( ! request . headers . has ( 'x-api-key' ) ) return { success : true }
179+ return admitAuthenticatedV2Request ( request , operation , authPolicy , rateLimitPolicy )
180+ }
181+
156182interface V2JsonRouteOptions < C extends JsonApiRouteContract , O extends ApplicationOperation , I , R >
157183 extends JsonRouteDefinition < C , O , I , R > {
158184 auth : typeof v2ApiKeyAuth
0 commit comments