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

@wincc-oa/wui-shared

v1.2.2

Published

WinCC Open Architecture Dashboard project.

Readme

WinCCOA WebComponent Dashboard

This package is part of the workspace for the WinCC Open Architecture WebComponent Dashboard, built using Lit and managed with Nx.

Usage information and reference details can be found in the WinCC OA documentation.

wui-cleanup-service

The wui-cleanup-service provides centralized resource cleanup during application lifecycle events such as user logout, session timeout, or application shutdown. It automatically discovers cleanable services and executes registered cleanup handlers.

The cleanup service follows a two-phase cleanup approach:

  1. Service Discovery: Automatically finds services extending WuiCleanableService
  2. Handler Execution: Runs registered cleanup handlers for custom cleanup logic

Creating a Cleanable Service

import { WuiCleanableService } from '@wincc-oa/wui-shared/services/wui-cleanup/wui-cleanable-service.abstract.js';
import { singleton } from 'tsyringe';

@singleton()
export class UserSessionService extends WuiCleanableService {
  /**
   * Performs service-specific cleanup operations.
   * Called automatically during application lifecycle cleanup.
   *
   * @returns Promise resolving to true if cleanup succeeded
   */
  async cleanup(): Promise<boolean> {
    try {
      localStorage.removeItem('userSession');
      sessionStorage.removeItem('tempData');

      console.log('UserSessionService cleanup completed');
      return true;
    } catch (error) {
      console.error('UserSessionService cleanup failed:', error);
      return false;
    }
  }
}

Handler Registration

Register custom cleanup handlers for operations that don't fit into service cleanup:

NOTE!

All registered handlers are removed after cleanup.

import { WuiCleanupService } from '@wincc-oa/wui-shared/services/wui-cleanup/wui-cleanup.service.js';
import { container } from 'tsyringe';

/**
 * Registers various cleanup handlers for different application resources.
 */
export function registerApplicationCleanupHandlers(): void {
  const cleanupService = container.resolve<WuiCleanupService>(WuiCleanupService);

  // Handler with no arguments - simple cache clearing
  cleanupService.registerCleanupHandler(async () => {
    console.log('Clearing application localStorage');
    localStorage.clear();
  });

  // Async handler
  cleanupService.registerCleanupHandler(
    async (userId: string, sessionId: string) => {
      await fetch('/api/cleanup', {
        body: JSON.stringify({ userId, sessionId }),
        headers: { 'Content-Type': 'application/json' }
      });
    },
    ['current-user-id', 'current-session-id']
  );
}

// Register handlers during application initialization
registerApplicationCleanupHandlers();

Executing Cleanup

import { WuiCleanupService } from '@wincc-oa/wui-shared/services/wui-cleanup/wui-cleanup.service.js';
import { container } from 'tsyringe';

/**
 * Executes cleanup during user logout.
 * Discovers and cleans up all registered services and handlers.
 */
export async function handleUserLogout(): Promise<void> {
  const cleanupService = container.resolve<WuiCleanupService>(WuiCleanupService);

  try {
    const cleanupSuccess = await cleanupService.cleanup();

    if (cleanupSuccess) {
      console.log('Logout cleanup completed successfully');
      // Redirect to login page
      window.location.href = '/login';
    } else {
      console.warn('Some cleanup operations failed during logout');
      // Handle partial cleanup failure
    }
  } catch (error) {
    console.error('Critical error during logout cleanup:', error);
  }
}

License

MIT