@@ -4,6 +4,7 @@ import invariant from "invariant";
44import { deserializeActorKey , serializeActorKey } from "@/actor/keys" ;
55import { generateRandomString } from "@/actor/utils" ;
66import type { ClientConfig } from "@/client/client" ;
7+ import type { MetadataResponse } from "@/common/router" ;
78import { noopNext , stringifyError } from "@/common/utils" ;
89import type {
910 ActorOutput ,
@@ -32,6 +33,7 @@ import {
3233} from "./api-endpoints" ;
3334import { EngineApiError , getEndpoint } from "./api-utils" ;
3435import { logger } from "./log" ;
36+ import { lookupMetadataCached } from "./metadata" ;
3537import { createWebSocketProxy } from "./ws-proxy" ;
3638
3739// TODO:
@@ -48,9 +50,6 @@ import { createWebSocketProxy } from "./ws-proxy";
4850// };
4951// })();
5052
51- // Global cache to store metadata check promises for each endpoint
52- const metadataCheckCache = new Map < string , Promise < void > > ( ) ;
53-
5453export class RemoteManagerDriver implements ManagerDriver {
5554 #config: ClientConfig ;
5655 #metadataPromise: Promise < void > | undefined ;
@@ -63,64 +62,38 @@ export class RemoteManagerDriver implements ManagerDriver {
6362 logger ( ) . info (
6463 "detected next.js build phase, disabling health check" ,
6564 ) ;
66- runConfig . disableHealthCheck = true ;
65+ runConfig . disableMetadataLookup = true ;
6766 }
6867
69- this . #config = runConfig ;
68+ // Clone config so we can mutate the endpoint in #metadataPromise
69+ // NOTE: This is a shallow clone, so mutating nested properties will not do anything
70+ this . #config = { ...runConfig } ;
7071
7172 // Perform metadata check if enabled
72- if ( ! runConfig . disableHealthCheck ) {
73- this . #metadataPromise = this . #performMetadataCheck( runConfig ) ;
74- this . #metadataPromise. catch ( ( error ) => {
75- logger ( ) . error ( {
76- msg : "metadata check failed" ,
77- error :
78- error instanceof Error ? error . message : String ( error ) ,
79- } ) ;
80- } ) ;
81- }
82- }
83-
84- async #performMetadataCheck( config : ClientConfig ) : Promise < void > {
85- const endpoint = getEndpoint ( config ) ;
86-
87- // Check if metadata check is already in progress or completed for this endpoint
88- const existingPromise = metadataCheckCache . get ( endpoint ) ;
89- if ( existingPromise ) {
90- return existingPromise ;
91- }
92-
93- // Create and store the promise immediately to prevent racing requests
94- const metadataCheckPromise = ( async ( ) => {
95- try {
96- const metadataData = await getMetadata ( config ) ;
73+ if ( ! runConfig . disableMetadataLookup ) {
74+ // This should never error, since it uses pRetry. If it does for
75+ // any reason, we'll surface the error anywhere #metadataPromise is
76+ // awaited.
77+ this . #metadataPromise = lookupMetadataCached ( this . #config) . then (
78+ ( metadataData ) => {
79+ // Override endpoint for all future requests
80+ if ( metadataData . clientEndpoint ) {
81+ this . #config. endpoint = metadataData . clientEndpoint ;
82+ logger ( ) . info ( {
83+ msg : "overriding cached client endpoint" ,
84+ endpoint : metadataData . clientEndpoint ,
85+ } ) ;
86+ }
9787
98- if ( metadataData . clientEndpoint ) {
9988 logger ( ) . info ( {
100- msg : "received new client endpoint from metadata" ,
101- endpoint : metadataData . clientEndpoint ,
89+ msg : "connected to rivetkit manager" ,
90+ runtime : metadataData . runtime ,
91+ version : metadataData . version ,
92+ runner : metadataData . runner ,
10293 } ) ;
103- this . #config. endpoint = metadataData . clientEndpoint ;
104- }
105-
106- // Log successful metadata check with runtime and version info
107- logger ( ) . info ( {
108- msg : "connected to rivetkit manager" ,
109- runtime : metadataData . runtime ,
110- version : metadataData . version ,
111- runner : metadataData . runner ,
112- } ) ;
113- } catch ( error ) {
114- logger ( ) . error ( {
115- msg : "health check failed, validate the Rivet endpoint is configured correctly" ,
116- endpoint,
117- error : stringifyError ( error ) ,
118- } ) ;
119- }
120- } ) ( ) ;
121-
122- metadataCheckCache . set ( endpoint , metadataCheckPromise ) ;
123- return metadataCheckPromise ;
94+ } ,
95+ ) ;
96+ }
12497 }
12598
12699 async getForId ( {
0 commit comments