npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@posadskiy/account-client

v1.2.0

Published

Browser session client for auth-service and user-service. The access token stays in memory. The refresh token stays in an httpOnly cookie.

Readme

@posadskiy/account-client

Browser session client for auth-service and user-service.

The access token stays in memory. The refresh token stays in the httpOnly cookie that auth-service sets for browser requests. This package never writes that cookie. In a browser it never sends refresh_token in a request body (see Native apps below).

import { AccountClient } from '@posadskiy/account-client';
import { AccountProvider, RequireAuth, useSession } from '@posadskiy/account-client/react';

const client = new AccountClient({
  authUrl: 'https://api.posadskiy.com/auth',
  userUrl: 'https://api.posadskiy.com/user',
});

function App() {
  return (
    <AccountProvider client={client}>
      <RequireAuth fallback={<p>Sign in</p>}>
        <Home />
      </RequireAuth>
    </AccountProvider>
  );
}

function Home() {
  const session = useSession();
  return <p>{session.userId}</p>;
}

refresh() posts { grant_type: "refresh_token" } to /oauth/token with credentials: "include". Concurrent callers share that request. A 401 on an authenticated call refreshes once and retries once. logout() posts to /logout with the cookie and clears the memory session even when the request fails.

Use acceptTokens(body) for a token response fetched outside the client, such as an OAuth finalize call.

Native apps

auth-service treats a request without Sec-Fetch-* headers as native. It sends no cookie and returns refresh_token in the JSON body. A Capacitor app with CapacitorHttp enabled looks native, because its requests go through iOS networking.

Pass a refreshTokenStore backed by the Keychain (or the platform equivalent) in that case:

const client = new AccountClient({
  authUrl,
  userUrl,
  refreshTokenStore: Capacitor.isNativePlatform() ? keychainStore : undefined,
});

With a store, the client saves refresh_token from every token response, sends it in the body of /oauth/token and /logout, and clears it when auth-service rejects it or on logout. Do not set a store in a browser: auth-service rejects a body token from a browser.