{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/tech/in-flight-token-refresh-deep-dive/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Walecloud.me","siteUrl":"https://walecloud.me"}},"markdownRemark":{"excerpt":"This is the implementation companion to Engineering Judgement at Scale: Building a Multi-Tenant Integration Platform for Enterprise APIs. That article covers…","html":"<p>This is the implementation companion to <a href=\"/tech/shared-api-platform-token-storms/\">Engineering Judgement at Scale: Building a Multi-Tenant Integration Platform for Enterprise APIs</a>. That article covers the platform decision and operating model. This article focuses on the code, invariants, tests, and trade-offs behind the token refresh design.</p>\n<h2>The contract</h2>\n<p>The component answers one question under concurrency:</p>\n<blockquote>\n<p>Give me a token that will still be valid when it reaches the upstream service for tenant T.</p>\n</blockquote>\n<p>Four invariants define correct behaviour:</p>\n<ol>\n<li>A returned token must be valid when it reaches the upstream, not merely when the cache reads it.</li>\n<li>At most one refresh may be in flight for a tenant.</li>\n<li>A cache hit must perform no I/O and acquire no lock.</li>\n<li>A failed refresh must leave clean state so the next caller can try again.</li>\n</ol>\n<p>These invariants are more useful than comments about individual lines. They state what must remain true after the implementation changes.</p>\n<h2>State is isolated by tenant</h2>\n<p>Each tenant owns one entry:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">accessToken</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">expiresAt</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">refreshInFlight</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">credentialSource</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The entries live in a map keyed by a validated tenant ID:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> tokenStore <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getEntry</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">tenantId</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> entry <span class=\"token operator\">=</span> tokenStore<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>entry<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    entry <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">accessToken</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">expiresAt</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">refreshInFlight</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">credentialSource</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n    tokenStore<span class=\"token punctuation\">.</span><span class=\"token function\">set</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">,</span> entry<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> entry\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">expiresAt</code> is an absolute timestamp. Compute it once from the lifetime returned by the authorisation server:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">entry<span class=\"token punctuation\">.</span>expiresAt <span class=\"token operator\">=</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> expiresIn <span class=\"token operator\">*</span> <span class=\"token number\">1000</span></code></pre></div>\n<p>Do not hardcode the token lifetime. Providers can change it. A hardcoded thirty-minute lifetime paired with a fifteen-minute token creates a silent outage window.</p>\n<p><code class=\"language-text\">refreshInFlight</code> stores a promise rather than a boolean. A boolean only tells callers that work exists. A promise gives them the exact work to await.</p>\n<h2>Expire the token early</h2>\n<p>A token can pass a local check and expire during serialisation, network transit, upstream queueing, or a retry. Test whether it will remain alive after a safety window:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token constant\">DEFAULT_EXPIRY_SKEW_MS</span> <span class=\"token operator\">=</span> <span class=\"token number\">2</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">isTokenValid</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">tenantId<span class=\"token punctuation\">,</span> expirySkewMs <span class=\"token operator\">=</span> <span class=\"token constant\">DEFAULT_EXPIRY_SKEW_MS</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> entry <span class=\"token operator\">=</span> tokenStore<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>entry<span class=\"token operator\">?.</span>accessToken <span class=\"token operator\">||</span> <span class=\"token operator\">!</span>entry<span class=\"token punctuation\">.</span>expiresAt<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span>\n\n  <span class=\"token keyword\">return</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> expirySkewMs <span class=\"token operator\">&lt;</span> entry<span class=\"token punctuation\">.</span>expiresAt\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The skew should exceed the p99 upstream latency plus the retry budget. A two-minute skew on a thirty-minute token gives up about 6.7% of its life to remove the rollover race.</p>\n<p>Make the skew a parameter. A long operation can request more headroom, and tests can move the boundary without mutating module state.</p>\n<h2>The single-flight critical section</h2>\n<p>The refresh path is small:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">getValidTokenDetails</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span>\n  <span class=\"token parameter\">tenantId<span class=\"token punctuation\">,</span>\n  expirySkewMs <span class=\"token operator\">=</span> <span class=\"token constant\">DEFAULT_EXPIRY_SKEW_MS</span></span>\n<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isTokenValid</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">,</span> expirySkewMs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> entry <span class=\"token operator\">=</span> tokenStore<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">token</span><span class=\"token operator\">:</span> entry<span class=\"token punctuation\">.</span>accessToken<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">credentialSource</span><span class=\"token operator\">:</span> entry<span class=\"token punctuation\">.</span>credentialSource<span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">tokenCacheHit</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> entry <span class=\"token operator\">=</span> <span class=\"token function\">getEntry</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>entry<span class=\"token punctuation\">.</span>refreshInFlight<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    entry<span class=\"token punctuation\">.</span>refreshInFlight <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">await</span> <span class=\"token function\">fetchAuthToken</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> entry<span class=\"token punctuation\">.</span>accessToken\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n        entry<span class=\"token punctuation\">.</span>refreshInFlight <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">const</span> token <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> entry<span class=\"token punctuation\">.</span>refreshInFlight\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    token<span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">credentialSource</span><span class=\"token operator\">:</span> entry<span class=\"token punctuation\">.</span>credentialSource<span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">tokenCacheHit</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The fast path is a map lookup and timestamp comparison. It has no network call, promise allocation, or mutex.</p>\n<p>The critical section is the check followed by the assignment:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>entry<span class=\"token punctuation\">.</span>refreshInFlight<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  entry<span class=\"token punctuation\">.</span>refreshInFlight <span class=\"token operator\">=</span> <span class=\"token function\">createRefreshPromise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In a single-threaded event loop, nothing else runs between those statements because there is no <code class=\"language-text\">await</code>. The check and publication act as one uninterrupted operation.</p>\n<p>Do not insert awaited work between them:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>entry<span class=\"token punctuation\">.</span>refreshInFlight<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">await</span> <span class=\"token function\">recordMetric</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"token.refresh.start\"</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// Breaks the guarantee</span>\n  entry<span class=\"token punctuation\">.</span>refreshInFlight <span class=\"token operator\">=</span> <span class=\"token function\">createRefreshPromise</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>That one change lets concurrent callers pass the check before any caller publishes its promise. The token storm returns.</p>\n<p>The promise is the coordination handle. The first caller creates it. Later callers await the same promise. Only callers on the refresh path touch it.</p>\n<h2>Always release in <code class=\"language-text\">finally</code></h2>\n<p>This line is essential:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">finally</span> <span class=\"token punctuation\">{</span>\n  entry<span class=\"token punctuation\">.</span>refreshInFlight <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Without it, a failed refresh leaves a rejected promise in the entry. Every later caller awaits the same old rejection. One brief network error then lasts until the process restarts.</p>\n<p><code class=\"language-text\">finally</code> clears the handle on success and failure. The next request after a failure gets a clean attempt.</p>\n<p>Do not add negative caching by default. A fixed failure window can lock out a tenant after a short partner blip. If failures cause harmful retry amplification, add explicit bounded backoff with metrics.</p>\n<h2>Fetch without leaking secrets</h2>\n<p>The fetch function resolves credentials for one tenant and stores the token only after a successful response:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">fetchAuthToken</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">async</span> <span class=\"token parameter\">tenantId</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> credentialDetails <span class=\"token operator\">=</span> <span class=\"token function\">resolveCredentialDetails</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>credentialDetails<span class=\"token operator\">?.</span>credentials<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    log<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> tenantId <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"No credentials resolved\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> response <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> <span class=\"token function\">requestToken</span><span class=\"token punctuation\">(</span>credentialDetails<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>response<span class=\"token punctuation\">.</span>status <span class=\"token operator\">!==</span> <span class=\"token number\">200</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      log<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> tenantId<span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">status</span><span class=\"token operator\">:</span> response<span class=\"token punctuation\">.</span>status <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Token fetch failed\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">const</span> entry <span class=\"token operator\">=</span> <span class=\"token function\">getEntry</span><span class=\"token punctuation\">(</span>tenantId<span class=\"token punctuation\">)</span>\n    entry<span class=\"token punctuation\">.</span>accessToken <span class=\"token operator\">=</span> response<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>access_token\n    entry<span class=\"token punctuation\">.</span>expiresAt <span class=\"token operator\">=</span> Date<span class=\"token punctuation\">.</span><span class=\"token function\">now</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> response<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>expires_in <span class=\"token operator\">*</span> <span class=\"token number\">1000</span>\n    entry<span class=\"token punctuation\">.</span>credentialSource <span class=\"token operator\">=</span> credentialDetails<span class=\"token punctuation\">.</span>credentialSource\n\n    <span class=\"token keyword\">return</span> entry<span class=\"token punctuation\">.</span>accessToken\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    log<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> tenantId<span class=\"token punctuation\">,</span> error <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Token fetch failed\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Authentication failure is an expected operating condition. Returning <code class=\"language-text\">null</code> lets the caller produce a deliberate <code class=\"language-text\">401</code> instead of leaking an opaque <code class=\"language-text\">500</code>.</p>\n<p>Never log credentials or tokens. Log the tenant, credential source label, cache-hit state, response status, and outcome.</p>\n<h2>Bound the key space</h2>\n<p>An in-memory map grows for every new key. Tenant identity must be validated against an allowlist before it reaches the cache.</p>\n<p>If the key comes from an unchecked header, user ID, or customer value, an attacker can fill memory by sending unique values. Validate against a known tenant set or use a bounded least-recently-used cache.</p>\n<p>Per-tenant state also contains failure. Bad credentials for tenant A must not stall or invalidate the token for tenant B.</p>\n<h2>Warm-up must not control readiness</h2>\n<p>Fetching a token when an instance starts can remove latency from its first request. It must remain optional:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">instance<span class=\"token punctuation\">.</span><span class=\"token function\">addHook</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"onReady\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">await</span> instance<span class=\"token punctuation\">.</span>tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">fetchAuthToken</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span>error<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    instance<span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span>\n      <span class=\"token punctuation\">{</span> error <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      <span class=\"token string\">\"Token warm-up failed; first request will retry\"</span>\n    <span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Never make service readiness depend on a third party. If partner authentication is down during deployment, instances should still start and serve work that does not need that partner.</p>\n<h2>Test the concurrency guarantee</h2>\n<p>Use a delayed mock to keep the race window open:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"uses one refresh for concurrent callers\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">async</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  httpClient<span class=\"token punctuation\">.</span><span class=\"token function\">mockImplementation</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n      <span class=\"token keyword\">new</span> <span class=\"token class-name\">Promise</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">resolve</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>okResponse<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span>\n\n  <span class=\"token keyword\">const</span> tokens <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> Promise<span class=\"token punctuation\">.</span><span class=\"token function\">all</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>\n    tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">getValidToken</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">getValidToken</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">getValidToken</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>tokens<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toEqual</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token constant\">TOKEN</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">TOKEN</span><span class=\"token punctuation\">,</span> <span class=\"token constant\">TOKEN</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>httpClient<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toHaveBeenCalledTimes</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The call-count assertion proves the invariant. Equal return values alone do not. Three separate refreshes can return the same mocked token.</p>\n<p>An immediate mock may also hide a broken race through lucky scheduling. The delay makes the test meaningful.</p>\n<h2>Test both sides of the expiry boundary</h2>\n<p>Pin the clock with fake timers:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">jest<span class=\"token punctuation\">.</span><span class=\"token function\">useFakeTimers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\njest<span class=\"token punctuation\">.</span><span class=\"token function\">setSystemTime</span><span class=\"token punctuation\">(</span>now<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">await</span> tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">fetchAuthToken</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 30-minute token</span>\n\njest<span class=\"token punctuation\">.</span><span class=\"token function\">setSystemTime</span><span class=\"token punctuation\">(</span>now <span class=\"token operator\">+</span> <span class=\"token number\">10</span> <span class=\"token operator\">*</span> <span class=\"token number\">60_000</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">isTokenValid</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span>\n\njest<span class=\"token punctuation\">.</span><span class=\"token function\">setSystemTime</span><span class=\"token punctuation\">(</span>now <span class=\"token operator\">+</span> <span class=\"token number\">29</span> <span class=\"token operator\">*</span> <span class=\"token number\">60_000</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">isTokenValid</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>The last assertion is the purpose of the skew. The token is technically alive at minute twenty-nine, but it does not have enough life left for safe use.</p>\n<p>Also test recovery after failure:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">httpClient<span class=\"token punctuation\">.</span><span class=\"token function\">mockRejectedValueOnce</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"network\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">getValidToken</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBeNull</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\nhttpClient<span class=\"token punctuation\">.</span><span class=\"token function\">mockResolvedValueOnce</span><span class=\"token punctuation\">(</span>okResponse<span class=\"token punctuation\">)</span>\n<span class=\"token function\">expect</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">await</span> tokenCache<span class=\"token punctuation\">.</span><span class=\"token function\">getValidToken</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TENANT</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toBe</span><span class=\"token punctuation\">(</span><span class=\"token constant\">TOKEN</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Removing the <code class=\"language-text\">finally</code> cleanup should make this test fail.</p>\n<h2>When process-local state is the wrong choice</h2>\n<p>This design keeps one token per active tenant per service instance. Use fleet-wide coordination instead when:</p>\n<ul>\n<li>The provider charges for each token.</li>\n<li>Issuing a token invalidates the prior token.</li>\n<li>Token life is so short that refresh is almost constant.</li>\n<li>A strict cap limits active tokens.</li>\n<li>Refresh state must survive process restarts.</li>\n</ul>\n<p>In those cases, a shared cache and distributed lock may earn their cost. They also add a network hop, another outage source, secret storage risk, and an operational runbook.</p>\n<p>The coordination cost should not exceed the value of the work being coordinated.</p>\n<h2>Ship checklist</h2>\n<ul>\n<li>No <code class=\"language-text\">await</code> exists between the in-flight check and assignment.</li>\n<li>The in-flight handle is released in <code class=\"language-text\">finally</code>.</li>\n<li>Expiry is absolute and derived from the provider response.</li>\n<li>The skew exceeds p99 latency plus the retry budget.</li>\n<li>Tenant keys are validated or the cache is bounded.</li>\n<li>Tokens and credentials never reach logs.</li>\n<li>Warm-up failure never blocks readiness.</li>\n<li>State and failures are isolated per tenant.</li>\n<li>A delayed concurrency test asserts one upstream call.</li>\n<li>Clock tests cover both sides of the skew boundary.</li>\n<li>A failed refresh can recover without a restart.</li>\n</ul>\n<p>The implementation is small because it solves the correct problem. Token refresh looks like caching, but the dangerous edge is concurrency at expiry. Name that edge correctly, and the design becomes one shared promise, an early-expiry check, and careful cleanup.</p>","frontmatter":{"title":"Single-Flight Token Refresh: A Technical Deep Dive","publishedDate":"2026-08-31T18:05:00.000Z","updatedDate":null,"displayDate":"August 31, 2026","featuredImage":null,"description":"How to implement, test, and operate a tenant-aware single-flight token cache with early expiry, clean failure recovery, and no lock on the hot path.","category":["tech","software-engineering"],"tags":["APIs","Concurrency","JavaScript","Platform Engineering","Tokens"]},"fields":{"slug":"/in-flight-token-refresh-deep-dive/"}},"previous":{"fields":{"slug":"/shared-api-platform-token-storms/"},"frontmatter":{"title":"Engineering Judgement at Scale: Building a Multi-Tenant Integration Platform for Enterprise APIs","category":["tech","engineering-leadership"]}},"next":null},"pageContext":{"id":"43b7e360-6e40-5f38-8227-19ee02a8f9b9","previousPostId":"2cfd8b8e-4f8e-5c42-adae-c224139ee40f","nextPostId":null,"categoryRaw":"tech","categoryNormalized":"tech","slug":"/tech/in-flight-token-refresh-deep-dive/"}},
    "staticQueryHashes": ["1166631048","1324386404"]}