rbac-library (1.0.2)

Published 2026-01-27 15:25:18 +00:00 by otmatas

Installation

registry=
npm install rbac-library@1.0.2
"rbac-library": "1.0.2"

About this package

@otmatas/rbac

A TypeScript Role-Based Access Control (RBAC) plugin for ElysiaJS with DrizzleORM and PostgreSQL.

Features

  • 🔒 Easy Integration - Simple one-line setup with ElysiaJS
  • High Performance - LRU cache with 30-second TTL
  • 🔄 Auto Permissions - Automatically populates permissions from routes
  • 📊 Multiple Roles - Users can have multiple roles
  • 🎯 Flexible - Roles can have multiple permissions
  • 🗃️ PostgreSQL - Uses DrizzleORM for database operations

Installation

From Git (Bun)

bun add git+https://git.otmatas.com/otmatas/rbac-library.git

From Git (npm/pnpm)

npm install git+https://git.otmatas.com/otmatas/rbac-library.git
# or
pnpm add git+https://git.otmatas.com/otmatas/rbac-library.git

Quick Start (Code)

import { Elysia } from "elysia";
import { rbac } from "rbac-library";

const app = new Elysia()
  .use(await rbac({
    connectionString: process.env.DATABASE_URL || "postgres://user:pass@localhost:5432/mydb",
    getUserId: (ctx) => ctx.headers["x-user-id"] || null,
    excludePaths: ["/health", "/auth/*"],
  }))
  .get("/health", () => "OK")
  .get("/api/users", () => "Users list")
  .post("/api/users", () => "Create user")
  .listen(3000);

console.log("Server running on http://localhost:3000");

Quick Start (Docker)

To run your application with PostgreSQL using Docker Compose, create the following files:

1. Dockerfile

FROM oven/bun:latest

WORKDIR /app

COPY package.json bun.lock ./
RUN bun install

COPY . .

EXPOSE 3000

CMD ["bun", "run", "index.ts"]

2. docker-compose.yml

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: "postgres://postgres:password@db:5432/rbac_db"
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: rbac_db
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

Then run:

docker compose up --build

Configuration

Option Type Default Description
connectionString string required PostgreSQL connection string
getUserId (ctx) => string | null required Extract user ID from request
excludePaths string[] [] Paths to skip RBAC checks (supports wildcards)
autoPopulate boolean true Auto-populate permissions from routes
cacheTTL number 30000 Cache TTL in milliseconds

Database Tables

The package automatically creates these tables on initialization:

  • rbac_users - User accounts
  • rbac_roles - Role definitions
  • rbac_permissions - Permission definitions
  • rbac_paths - Registered paths/routes
  • rbac_user_roles - User-Role assignments
  • rbac_role_permissions - Role-Permission assignments
  • rbac_path_permissions - Path-Permission requirements

Managing Roles & Permissions

import {
  createRole,
  createPermission,
  createUser,
  assignRoleToUser,
  assignPermissionToRole,
  assignPermissionToPath,
  getOrCreatePath,
  getRBACDatabase,
} from "rbac-library";

const db = getRBACDatabase();

// Create a role
const adminRoleId = await createRole(db, "admin", "Administrator role");

// Create a permission
const permissionId = await createPermission(db, "users:read", "Read users");

// Assign permission to role
await assignPermissionToRole(db, adminRoleId, permissionId);

// Create user and assign role
const userId = await createUser(db, "admin@example.com", "hashedPassword");
await assignRoleToUser(db, userId, adminRoleId);

// Link permission to a path
const pathId = await getOrCreatePath(db, "GET", "/api/users");
await assignPermissionToPath(db, pathId, permissionId);

Cache Management

import { clearCache, invalidateUserCache, invalidatePathCache } from "rbac-library";

// Clear all cached permissions
clearCache();

// Invalidate cache for a specific user (after role change)
invalidateUserCache("user-id");

// Invalidate cache for a specific path
invalidatePathCache("GET", "/api/users");

Using the Schema Directly

import { schema } from "rbac-library";

// Use with your own Drizzle queries
const allUsers = await db.select().from(schema.users);

Testing

bun test

License

MIT

Repository

https://git.otmatas.com/otmatas/rbac-library

Dependencies

Dependencies

ID Version
drizzle-orm ^0.45.1
elysia ^1.4.22
lru-cache ^11.2.5
postgres ^3.4.8

Development dependencies

ID Version
@types/bun ^1.3.6
drizzle-kit ^0.31.8

Peer dependencies

ID Version
elysia >=1.0.0
typescript ^5

Keywords

rbac role-based-access-control elysia elysiajs drizzle drizzle-orm postgres authorization permissions bun
Details
npm
2026-01-27 15:25:18 +00:00
1
otmatas
MIT
latest
76 KiB
Assets (1)
Versions (3) View all
1.0.2 2026-01-27
1.0.1 2026-01-27
1.0.0 2026-01-27