From eef98b105eb675e6b8254906098f14d56c79e814 Mon Sep 17 00:00:00 2001 From: Dean Mauro Date: Fri, 12 Dec 2025 00:07:00 -0500 Subject: [PATCH 1/5] Add getOAuthHelpers method for initializing env.OAUTH_PROVIDER outside of a fetch call --- src/oauth-provider.ts | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/oauth-provider.ts b/src/oauth-provider.ts index 84e6870..12f6d79 100644 --- a/src/oauth-provider.ts +++ b/src/oauth-provider.ts @@ -780,6 +780,19 @@ export class OAuthProvider { fetch(request: Request, env: any, ctx: ExecutionContext): Promise { return this.#impl.fetch(request, env, ctx); } + + /** + * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set + * This is a getter property that returns a function, allowing it to be accessed like a normal class member + * without being exposed as an RPC method. + * @param env - Cloudflare Worker environment variables + * @returns An instance of OAuthHelpers + */ + get getOAuthHelpers(): (env: any) => OAuthHelpers { + return (env: any) => { + return this.#impl.getOAuthHelpers(env); + }; + } } /** @@ -990,9 +1003,7 @@ class OAuthProviderImpl { } // Inject OAuth helpers into env if not already present - if (!env.OAUTH_PROVIDER) { - env.OAUTH_PROVIDER = this.createOAuthHelpers(env); - } + this.getOAuthHelpers(env); // Call the default handler based on its type // Note: We don't add CORS headers to default handler responses @@ -2242,9 +2253,7 @@ class OAuthProviderImpl { } // Inject OAuth helpers into env if not already present - if (!env.OAUTH_PROVIDER) { - env.OAUTH_PROVIDER = this.createOAuthHelpers(env); - } + this.getOAuthHelpers(env); // Find the appropriate API handler for this URL const url = new URL(request.url); @@ -2276,6 +2285,18 @@ class OAuthProviderImpl { return new OAuthHelpersImpl(env, this); } + /** + * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set + * @param env - Cloudflare Worker environment variables + * @returns An instance of OAuthHelpers + */ + getOAuthHelpers(env: any): OAuthHelpers { + if (!env.OAUTH_PROVIDER) { + env.OAUTH_PROVIDER = this.createOAuthHelpers(env); + } + return env.OAUTH_PROVIDER; + } + /** * Saves a grant to KV with appropriate TTL based on expiration * @param env - The environment bindings From d289be59a152ab23b90227fb66c72ed6508ddbee Mon Sep 17 00:00:00 2001 From: Dean Mauro Date: Fri, 12 Dec 2025 21:40:08 -0500 Subject: [PATCH 2/5] Switch from getter to symbol --- src/oauth-provider.ts | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/oauth-provider.ts b/src/oauth-provider.ts index 12f6d79..53110da 100644 --- a/src/oauth-provider.ts +++ b/src/oauth-provider.ts @@ -753,6 +753,11 @@ export interface GrantSummary { expiresAt?: number; } +/** + * Private Symbol used to access the getOAuthHelpers function from OAuthProvider + */ +const getOAuthHelpersSymbol = Symbol('getOAuthHelpers'); + /** * OAuth 2.0 Provider implementation for Cloudflare Workers * Implements authorization code flow with support for refresh tokens @@ -782,19 +787,26 @@ export class OAuthProvider { } /** - * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set - * This is a getter property that returns a function, allowing it to be accessed like a normal class member - * without being exposed as an RPC method. + * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set. + * This method uses a Symbol as its name, which prevents it from being exposed as an RPC method * @param env - Cloudflare Worker environment variables * @returns An instance of OAuthHelpers */ - get getOAuthHelpers(): (env: any) => OAuthHelpers { - return (env: any) => { - return this.#impl.getOAuthHelpers(env); - }; + [getOAuthHelpersSymbol](env: any): OAuthHelpers { + return this.#impl.getOAuthHelpers(env); } } +/** + * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set + * @param provider - The OAuthProvider instance + * @param env - Cloudflare Worker environment variables + * @returns An instance of OAuthHelpers + */ +export function getOAuthHelpers(provider: OAuthProvider, env: any): OAuthHelpers { + return provider[getOAuthHelpersSymbol](env); +} + /** * Implementation class backing OAuthProvider. * From bcc5be630dd82d2b5370e33d6ebf7f5d9e769e00 Mon Sep 17 00:00:00 2001 From: Dean Mauro Date: Fri, 26 Dec 2025 22:40:07 -0500 Subject: [PATCH 3/5] Refactor getOAuthHelpers to use oauthprovider options instead of oauthprovider instance --- src/oauth-provider.ts | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/oauth-provider.ts b/src/oauth-provider.ts index 53110da..23bc633 100644 --- a/src/oauth-provider.ts +++ b/src/oauth-provider.ts @@ -753,11 +753,6 @@ export interface GrantSummary { expiresAt?: number; } -/** - * Private Symbol used to access the getOAuthHelpers function from OAuthProvider - */ -const getOAuthHelpersSymbol = Symbol('getOAuthHelpers'); - /** * OAuth 2.0 Provider implementation for Cloudflare Workers * Implements authorization code flow with support for refresh tokens @@ -785,26 +780,17 @@ export class OAuthProvider { fetch(request: Request, env: any, ctx: ExecutionContext): Promise { return this.#impl.fetch(request, env, ctx); } - - /** - * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set. - * This method uses a Symbol as its name, which prevents it from being exposed as an RPC method - * @param env - Cloudflare Worker environment variables - * @returns An instance of OAuthHelpers - */ - [getOAuthHelpersSymbol](env: any): OAuthHelpers { - return this.#impl.getOAuthHelpers(env); - } } /** - * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set - * @param provider - The OAuthProvider instance + * Gets OAuthHelpers for the given environment + * @param options - Configuration options for the OAuth provider * @param env - Cloudflare Worker environment variables * @returns An instance of OAuthHelpers */ -export function getOAuthHelpers(provider: OAuthProvider, env: any): OAuthHelpers { - return provider[getOAuthHelpersSymbol](env); +export function getOAuthHelpers(options: OAuthProviderOptions, env: any): OAuthHelpers { + const impl = new OAuthProviderImpl(options); + return impl.getOAuthHelpers(env); } /** From 8a99ee6961bfd777a86be79be23f09b869d69269 Mon Sep 17 00:00:00 2001 From: Dean Mauro Date: Fri, 26 Dec 2025 22:44:36 -0500 Subject: [PATCH 4/5] Disconnect env.OAUTH_PROVIDER from getOAuthHelpers method --- src/oauth-provider.ts | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/oauth-provider.ts b/src/oauth-provider.ts index 23bc633..46622cb 100644 --- a/src/oauth-provider.ts +++ b/src/oauth-provider.ts @@ -790,7 +790,7 @@ export class OAuthProvider { */ export function getOAuthHelpers(options: OAuthProviderOptions, env: any): OAuthHelpers { const impl = new OAuthProviderImpl(options); - return impl.getOAuthHelpers(env); + return impl.createOAuthHelpers(env); } /** @@ -1001,7 +1001,9 @@ class OAuthProviderImpl { } // Inject OAuth helpers into env if not already present - this.getOAuthHelpers(env); + if (!env.OAUTH_PROVIDER) { + env.OAUTH_PROVIDER = this.createOAuthHelpers(env); + } // Call the default handler based on its type // Note: We don't add CORS headers to default handler responses @@ -2251,7 +2253,9 @@ class OAuthProviderImpl { } // Inject OAuth helpers into env if not already present - this.getOAuthHelpers(env); + if (!env.OAUTH_PROVIDER) { + env.OAUTH_PROVIDER = this.createOAuthHelpers(env); + } // Find the appropriate API handler for this URL const url = new URL(request.url); @@ -2279,22 +2283,10 @@ class OAuthProviderImpl { * @param env - Cloudflare Worker environment variables * @returns An instance of OAuthHelpers */ - private createOAuthHelpers(env: any): OAuthHelpers { + public createOAuthHelpers(env: any): OAuthHelpers { return new OAuthHelpersImpl(env, this); } - /** - * Gets OAuthHelpers for the given environment, setting env.OAUTH_PROVIDER if not already set - * @param env - Cloudflare Worker environment variables - * @returns An instance of OAuthHelpers - */ - getOAuthHelpers(env: any): OAuthHelpers { - if (!env.OAUTH_PROVIDER) { - env.OAUTH_PROVIDER = this.createOAuthHelpers(env); - } - return env.OAUTH_PROVIDER; - } - /** * Saves a grant to KV with appropriate TTL based on expiration * @param env - The environment bindings From a210ce5f88e299495a8c081d191831cedf34578b Mon Sep 17 00:00:00 2001 From: Dean Mauro Date: Fri, 26 Dec 2025 22:52:05 -0500 Subject: [PATCH 5/5] Rename to getOAuthApi --- src/oauth-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/oauth-provider.ts b/src/oauth-provider.ts index 46622cb..b40239c 100644 --- a/src/oauth-provider.ts +++ b/src/oauth-provider.ts @@ -788,7 +788,7 @@ export class OAuthProvider { * @param env - Cloudflare Worker environment variables * @returns An instance of OAuthHelpers */ -export function getOAuthHelpers(options: OAuthProviderOptions, env: any): OAuthHelpers { +export function getOAuthApi(options: OAuthProviderOptions, env: any): OAuthHelpers { const impl = new OAuthProviderImpl(options); return impl.createOAuthHelpers(env); }