From ae7dac220cfcda8896ccffb448b0a1e307722f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Thu, 5 Jun 2025 19:16:22 -0300 Subject: [PATCH 1/7] feat(types): improve Azion module type system --- packages/config/README.md | 6 +- packages/config/src/types.ts | 8 +- .../presets/src/presets/angular/handler.ts | 45 +++++++---- packages/presets/src/presets/astro/handler.ts | 44 +++++++---- .../presets/src/presets/docusaurus/handler.ts | 44 +++++++---- .../presets/src/presets/eleventy/handler.ts | 44 +++++++---- .../presets/src/presets/emscripten/handler.ts | 75 ++++++++++++------- .../presets/src/presets/gatsby/handler.ts | 39 +++++++--- packages/presets/src/presets/hexo/handler.ts | 44 +++++++---- packages/presets/src/presets/html/handler.ts | 44 +++++++---- packages/presets/src/presets/hugo/handler.ts | 44 +++++++---- .../presets/src/presets/jekyll/handler.ts | 44 +++++++---- packages/presets/src/presets/next/handler.ts | 25 ++++--- .../src/presets/next/static/handler.js | 36 ++++++--- packages/presets/src/presets/nuxt/handler.ts | 44 +++++++---- .../presets/src/presets/preact/handler.ts | 44 +++++++---- packages/presets/src/presets/qwik/handler.ts | 44 +++++++---- packages/presets/src/presets/react/handler.ts | 45 +++++++---- .../presets/src/presets/rustwasm/handler.ts | 62 +++++++++------ .../presets/src/presets/stencil/handler.ts | 45 +++++++---- .../presets/src/presets/svelte/handler.ts | 44 +++++++---- .../presets/src/presets/vitepress/handler.ts | 44 +++++++---- packages/presets/src/presets/vue/handler.ts | 45 +++++++---- .../presets/src/presets/vuepress/handler.ts | 44 +++++++---- packages/types/src/index.ts | 75 +++++++++++++------ .../edge/parseRequest/parseRequest.test.ts | 68 ++++++++--------- .../src/edge/parseRequest/parseRequest.ts | 11 ++- packages/utils/src/edge/types.ts | 10 +-- 28 files changed, 768 insertions(+), 399 deletions(-) diff --git a/packages/config/README.md b/packages/config/README.md index 60e88df5..66fe557e 100644 --- a/packages/config/README.md +++ b/packages/config/README.md @@ -19,7 +19,7 @@ This module provides a function to configure and validate options for the Azion - [`AzionDomain`](#aziondomain) - [`AzionOrigin`](#azionorigin) - [`AzionCache`](#azioncache) - - [`AzionRequestRule`](#azionrequestrule) + - [`AzionRuntimeRequestRule`](#AzionRuntimeRequestrule) - [`AzionResponseRule`](#azionresponserule) - [`AzionRules`](#azionrules) - [`AzionPurge`](#azionpurge) @@ -458,7 +458,7 @@ Type definition for the cache configuration. - `option: 'ignore' | 'varies' | 'whitelist' | 'blacklist'` - Cache by query string option. - `list?: string[]` - List of query string parameters to use for caching. -### `AzionRequestRule` +### `AzionRuntimeRequestRule` Type definition for the request rule configuration. @@ -514,7 +514,7 @@ Type definition for the response rule configuration. **Properties:** - - `request: AzionRequestRule[]` - Ruleset for Request phase. + - `request: AzionRuntimeRequestRule[]` - Ruleset for Request phase. - `response?: AzionResponseRule[]` - Ruleset for Response phase. ### `AzionPurge` diff --git a/packages/config/src/types.ts b/packages/config/src/types.ts index 6ffd53e1..fcf25d03 100644 --- a/packages/config/src/types.ts +++ b/packages/config/src/types.ts @@ -19,7 +19,7 @@ import { WorkloadTLSVersion, } from './constants'; -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule } from 'azion/types'; import { BuildOptions as ESBuildConfig, type Plugin as EsbuildPlugin } from 'esbuild'; import { Configuration as WebpackConfig, type WebpackPluginInstance as WebpackPlugin } from 'webpack'; @@ -122,7 +122,7 @@ export type AzionRuleCriteria = AzionRuleCriteriaWithValue | AzionRuleCriteriaWi /** * Request rule configuration for Azion. */ -export type AzionRequestRule = { +export type AzionRuntimeRequestRule = { /** Rule name */ name: string; /** Rule description */ @@ -253,7 +253,7 @@ export type AzionResponseRule = { */ export type AzionRules = { /** Request rules */ - request?: AzionRequestRule[]; + request?: AzionRuntimeRequestRule[]; /** Response rules */ response?: AzionResponseRule[]; }; @@ -567,7 +567,7 @@ export type PresetMetadata = { export interface AzionBuildPreset { config: AzionConfig; - handler?: (event: FetchEvent) => Promise; + handler?: AzionRuntimeModule; prebuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise; postbuild?: (config: BuildConfiguration, ctx: BuildContext) => Promise; metadata: PresetMetadata; diff --git a/packages/presets/src/presets/angular/handler.ts b/packages/presets/src/presets/angular/handler.ts index dc2e4a70..fec26907 100644 --- a/packages/presets/src/presets/angular/handler.ts +++ b/packages/presets/src/presets/angular/handler.ts @@ -1,18 +1,35 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountSPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountSPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @param {Object} env - The environment context containing Azion services. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountSPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/astro/handler.ts b/packages/presets/src/presets/astro/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/astro/handler.ts +++ b/packages/presets/src/presets/astro/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/docusaurus/handler.ts b/packages/presets/src/presets/docusaurus/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/docusaurus/handler.ts +++ b/packages/presets/src/presets/docusaurus/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/eleventy/handler.ts b/packages/presets/src/presets/eleventy/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/eleventy/handler.ts +++ b/packages/presets/src/presets/eleventy/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/emscripten/handler.ts b/packages/presets/src/presets/emscripten/handler.ts index 175924f6..33fb7a24 100644 --- a/packages/presets/src/presets/emscripten/handler.ts +++ b/packages/presets/src/presets/emscripten/handler.ts @@ -1,7 +1,8 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; +import metadata from './metadata'; interface WasmModule { - fetch_listener: (event: FetchEvent) => Promise; + fetch_listener: (request: AzionRuntimeRequest) => Promise; module: EmscriptenModule; } @@ -12,34 +13,52 @@ interface EmscriptenModule { let wasmPromise: Promise | null = null; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - if (!wasmPromise) { - wasmPromise = new Promise((resolve) => { - // @ts-expect-error - Module will be generated during build - import('./build/module').then((module: { cwrap: (arg0: string, arg1: string, arg2: string[]) => unknown }) => { - resolve({ - fetch_listener: module.cwrap('fetch_listener', 'string', ['object']), - module: module, - }); +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Emscripten WASM. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @param {Object} env - The environment context containing Azion services. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + if (!wasmPromise) { + wasmPromise = new Promise((resolve) => { + // @ts-expect-error - Module will be generated during build + import('./build/module').then( + (module: { cwrap: (arg0: string, arg1: string, arg2: string[]) => unknown }) => { + resolve({ + fetch_listener: module.cwrap('fetch_listener', 'string', ['object']), + module: module, + }); + }, + ); }); - }); - } - const wasmModule = (await wasmPromise) as WasmModule; + } + const wasmModule = (await wasmPromise) as WasmModule; - // Asyncfy transforms the call to fetch_listener into a promise. Therefore, - // we need to await the result. - const content = await wasmModule.fetch_listener(event); + // Asyncfy transforms the call to fetch_listener into a promise. Therefore, + // we need to await the result. + const content = await wasmModule.fetch_listener(request); - return new Response(content); - } catch (e) { - return new Response((e as Error).message || String(e), { status: 500 }); - } -} + return new Response(content); + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : String(e), + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/gatsby/handler.ts b/packages/presets/src/presets/gatsby/handler.ts index 8d9e07a7..b48977f3 100644 --- a/packages/presets/src/presets/gatsby/handler.ts +++ b/packages/presets/src/presets/gatsby/handler.ts @@ -1,18 +1,33 @@ -import { FetchEvent } from 'azion/types'; +import { AzionFetchModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; - +import metadata from './metadata'; /** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionFetchModule = { + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/hexo/handler.ts b/packages/presets/src/presets/hexo/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/hexo/handler.ts +++ b/packages/presets/src/presets/hexo/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/html/handler.ts b/packages/presets/src/presets/html/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/html/handler.ts +++ b/packages/presets/src/presets/html/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/hugo/handler.ts b/packages/presets/src/presets/hugo/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/hugo/handler.ts +++ b/packages/presets/src/presets/hugo/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/jekyll/handler.ts b/packages/presets/src/presets/jekyll/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/jekyll/handler.ts +++ b/packages/presets/src/presets/jekyll/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/next/handler.ts b/packages/presets/src/presets/next/handler.ts index ebc7623e..e76aed7b 100644 --- a/packages/presets/src/presets/next/handler.ts +++ b/packages/presets/src/presets/next/handler.ts @@ -1,5 +1,5 @@ /* eslint-disable */ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeCtx, AzionRuntimeRequest } from 'azion/types'; import { handleImageResizingRequest } from './default/handler/images.js'; import { adjustRequestForVercel } from './default/handler/routing/http.js'; import { handleRequest } from './default/handler/routing/index.js'; @@ -58,11 +58,12 @@ async function main(request: Request, env: Record, ctx: any) { } /** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. + * Handles the request. + * @param {AzionRuntimeRequest} request - The request. + * @param {AzionRuntimeCtx} ctx - The context. * @returns {Promise} The response for the request. */ -async function handlerDefault(event: FetchEvent): Promise { +async function handlerDefault(request: AzionRuntimeRequest, ctx: AzionRuntimeCtx): Promise { const env = { ASSETS: { fetch: getStorageAsset, @@ -70,21 +71,21 @@ async function handlerDefault(event: FetchEvent): Promise { }; const context = { - waitUntil: event.waitUntil.bind(event), + waitUntil: ctx.waitUntil, passThroughOnException: () => null, }; - const url = new URL(decodeURI(event.request.url)); - const request = new Request(url, event.request); + const url = new URL(decodeURI(request.url)); + const adjustedRequest = new Request(url, request); - return main(request, env, context); + return main(adjustedRequest, env, context); } -async function handler(event: FetchEvent): Promise { +async function handleFetch(request: AzionRuntimeRequest, ctx: AzionRuntimeCtx): Promise { if ((globalThis as any).bundler?.nextBuildStatic) { - return handlerStatic(event); + return handlerStatic.fetch(request); } - return handlerDefault(event); + return handlerDefault(request, ctx); } -export default handler; +export default { fetch: handleFetch }; diff --git a/packages/presets/src/presets/next/static/handler.js b/packages/presets/src/presets/next/static/handler.js index daa22991..22b8d624 100644 --- a/packages/presets/src/presets/next/static/handler.js +++ b/packages/presets/src/presets/next/static/handler.js @@ -1,17 +1,31 @@ import { mountMPA } from 'azion/utils/edge'; - /** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. + * Handles the request using Azion Workers pattern. + * @param {import('azion/types').AzionRuntimeRequest} request - The request object with metadata. + * @param {import('azion/types').AzionRuntimeCtx} ctx - The execution context. * @returns {Promise} The response for the request. */ -async function handler(event) { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 404 }); - } -} +const handler = { + fetch: async (request) => { + try { + const myApp = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount Next.js application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/nuxt/handler.ts b/packages/presets/src/presets/nuxt/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/nuxt/handler.ts +++ b/packages/presets/src/presets/nuxt/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/preact/handler.ts b/packages/presets/src/presets/preact/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/preact/handler.ts +++ b/packages/presets/src/presets/preact/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/qwik/handler.ts b/packages/presets/src/presets/qwik/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/qwik/handler.ts +++ b/packages/presets/src/presets/qwik/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/react/handler.ts b/packages/presets/src/presets/react/handler.ts index dc2e4a70..fec26907 100644 --- a/packages/presets/src/presets/react/handler.ts +++ b/packages/presets/src/presets/react/handler.ts @@ -1,18 +1,35 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountSPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountSPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @param {Object} env - The environment context containing Azion services. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountSPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/rustwasm/handler.ts b/packages/presets/src/presets/rustwasm/handler.ts index 292b683e..b7fb7cf9 100644 --- a/packages/presets/src/presets/rustwasm/handler.ts +++ b/packages/presets/src/presets/rustwasm/handler.ts @@ -1,29 +1,45 @@ -import { FetchEvent } from 'azion/types'; - +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; +import metadata from './metadata'; let wasmPromise: Promise | null = null; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - if (!wasmPromise) { - wasmPromise = fetch('./.wasm-bindgen/azion_rust_edge_function_bg.wasm') - .then((response) => response.arrayBuffer()) - .then(async (buffer) => { - // @ts-expect-error - Module will be generated during build - return import('./.wasm-bindgen/azion_rust_edge_function').then((module) => { - return module.default(buffer).then(() => module); +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Rust WASM. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @param {Object} env - The environment context containing Azion services. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + if (!wasmPromise) { + wasmPromise = fetch('./.wasm-bindgen/azion_rust_edge_function_bg.wasm') + .then((response) => response.arrayBuffer()) + .then(async (buffer) => { + // @ts-expect-error - Module will be generated during build + return import('./.wasm-bindgen/azion_rust_edge_function').then((module) => { + return module.default(buffer).then(() => module); + }); }); - }); + } + const WasmModule = (await wasmPromise) as { fetch_listener: (request: AzionRuntimeRequest) => Promise }; + return WasmModule.fetch_listener(request); + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : String(e), + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); } - const WasmModule = (await wasmPromise) as { fetch_listener: (event: FetchEvent) => Promise }; - return WasmModule.fetch_listener(event); - } catch (e) { - return new Response((e as Error).message || String(e), { status: 500 }); - } -} + }, +}; export default handler; diff --git a/packages/presets/src/presets/stencil/handler.ts b/packages/presets/src/presets/stencil/handler.ts index dc2e4a70..fec26907 100644 --- a/packages/presets/src/presets/stencil/handler.ts +++ b/packages/presets/src/presets/stencil/handler.ts @@ -1,18 +1,35 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountSPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountSPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @param {Object} env - The environment context containing Azion services. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountSPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/svelte/handler.ts b/packages/presets/src/presets/svelte/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/svelte/handler.ts +++ b/packages/presets/src/presets/svelte/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/vitepress/handler.ts b/packages/presets/src/presets/vitepress/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/vitepress/handler.ts +++ b/packages/presets/src/presets/vitepress/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/vue/handler.ts b/packages/presets/src/presets/vue/handler.ts index dc2e4a70..fec26907 100644 --- a/packages/presets/src/presets/vue/handler.ts +++ b/packages/presets/src/presets/vue/handler.ts @@ -1,18 +1,35 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountSPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountSPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @param {Object} env - The environment context containing Azion services. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountSPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/presets/src/presets/vuepress/handler.ts b/packages/presets/src/presets/vuepress/handler.ts index 8d9e07a7..c7e46112 100644 --- a/packages/presets/src/presets/vuepress/handler.ts +++ b/packages/presets/src/presets/vuepress/handler.ts @@ -1,18 +1,34 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeModule, AzionRuntimeRequest } from 'azion/types'; import { mountMPA } from 'azion/utils/edge'; +import metadata from './metadata'; -/** - * Handles the 'fetch' event. - * @param {import('azion/types').FetchEvent} event - The fetch event. - * @returns {Promise} The response for the request. - */ -async function handler(event: FetchEvent): Promise { - try { - const myApp = await mountMPA(event.request.url); - return myApp; - } catch (e) { - return new Response('Not Found', { status: 500 }); - } -} +const handler: AzionRuntimeModule = { + /** + * Handles the 'fetch' event using Azion Workers pattern. + * @param {Request} request - The request object with metadata. + * @param {Object} ctx - The execution context. + * @returns {Promise} The response for the request. + */ + fetch: async (request: AzionRuntimeRequest): Promise => { + try { + const myApp: Response = await mountMPA(request.url); + return myApp; + } catch (e) { + return new Response( + JSON.stringify({ + error: `Failed to mount ${metadata.name} application`, + message: e instanceof Error ? e.message : 'Unknown error occurred', + path: request.url, + }), + { + status: 500, + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + } + }, +}; export default handler; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index de15f036..f40c95b3 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -15,7 +15,7 @@ export namespace Azion { export interface StorageObject { arrayBuffer(): Promise; - metadata: Map; + AzionRuntimeRequestMetadata: Map; contentType: string; contentLength: number; } @@ -46,7 +46,7 @@ export namespace Azion { } } -export interface Metadata { +export interface AzionRuntimeRequestMetadata { // GeoIP geoip_asn: string; geoip_city: string; @@ -76,31 +76,62 @@ export interface Metadata { } /** - * Represents the FetchEvent interface. + * Base event interface for Azion */ -export interface FetchEvent extends Event { +export interface AzionFetchEvent extends Event { request: Request & { - metadata: Metadata; + AzionRuntimeRequestMetadata: AzionRuntimeRequestMetadata; }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - waitUntil(promise: Promise): void; - respondWith(response: Response | Promise): void; + waitUntil: (promise: Promise) => void; + respondWith: (response: Response | Promise) => void; } /** - * Represents the FirewallEvent interface. + * Firewall event interface */ -export interface FirewallEvent extends Event { - request: Request & { - headers: Headers; - metadata: Metadata; - }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - waitUntil(promise: Promise): void; - deny(): void; - drop(): void; - addRequestHeader(name: string, value: string): void; - addResponseHeader(name: string, value: string): void; - respondWith(response: Response | Promise): void; - continue(): void; +export interface AzionFirewallEvent extends AzionFetchEvent { + deny: () => void; + drop: () => void; + continue: () => void; +} + +/** + * Event listener type for fetch events + */ +export type FetchEventListener = (event: AzionFetchEvent, args?: Record) => void | Promise; + +/** + * Event listener type for firewall events + */ +export type FirewallEventListener = (event: AzionFirewallEvent, args?: Record) => void | Promise; +/** + * Base context for Azion modules + */ +export interface AzionRuntimeCtx { + waitUntil: (promise: Promise) => void; + args?: Record; +} + +/** + * Specific context for firewall modules + */ +export interface AzionRuntimeFirewallCtx extends AzionRuntimeCtx { + deny: () => void; + continue: () => void; + drop: () => void; +} + +/** + * Type for Azion request with metadata + */ +export type AzionRuntimeRequest = Request & { + metadata: AzionRuntimeRequestMetadata; +}; + +/** + * Generic module type that can handle any combination of fetch and firewall events + */ +export interface AzionRuntimeModule { + fetch?: (request: AzionRuntimeRequest, ctx: AzionRuntimeCtx, env?: null) => Promise; + firewall?: (request: AzionRuntimeRequest, ctx: AzionRuntimeCtx, env?: null) => Promise; } diff --git a/packages/utils/src/edge/parseRequest/parseRequest.test.ts b/packages/utils/src/edge/parseRequest/parseRequest.test.ts index 1d0cb19b..531f306e 100644 --- a/packages/utils/src/edge/parseRequest/parseRequest.test.ts +++ b/packages/utils/src/edge/parseRequest/parseRequest.test.ts @@ -1,9 +1,9 @@ -import { FetchEvent, Metadata } from 'azion/types'; +import { AzionRuntimeRequest, AzionRuntimeRequestMetadata } from 'azion/types'; import parseRequest from './parseRequest'; describe('parseRequest', () => { - let mockFetchEvent: FetchEvent; - let mockMetadata: Metadata; + let mockRequest: AzionRuntimeRequest; + let mockMetadata: AzionRuntimeRequestMetadata; beforeEach(() => { mockMetadata = { @@ -25,23 +25,21 @@ describe('parseRequest', () => { ssl_protocol: 'TLSv1.3', }; - mockFetchEvent = { - request: Object.assign( - new Request('https://example.com/path?query=value', { - method: 'GET', - headers: { - 'User-Agent': 'Mozilla/5.0', - 'X-Forwarded-For': '192.168.1.1', - Cookie: 'session=123; user=john', - }, - }), - { metadata: mockMetadata }, - ), - } as FetchEvent; + mockRequest = Object.assign( + new Request('https://example.com/path?query=value', { + method: 'GET', + headers: { + 'User-Agent': 'Mozilla/5.0', + 'X-Forwarded-For': '192.168.1.1', + Cookie: 'session=123; user=john', + }, + }), + { metadata: mockMetadata }, + ) as AzionRuntimeRequest; }); it('should parse a GET request correctly', async () => { - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result).toMatchObject({ method: 'GET', @@ -64,16 +62,16 @@ describe('parseRequest', () => { }); it('should handle POST requests with body', async () => { - mockFetchEvent.request = Object.assign( + mockRequest = Object.assign( new Request('https://example.com', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ key: 'value' }), }), { metadata: mockMetadata }, - ); + ) as AzionRuntimeRequest; - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.method).toBe('POST'); expect(result.body).toBe('{"key":"value"}'); @@ -81,30 +79,30 @@ describe('parseRequest', () => { }); it('should handle requests without cookies', async () => { - mockFetchEvent.request = Object.assign(new Request('https://example.com'), { metadata: mockMetadata }); + mockRequest = Object.assign(new Request('https://example.com'), { metadata: mockMetadata }) as AzionRuntimeRequest; - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.cookies).toEqual({}); }); it('should handle requests with authorization header', async () => { - mockFetchEvent.request = Object.assign( + mockRequest = Object.assign( new Request('https://example.com', { headers: { Authorization: 'Bearer token' }, }), { metadata: mockMetadata }, - ); + ) as AzionRuntimeRequest; - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.authorization).toBe('Present'); }); it('should handle requests without optional headers', async () => { - mockFetchEvent.request = Object.assign(new Request('https://example.com'), { metadata: mockMetadata }); + mockRequest = Object.assign(new Request('https://example.com'), { metadata: mockMetadata }) as AzionRuntimeRequest; - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.referer).toBe('Unknown'); expect(result.origin).toBe('Unknown'); @@ -119,32 +117,32 @@ describe('parseRequest', () => { }); it('should handle error when reading body', async () => { - mockFetchEvent.request = Object.assign( + mockRequest = Object.assign( new Request('https://example.com', { method: 'POST', body: 'test', }), { metadata: mockMetadata }, - ); + ) as AzionRuntimeRequest; // Mock the clone method to throw an error - mockFetchEvent.request.clone = jest.fn().mockImplementation(() => { + mockRequest.clone = jest.fn().mockImplementation(() => { throw new Error('Clone failed'); }); - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.body).toBe('Unable to read body'); }); it('should include metadata in the parsed request', async () => { - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.metadata).toEqual(mockMetadata); }); it('should correctly parse geoip information from metadata', async () => { - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.metadata.geoip_city).toBe('Sao Paulo'); expect(result.metadata.geoip_country_name).toBe('Brazil'); @@ -152,7 +150,7 @@ describe('parseRequest', () => { }); it('should correctly parse connection information from metadata', async () => { - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.metadata.remote_addr).toBe('192.168.1.1'); expect(result.metadata.remote_port).toBe('12345'); @@ -160,7 +158,7 @@ describe('parseRequest', () => { }); it('should correctly parse SSL information from metadata', async () => { - const result = await parseRequest(mockFetchEvent); + const result = await parseRequest(mockRequest); expect(result.metadata.ssl_cipher).toBe('TLS_AES_256_GCM_SHA384'); expect(result.metadata.ssl_protocol).toBe('TLSv1.3'); diff --git a/packages/utils/src/edge/parseRequest/parseRequest.ts b/packages/utils/src/edge/parseRequest/parseRequest.ts index e243137a..4d385da2 100644 --- a/packages/utils/src/edge/parseRequest/parseRequest.ts +++ b/packages/utils/src/edge/parseRequest/parseRequest.ts @@ -1,16 +1,16 @@ -import { FetchEvent } from 'azion/types'; +import { AzionRuntimeRequest } from 'azion/types'; import { ParsedRequest, ParseRequestFunction } from '../types'; /** * @function * @description The `parseRequest` function is designed to parse and log the details of an incoming request. - * This function extracts key information such as headers, cookies, body, and client data from the incoming FetchEvent, + * This function extracts key information such as headers, cookies, body, and client data from the incoming request, * providing a structured object with all these details for further processing or logging purposes. - * @param {FetchEvent} event - The incoming FetchEvent object representing the request. + * @param {AzionRuntimeRequest} request - The incoming request object with metadata. * @returns {Promise} A promise that resolves to an object containing detailed information about the request. * @example * // Parse a GET request - * // Input: parseRequest(event); + * // Input: parseRequest(request); * // Output: { * // timestamp: "2024-08-14T12:34:56.789Z", * // metadata: { @@ -49,8 +49,7 @@ import { ParsedRequest, ParseRequestFunction } from '../types'; * // authorization: "Not Present" * // } */ -const parseRequest: ParseRequestFunction = async (event: FetchEvent): Promise => { - const { request } = event; +const parseRequest: ParseRequestFunction = async (request: AzionRuntimeRequest): Promise => { const headers = new Headers(request.headers); const url = new URL(request.url); diff --git a/packages/utils/src/edge/types.ts b/packages/utils/src/edge/types.ts index f009e377..eb873c75 100644 --- a/packages/utils/src/edge/types.ts +++ b/packages/utils/src/edge/types.ts @@ -1,4 +1,4 @@ -import { FetchEvent, Metadata } from 'azion/types'; +import { AzionRuntimeRequest, AzionRuntimeRequestMetadata } from 'azion/types'; /** * Represents the request URL for the SSG or SPA. @@ -26,14 +26,14 @@ export type MountSPAFunction = (requestURL: RequestURL) => Promise; /** * Function that parses and logs the details of an incoming request. - * @param event - The incoming FetchEvent object. + * @param request - The incoming AzionRuntimeRequest object. * @returns A promise that resolves to the ParsedRequest object. */ -export type ParseRequestFunction = (event: FetchEvent) => Promise; +export type ParseRequestFunction = (request: AzionRuntimeRequest) => Promise; /** * Function that parses and logs the details of an incoming request. - * @param event - The incoming FetchEvent object. + * @param request - The incoming AzionRuntimeRequest object. * @returns A promise that resolves to the request details object. */ export type ParsedRequest = { @@ -64,5 +64,5 @@ export type ParsedRequest = { priority: string; host: string; authorization: string; - metadata: Metadata; + metadata: AzionRuntimeRequestMetadata; }; From b515d76af92bb388e3afee799a2508bfacfdc2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Fri, 6 Jun 2025 13:33:10 -0300 Subject: [PATCH 2/7] refactor: rm 'worker' build property --- README.md | 3 - packages/config/README.md | 2 - .../src/configProcessor/helpers/schema.ts | 4 - .../processConfig/index.test.ts | 2 +- packages/config/src/types.ts | 1 - packages/presets/src/presets/next/index.ts | 1 - packages/presets/src/types.ts | 81 +++++++++++++++++++ 7 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 packages/presets/src/types.ts diff --git a/README.md b/README.md index 96a22a48..d5eaf324 100644 --- a/README.md +++ b/README.md @@ -211,7 +211,6 @@ const config = { entry: './src/index.js', preset: 'react', polyfills: true, - worker: true, }, domain: { name: 'example.com', @@ -302,7 +301,6 @@ const config = defineConfig({ }, }, polyfills: true, - worker: true, extend: (config) => { // Customize bundler configuration return { @@ -394,7 +392,6 @@ export default defineConfig({ // Other build configurations entry: './src/index.ts', polyfills: true, - worker: true, memoryFS: { injectionDirs: ['./src/inject'], removePathPrefix: './src', diff --git a/packages/config/README.md b/packages/config/README.md index 66fe557e..6d43c94b 100644 --- a/packages/config/README.md +++ b/packages/config/README.md @@ -313,7 +313,6 @@ Type definition for the build configuration. - `preset?: string | AzionBuildPreset` - The preset to be used, can be a string or an AzionBuildPreset object. - `entry?: string | string[] | Record` - The entry file, can be a string, an array of strings, or an object. - `polyfills?: boolean` - Whether to include polyfills. -- `worker?: boolean` - Whether to build a worker. - `extend?: (context: T) => T` - Function to extend the bundler configuration. - `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - In-memory file system configuration. @@ -371,7 +370,6 @@ Type definition for the build configuration. - `setup: BundlerSetup` - Bundler configuration. - \*`bundler?: 'webpack' | 'esbuild'` - The bundler to be used. - `polyfills?: boolean` - Whether to include polyfills. -- `worker?: boolean` - Whether to build a worker. - `extend?: (context: T) => T` - Function to extend the bundler configuration. - `memoryFS?: { injectionDirs: string[], removePathPrefix: string }` - In-memory file system configuration. diff --git a/packages/config/src/configProcessor/helpers/schema.ts b/packages/config/src/configProcessor/helpers/schema.ts index 90d7e5b8..85079fbd 100644 --- a/packages/config/src/configProcessor/helpers/schema.ts +++ b/packages/config/src/configProcessor/helpers/schema.ts @@ -576,10 +576,6 @@ const azionConfigSchema = { type: 'boolean', errorMessage: "The 'build.polyfills' must be a boolean", }, - worker: { - type: 'boolean', - errorMessage: "The 'build.worker' must be a boolean", - }, extend: { instanceof: 'Function', errorMessage: "The 'build.extend' must be a function", diff --git a/packages/config/src/configProcessor/processConfig/index.test.ts b/packages/config/src/configProcessor/processConfig/index.test.ts index 9512a509..f506b7c7 100644 --- a/packages/config/src/configProcessor/processConfig/index.test.ts +++ b/packages/config/src/configProcessor/processConfig/index.test.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { processConfig } from '..'; -import { AzionConfig } from '../../config/types'; +import { AzionConfig } from '../../types'; describe('processConfig', () => { describe('Cache and Rules', () => { diff --git a/packages/config/src/types.ts b/packages/config/src/types.ts index fcf25d03..05ce379e 100644 --- a/packages/config/src/types.ts +++ b/packages/config/src/types.ts @@ -278,7 +278,6 @@ export interface AzionBuild T; memoryFS?: { injectionDirs: string[]; diff --git a/packages/presets/src/presets/next/index.ts b/packages/presets/src/presets/next/index.ts index 04b642d3..70feebe7 100644 --- a/packages/presets/src/presets/next/index.ts +++ b/packages/presets/src/presets/next/index.ts @@ -4,6 +4,5 @@ import handler from './handler'; import metadata from './metadata'; import postbuild from './postbuild'; import prebuild from './prebuild'; -``; export const next: AzionBuildPreset = { config, metadata, handler, prebuild, postbuild }; diff --git a/packages/presets/src/types.ts b/packages/presets/src/types.ts new file mode 100644 index 00000000..b311a4ba --- /dev/null +++ b/packages/presets/src/types.ts @@ -0,0 +1,81 @@ +/** + * Base context for Azion handlers. + * Provides common functionality like waitUntil for background tasks. + */ +export interface AzionBaseContext { + waitUntil: (promise: Promise) => void; + respondWith: (response: Response | Promise) => void; +} + +/** + * Firewall-specific context for Azion handlers. + * Extends the base context with firewall-specific actions. + */ +export interface AzionFirewallContext extends AzionBaseContext { + deny: () => void; // Deny the request + continue: () => void; // Continue processing the request + drop: () => void; // Drop the connection + addRequestHeader: (name: string, value: string) => void; + addResponseHeader: (name: string, value: string) => void; +} + +/** + * Request metadata interface + */ +export interface AzionRequestMetadata { + // GeoIP + geoip_asn: string; + geoip_city: string; + geoip_city_continent_code: string; + geoip_city_country_code: string; + geoip_city_country_name: string; + geoip_continent_code: string; + geoip_country_code: string; + geoip_country_name: string; + geoip_region: string; + geoip_region_name: string; + + // Remote + remote_addr: string; + remote_port: string; + remote_user: string; + + // Server + server_protocol: string; + + // TLS + ssl_cipher: string; + ssl_protocol: string; + + // Allows additional unspecified fields + [key: string]: string; +} + +/** + * Extended Request interface with Azion metadata + */ +export interface AzionRequest extends Request { + metadata: AzionRequestMetadata; +} + +/** + * Standard Azion handler interface. + * Used for regular request handling with fetch event. + */ +export interface AzionFetchHandler { + fetch: (request: AzionRequest, ctx: AzionBaseContext, env?: null) => Promise; +} + +/** + * Firewall-specific handler interface. + * Used for firewall rule processing. + */ +export interface AzionFirewallHandler { + firewall: (request: AzionRequest, ctx: AzionFirewallContext, env?: null) => Promise; +} + +/** + * Union type representing any valid Azion worker. + * Can be either a standard handler or a firewall handler. + */ +export type AzionWorker = AzionFetchHandler | AzionFirewallHandler; From f46a03663d88abc391702a13114109402af015d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Fri, 6 Jun 2025 14:27:52 -0300 Subject: [PATCH 3/7] fix(types): esm worker parameters --- packages/presets/src/presets/angular/handler.ts | 2 +- packages/presets/src/presets/astro/handler.ts | 1 + packages/presets/src/presets/docusaurus/handler.ts | 1 + packages/presets/src/presets/eleventy/handler.ts | 1 + packages/presets/src/presets/emscripten/handler.ts | 2 +- packages/presets/src/presets/hexo/handler.ts | 1 + packages/presets/src/presets/html/handler.ts | 1 + packages/presets/src/presets/hugo/handler.ts | 1 + packages/presets/src/presets/jekyll/handler.ts | 1 + packages/presets/src/presets/nuxt/handler.ts | 1 + packages/presets/src/presets/preact/handler.ts | 1 + packages/presets/src/presets/qwik/handler.ts | 1 + packages/presets/src/presets/react/handler.ts | 2 +- packages/presets/src/presets/rustwasm/handler.ts | 2 +- packages/presets/src/presets/stencil/handler.ts | 2 +- packages/presets/src/presets/svelte/handler.ts | 1 + packages/presets/src/presets/vitepress/handler.ts | 1 + packages/presets/src/presets/vue/handler.ts | 2 +- packages/presets/src/presets/vuepress/handler.ts | 1 + packages/types/src/index.ts | 4 ++-- 20 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/presets/src/presets/angular/handler.ts b/packages/presets/src/presets/angular/handler.ts index fec26907..11d4a413 100644 --- a/packages/presets/src/presets/angular/handler.ts +++ b/packages/presets/src/presets/angular/handler.ts @@ -6,8 +6,8 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. - * @param {Object} ctx - The execution context. * @param {Object} env - The environment context containing Azion services. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ fetch: async (request: AzionRuntimeRequest): Promise => { diff --git a/packages/presets/src/presets/astro/handler.ts b/packages/presets/src/presets/astro/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/astro/handler.ts +++ b/packages/presets/src/presets/astro/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/docusaurus/handler.ts b/packages/presets/src/presets/docusaurus/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/docusaurus/handler.ts +++ b/packages/presets/src/presets/docusaurus/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/eleventy/handler.ts b/packages/presets/src/presets/eleventy/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/eleventy/handler.ts +++ b/packages/presets/src/presets/eleventy/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/emscripten/handler.ts b/packages/presets/src/presets/emscripten/handler.ts index 33fb7a24..48118a35 100644 --- a/packages/presets/src/presets/emscripten/handler.ts +++ b/packages/presets/src/presets/emscripten/handler.ts @@ -17,8 +17,8 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Emscripten WASM. * @param {Request} request - The request object with metadata. - * @param {Object} ctx - The execution context. * @param {Object} env - The environment context containing Azion services. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ fetch: async (request: AzionRuntimeRequest): Promise => { diff --git a/packages/presets/src/presets/hexo/handler.ts b/packages/presets/src/presets/hexo/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/hexo/handler.ts +++ b/packages/presets/src/presets/hexo/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/html/handler.ts b/packages/presets/src/presets/html/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/html/handler.ts +++ b/packages/presets/src/presets/html/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/hugo/handler.ts b/packages/presets/src/presets/hugo/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/hugo/handler.ts +++ b/packages/presets/src/presets/hugo/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/jekyll/handler.ts b/packages/presets/src/presets/jekyll/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/jekyll/handler.ts +++ b/packages/presets/src/presets/jekyll/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/nuxt/handler.ts b/packages/presets/src/presets/nuxt/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/nuxt/handler.ts +++ b/packages/presets/src/presets/nuxt/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/preact/handler.ts b/packages/presets/src/presets/preact/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/preact/handler.ts +++ b/packages/presets/src/presets/preact/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/qwik/handler.ts b/packages/presets/src/presets/qwik/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/qwik/handler.ts +++ b/packages/presets/src/presets/qwik/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/react/handler.ts b/packages/presets/src/presets/react/handler.ts index fec26907..11d4a413 100644 --- a/packages/presets/src/presets/react/handler.ts +++ b/packages/presets/src/presets/react/handler.ts @@ -6,8 +6,8 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. - * @param {Object} ctx - The execution context. * @param {Object} env - The environment context containing Azion services. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ fetch: async (request: AzionRuntimeRequest): Promise => { diff --git a/packages/presets/src/presets/rustwasm/handler.ts b/packages/presets/src/presets/rustwasm/handler.ts index b7fb7cf9..d5085390 100644 --- a/packages/presets/src/presets/rustwasm/handler.ts +++ b/packages/presets/src/presets/rustwasm/handler.ts @@ -6,8 +6,8 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Rust WASM. * @param {Request} request - The request object with metadata. - * @param {Object} ctx - The execution context. * @param {Object} env - The environment context containing Azion services. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ fetch: async (request: AzionRuntimeRequest): Promise => { diff --git a/packages/presets/src/presets/stencil/handler.ts b/packages/presets/src/presets/stencil/handler.ts index fec26907..11d4a413 100644 --- a/packages/presets/src/presets/stencil/handler.ts +++ b/packages/presets/src/presets/stencil/handler.ts @@ -6,8 +6,8 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. - * @param {Object} ctx - The execution context. * @param {Object} env - The environment context containing Azion services. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ fetch: async (request: AzionRuntimeRequest): Promise => { diff --git a/packages/presets/src/presets/svelte/handler.ts b/packages/presets/src/presets/svelte/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/svelte/handler.ts +++ b/packages/presets/src/presets/svelte/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/vitepress/handler.ts b/packages/presets/src/presets/vitepress/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/vitepress/handler.ts +++ b/packages/presets/src/presets/vitepress/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/presets/src/presets/vue/handler.ts b/packages/presets/src/presets/vue/handler.ts index fec26907..11d4a413 100644 --- a/packages/presets/src/presets/vue/handler.ts +++ b/packages/presets/src/presets/vue/handler.ts @@ -6,8 +6,8 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. - * @param {Object} ctx - The execution context. * @param {Object} env - The environment context containing Azion services. + * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ fetch: async (request: AzionRuntimeRequest): Promise => { diff --git a/packages/presets/src/presets/vuepress/handler.ts b/packages/presets/src/presets/vuepress/handler.ts index c7e46112..5632b55b 100644 --- a/packages/presets/src/presets/vuepress/handler.ts +++ b/packages/presets/src/presets/vuepress/handler.ts @@ -6,6 +6,7 @@ const handler: AzionRuntimeModule = { /** * Handles the 'fetch' event using Azion Workers pattern. * @param {Request} request - The request object with metadata. + * @param {Object} env - The environment context containing Azion services. * @param {Object} ctx - The execution context. * @returns {Promise} The response for the request. */ diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index f40c95b3..944a6dcc 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -132,6 +132,6 @@ export type AzionRuntimeRequest = Request & { * Generic module type that can handle any combination of fetch and firewall events */ export interface AzionRuntimeModule { - fetch?: (request: AzionRuntimeRequest, ctx: AzionRuntimeCtx, env?: null) => Promise; - firewall?: (request: AzionRuntimeRequest, ctx: AzionRuntimeCtx, env?: null) => Promise; + fetch?: (request: AzionRuntimeRequest, env?: null, ctx?: AzionRuntimeCtx) => Promise; + firewall?: (request: AzionRuntimeRequest, env?: null, ctx?: AzionRuntimeCtx) => Promise; } From fc15bd5c0027c5ed5f0ddf3c377318dfb029a7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Fri, 6 Jun 2025 16:44:14 -0300 Subject: [PATCH 4/7] fix: schema message --- packages/config/src/configProcessor/helpers/schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/config/src/configProcessor/helpers/schema.ts b/packages/config/src/configProcessor/helpers/schema.ts index 85079fbd..9885d18d 100644 --- a/packages/config/src/configProcessor/helpers/schema.ts +++ b/packages/config/src/configProcessor/helpers/schema.ts @@ -1683,7 +1683,7 @@ const azionConfigSchema = { additionalProperties: false, errorMessage: { additionalProperties: - 'Config can only contain the following properties: build, edgeFunctions, edgeApplications, workloads, purge, edgefirewall, networkList, waf, edgeConnectors', + 'Config can only contain the following properties: build, edgeFunctions, edgeFirewall, edgeApplications, edgeConnectors, edgeStorage, workloads, purge, networkList and waf', type: 'Configuration must be an object', }, }, From 245097638ea88532c98d0b2aeb4839ba010a0e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Fri, 6 Jun 2025 16:45:17 -0300 Subject: [PATCH 5/7] fix: edgeStorage property key --- .../implementations/storageProcessConfigStrategy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/config/src/configProcessor/processStrategy/implementations/storageProcessConfigStrategy.ts b/packages/config/src/configProcessor/processStrategy/implementations/storageProcessConfigStrategy.ts index 849a84b0..6a572534 100644 --- a/packages/config/src/configProcessor/processStrategy/implementations/storageProcessConfigStrategy.ts +++ b/packages/config/src/configProcessor/processStrategy/implementations/storageProcessConfigStrategy.ts @@ -21,7 +21,7 @@ class StorageProcessConfigStrategy extends ProcessConfigStrategy { // eslint-disable-next-line @typescript-eslint/no-explicit-any transformToConfig(payload: any, transformedPayload: AzionConfig) { - const storageConfig = payload.storage; + const storageConfig = payload.edgeStorage; if (!Array.isArray(storageConfig) || storageConfig.length === 0) { return; } From af0e4aca6ea01bf7201c2d12d19fd510def8641d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Fri, 6 Jun 2025 16:50:52 -0300 Subject: [PATCH 6/7] fix: edge app modules operator --- .../edgeApplicationProcessConfigStrategy.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/config/src/configProcessor/processStrategy/implementations/application/edgeApplicationProcessConfigStrategy.ts b/packages/config/src/configProcessor/processStrategy/implementations/application/edgeApplicationProcessConfigStrategy.ts index fa68d78a..7d33f444 100644 --- a/packages/config/src/configProcessor/processStrategy/implementations/application/edgeApplicationProcessConfigStrategy.ts +++ b/packages/config/src/configProcessor/processStrategy/implementations/application/edgeApplicationProcessConfigStrategy.ts @@ -19,7 +19,7 @@ class EdgeApplicationProcessConfigStrategy extends ProcessConfigStrategy { active: app.active ?? true, debug: app.debug ?? false, modules: { - edge_cache_enabled: app.edgeCacheEnabled ?? true, + edge_cache_enabled: app.edgeCacheEnabled ?? false, edge_functions_enabled: app.edgeFunctionsEnabled ?? false, application_accelerator_enabled: app.applicationAcceleratorEnabled ?? false, image_processor_enabled: app.imageProcessorEnabled ?? false, @@ -52,15 +52,20 @@ class EdgeApplicationProcessConfigStrategy extends ProcessConfigStrategy { // eslint-disable-next-line @typescript-eslint/no-explicit-any transformedPayload.edgeApplications = payload.edgeApplications.map((app: any) => { + // Handle both formats: direct properties or nested in modules + const modules = app.modules || app; + return { name: app.name, active: app.active, debug: app.debug, - edgeCacheEnabled: app.edge_cache_enabled, - edgeFunctionsEnabled: app.edge_functions_enabled, - applicationAcceleratorEnabled: app.application_accelerator_enabled, - imageProcessorEnabled: app.image_processor_enabled, - tieredCacheEnabled: app.tiered_cache_enabled, + modules: { + edgeCacheEnabled: modules.edge_cache_enabled ?? false, + edgeFunctionsEnabled: modules.edge_functions_enabled ?? false, + applicationAcceleratorEnabled: modules.application_accelerator_enabled ?? false, + imageProcessorEnabled: modules.image_processor_enabled ?? false, + tieredCacheEnabled: modules.tiered_cache_enabled ?? false, + }, cache: app.cache_settings ? this.cacheStrategy.transformToConfig(app.cache_settings) : undefined, rules: app.rules ? this.rulesStrategy.transformToConfig(app.rules, transformedPayload) : undefined, }; From ed58e53f66643f76774f3372d9f8f79dff2678ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Narciso?= Date: Sat, 7 Jun 2025 18:18:41 -0300 Subject: [PATCH 7/7] fix: next.js preset handler --- packages/presets/src/presets/next/handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/presets/src/presets/next/handler.ts b/packages/presets/src/presets/next/handler.ts index e76aed7b..ab7e03af 100644 --- a/packages/presets/src/presets/next/handler.ts +++ b/packages/presets/src/presets/next/handler.ts @@ -81,11 +81,11 @@ async function handlerDefault(request: AzionRuntimeRequest, ctx: AzionRuntimeCtx return main(adjustedRequest, env, context); } -async function handleFetch(request: AzionRuntimeRequest, ctx: AzionRuntimeCtx): Promise { +async function handleFetch(request: AzionRuntimeRequest, env?: null, ctx?: AzionRuntimeCtx): Promise { if ((globalThis as any).bundler?.nextBuildStatic) { return handlerStatic.fetch(request); } - return handlerDefault(request, ctx); + return handlerDefault(request, ctx!); } export default { fetch: handleFetch };