Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions typescript/packages/core/src/server/x402ResourceServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,16 @@ export class x402ResourceServer {
return this;
}

/**
* Check if an extension is registered.
*
* @param key - The extension key
* @returns True if the extension is registered
*/
hasExtension(key: string): boolean {
return this.registeredExtensions.has(key);
}

/**
* Enriches declared extensions using registered extension hooks.
*
Expand Down
5 changes: 3 additions & 2 deletions typescript/packages/http/express/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,10 @@ export function paymentMiddleware(
// httpServer.initialize() fetches facilitator support and validates routes
let initPromise: Promise<void> | null = syncFacilitatorOnStart ? httpServer.initialize() : null;

// Dynamically register bazaar extension if routes declare it
// Dynamically register bazaar extension if routes declare it and not already registered
// Skip if pre-registered (e.g., in serverless environments where static imports are used)
let bazaarPromise: Promise<void> | null = null;
if (checkIfBazaarNeeded(routes)) {
if (checkIfBazaarNeeded(routes) && !server.hasExtension("bazaar")) {
bazaarPromise = import("@x402/extensions/bazaar")
.then(({ bazaarResourceServerExtension }) => {
server.registerExtension(bazaarResourceServerExtension);
Expand Down
5 changes: 3 additions & 2 deletions typescript/packages/http/hono/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,10 @@ export function paymentMiddleware(
// httpServer.initialize() fetches facilitator support and validates routes
let initPromise: Promise<void> | null = syncFacilitatorOnStart ? httpServer.initialize() : null;

// Dynamically register bazaar extension if routes declare it
// Dynamically register bazaar extension if routes declare it and not already registered
// Skip if pre-registered (e.g., in serverless environments where static imports are used)
let bazaarPromise: Promise<void> | null = null;
if (checkIfBazaarNeeded(routes)) {
if (checkIfBazaarNeeded(routes) && !server.hasExtension("bazaar")) {
bazaarPromise = import("@x402/extensions/bazaar")
.then(({ bazaarResourceServerExtension }) => {
server.registerExtension(bazaarResourceServerExtension);
Expand Down
10 changes: 6 additions & 4 deletions typescript/packages/http/next/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,10 @@ export function paymentProxy(
) {
const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);

// Dynamically register bazaar extension if routes declare it
// Dynamically register bazaar extension if routes declare it and not already registered
// Skip if pre-registered (e.g., in serverless environments where static imports are used)
let bazaarPromise: Promise<void> | null = null;
if (checkIfBazaarNeeded(routes)) {
if (checkIfBazaarNeeded(routes) && !server.hasExtension("bazaar")) {
bazaarPromise = import(/* webpackIgnore: true */ "@x402/extensions/bazaar")
.then(({ bazaarResourceServerExtension }) => {
server.registerExtension(bazaarResourceServerExtension);
Expand Down Expand Up @@ -220,9 +221,10 @@ export function withX402<T = unknown>(
const routes = { "*": routeConfig };
const { httpServer, init } = createHttpServer(routes, server, paywall, syncFacilitatorOnStart);

// Dynamically register bazaar extension if route declares it
// Dynamically register bazaar extension if route declares it and not already registered
// Skip if pre-registered (e.g., in serverless environments where static imports are used)
let bazaarPromise: Promise<void> | null = null;
if (checkIfBazaarNeeded(routes)) {
if (checkIfBazaarNeeded(routes) && !server.hasExtension("bazaar")) {
bazaarPromise = import(/* webpackIgnore: true */ "@x402/extensions/bazaar")
.then(({ bazaarResourceServerExtension }) => {
server.registerExtension(bazaarResourceServerExtension);
Expand Down