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

@bloonio/auth-relay-angular

v0.1.1

Published

Angular passkeys (FIDO2/WebAuthn) SDK for Bloonio tenant web apps — username-less sign-in, enrollment, and device management against the tenant backend's /auth/webauthn/* endpoints.

Readme

@bloonio/auth-relay-angular

Angular passkeys (FIDO2/WebAuthn) SDK for Bloonio tenant web apps. It runs the browser passkey ceremony via @simplewebauthn/browser and drives the tenant backend's /auth/webauthn/* endpoints — username-less sign-in, enrollment, and device management ("Mes appareils").

  • Same surface as the Flutter SDK (@bloonio/auth_passkeys): register, signIn, signInWithHint, list, rename, revoke, isSupported.
  • No WebAuthn library types leak — the ceremony lives behind a swappable PasskeyCeremony; the public API is plain value objects + typed errors.
  • Plugs into your existing auth: the browser sets Origin; your app's HttpClient interceptor attaches the bearer/XSRF; sign-in returns a PasskeySession identical to password login.

Install

npm install @bloonio/auth-relay-angular @simplewebauthn/browser

Configure

Standalone (Angular 14+):

import { provideBloonioPasskeys } from '@bloonio/auth-relay-angular';

bootstrapApplication(AppComponent, {
  providers: [
    provideHttpClient(withInterceptors([authInterceptor])),
    provideBloonioPasskeys({
      apiBaseUrl: 'https://api.example.com/api/v1',     // tenant backend
      onSession: (s) => security.storeSession(s),       // persist like password login
    }),
  ],
});

NgModule apps: imports: [BloonioAuthRelayModule.forRoot({ apiBaseUrl: '…/api/v1' })].

Sign in (login page)

Use the button component:

<bloonio-passkey-sign-in-button (succeeded)="onSession($event)" (failed)="onError($event)" />

…or call the service directly (≤5 lines):

const passkeys = inject(BloonioPasskeyService);
const session = await passkeys.signIn();              // username-less
// or: await passkeys.signInWithHint('[email protected]');
// session.accessToken / refreshToken / user — also delivered to onSession.

Enroll + manage

await passkeys.register({ deviceLabel: 'Mon ordinateur' }); // needs sign-in + paired authenticator
const devices = await passkeys.list();
await passkeys.rename(devices[0].credentialRef, 'MacBook');
await passkeys.revoke(devices[0].credentialRef);

Drop-in device-management screen (French "Mes appareils") for the profile area:

{ path: 'passkeys', component: PasskeyDevicesComponent }

Graceful degradation

if (!(await passkeys.isSupported())) { /* show password/OTP */ }

try {
  await passkeys.signIn();
} catch (e) {
  if (e instanceof PasskeyCancelledError) { /* user dismissed */ }
  else if (e instanceof PasskeyNoCredentialError) { /* nothing enrolled here */ }
  else if (e instanceof PasskeyUnsupportedError) { /* old browser */ }
  else if (e instanceof PasskeyPairingRequiredError) { /* pair authenticator first */ }
  else if (e instanceof PasskeyRateLimitedError) { /* back off (e.retryAfterSeconds) */ }
  else { /* PasskeyFailedError */ }
}

Every error is a PasskeyError subtype (also discriminable via .kind).

Localization

UI copy defaults to French (DEFAULT_PASSKEY_STRINGS). Override any subset at config level (strings) or per component ([strings] input) — no i18n framework required.

API

| Member | Purpose | |---|---| | provideBloonioPasskeys(config) / BloonioAuthRelayModule.forRoot(config) | wiring | | BloonioPasskeyService | register / signIn / signInWithHint / list / rename / revoke / isSupported | | PasskeyDevicesComponent | <bloonio-passkey-devices> — "Mes appareils" | | PasskeySignInButtonComponent | <bloonio-passkey-sign-in-button> — login button | | PasskeyCeremony / SimpleWebAuthnCeremony | swappable ceremony seam | | PasskeySession / PasskeyDevice / PasskeyRegistration / PasskeyUser | models | | PasskeyError (+ subtypes) | typed errors |

Platform / domain setup

Passkeys require the bloonio.com relying-party association to be live (served by the relay — see bloonio_auth_relay/PASSKEY_ONBOARDING.md). The web app must be served from an https://*.bloonio.com origin that the relay's webauthn_origins allowlist includes. This SDK pairs with the M1-hardened auth_api verify (UV required, sign-count regression, soft-revoke) and the M2 .well-known files.

Build

npm run build        # ng-packagr → dist/auth-relay-angular

Requires Angular ≥17, @simplewebauthn/browser ≥13.