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 🙏

© 2025 – Pkg Stats / Ryan Hefner

sequential-wrapped-services

v1.1.1

Published

Runtime-agnostic wrapped services for sequential-runner (Google APIs, keystore, database, etc.)

Readme

tasker-wrapped-services

Runtime-agnostic HTTP service implementations for tasker-sequential. Run on Deno, Node.js, or Bun.

Overview

This package contains HTTP service implementations that wrap external APIs and core task execution:

  • deno-executor - Task execution runtime with automatic suspend/resume
  • simple-stack-processor - Processes pending service calls in FIFO order
  • task-executor - Task submission and lifecycle management
  • gapi - Google Workspace APIs (Gmail, Admin, etc.)
  • keystore - Secure credential storage
  • supabase - Database operation proxy
  • openai - OpenAI API integration
  • websearch - Web search integration
  • admin-debug - Debugging and administrative tools

Quick Start

Installation

npm install
# or
bun install

Start All Services

npm start
# Discovers and starts all available services automatically

Start Specific Services

npm start -- --services deno-executor,gapi,keystore

Custom Port

npm start -- --port 3100
# Services: 3100, 3101, 3102, ...

Force Runtime

npm start -- --deno
npm start -- --node
npm start -- --bun

Architecture

Each service implements a standard HTTP handler interface:

export async function handler(req: Request): Promise<Response> {
  // Handle incoming request
  // Call other services via HTTP
  // Return result
}

Services communicate via HTTP (no direct imports):

task-executor → deno-executor → gapi/keystore/supabase
     ↓              ↓
   HTTP         HTTP chains

Service Discovery

The CLI automatically:

  1. Scans services/ directory
  2. Finds folders with index.ts or index.js
  3. Assigns sequential ports starting from base port
  4. Creates .service-registry.json with service endpoints

Registry example:

{
  "timestamp": "2025-10-27T15:00:00Z",
  "services": [
    {"name": "deno-executor", "port": 3100, "url": "http://localhost:3100"},
    {"name": "gapi", "port": 3101, "url": "http://localhost:3101"}
  ]
}

Adding a New Service

  1. Create services/{name}/ directory
  2. Add index.ts with HTTP handler:
import { serve } from "https://deno.land/[email protected]/http/server.ts";

export async function handler(req: Request): Promise<Response> {
  return new Response(JSON.stringify({success: true}), {
    headers: {"Content-Type": "application/json"}
  });
}

if (import.meta.main) {
  const port = parseInt(Deno.env.get("PORT") || "3000");
  serve(handler, { port });
}
  1. CLI automatically discovers and starts it

Deployment

Local Development

npm start

Supabase Edge Functions

Services can be wrapped as Supabase edge functions:

# Copy service code to Supabase functions directory
cp -r services/deno-executor supabase/functions/
supabase functions deploy deno-executor

Docker

FROM denoland/deno:latest
COPY . /app
WORKDIR /app
CMD ["deno", "run", "--allow-all", "services/deno-executor/index.ts"]

Kubernetes

Each service as separate deployment with environment-based port assignment.

Configuration

Services respect standard environment variables:

PORT=3100                    # HTTP port (overridden by CLI)
DEBUG=true                   # Enable debug logging
SERVICE_NAME=deno-executor   # Service identifier
SUPABASE_URL=...            # Supabase project URL
OPENAI_API_KEY=...          # OpenAI API key
GAPI_KEY=...                # Google API credentials

Development

Hot Reload with Deno

deno run --allow-all --allow-env --watch services/deno-executor/index.ts

Debug Mode

npm start -- --debug

Test Individual Service

curl http://localhost:3100/health

Service Registry API

All services expose:

  • GET /health - Health check
  • POST /call - Service call (varies by service)

Integration with tasker-sequential

Services are used by tasker-sequential core:

  1. Task submitted to task-executor
  2. task-executor calls deno-executor to run task code
  3. deno-executor calls wrapped services via HTTP
  4. Results returned and task continues

Documentation

Requirements

  • Deno 1.40+ (for Deno runtime)
  • Node.js 18+ (for Node runtime)
  • Bun 1.0+ (for Bun runtime)

License

MIT

Contributing

Issues and PRs welcome on GitHub: https://github.com/AnEntrypoint/tasker-wrapped-services