1.0.17 • Published 6 months ago

@rbxts/router v1.0.17

Weekly downloads
-
License
ISC
Repository
-
Last release
6 months ago

Router

📦 Types

type RouteContext<T = unknown> = {
	player: Player;
	payload: T;
	meta?: {
		route: string;
		timestamp: number;
		[key: string]: unknown;
	};
};

type RouteHandler<T = unknown> = (ctx: RouteContext<T>) => unknown;

type MiddlewareResult =
	| { continue: true }
	| { continue: false; error: string; code?: number };

type Middleware = (ctx: RouteContext) => MiddlewareResult;

type RegisteredRoute<T = unknown> = {
	name: string;
	schema?: (value: unknown) => boolean | [boolean, string?];
	handler: RouteHandler<T>;
	middleware?: Middleware[];
};

🛠 Route Example

import { t } from "@rbxts/t";
import {
	defineRoute,
	handleRoute,
	registerRoute,
	registerRoutes,
} from "rest-core";

const ExampleSchema = t.interface({
	name: t.string,
	age: t.number,
});

registerRoute(
	defineRoute(ExampleSchema, {
		name: "example_1",
		handler: ({ payload }) => {
			print(payload.name);
		},
	}),
);

registerRoutes("example_2", [
	defineRoute(ExampleSchema, {
		name: "check age",
		handler: ({ payload }) => {
			print(payload.age);
		},
	}),
	defineRoute(ExampleSchema, {
		name: "create",
		handler: ({ payload }) => {
			print(payload); // { age: 10, name: "test" }
		},
	}),
]);

handleRoute("example_2:create", game.GetService("Players").LocalPlayer, {
	age: 10,
	name: "test",
});

🧩 Middleware

rest-core supports both global and per-route middleware, giving you control over authentication, permissions, rate limiting, logging, and more.


✅ Global Middleware

Use use() to register middleware that runs on every route:

import { use } from "rest-core";

use((ctx) => {
	print(`[ROUTER] ${ctx.meta?.route} called by ${ctx.player.Name}`);
	return { continue: true };
});

✅ Route-Specific Middleware

Apply middleware to individual routes:

import { defineRoute, registerRoute, success } from "rest-core";
import { t } from "@rbxts/t";
import { requireAuth } from "rest-core";

const ProfileSchema = t.interface({});

registerRoute(
	defineRoute(ProfileSchema, {
		name: "profile:get",
		middleware: [requireAuth],
		handler: ({ player }) => {
			return success({ username: player.Name });
		},
	}),
);

✅ Create Custom Middleware

Write your own checks using the RouteContext:

export function requireRole(role: string): Middleware {
	return (ctx) => {
		const userRole = ctx.player.GetAttribute("role");
		return userRole === role
			? { continue: true }
			: { continue: false, error: "Forbidden", code: 403 };
	};
}

Use it like this:

middleware: [requireRole("admin")]

1.0.17

6 months ago

1.0.16

6 months ago

1.0.15

6 months ago

1.0.14

6 months ago

1.0.13

6 months ago

1.0.11

6 months ago

1.0.10

6 months ago

1.0.9

6 months ago

1.0.8

6 months ago

1.0.7

6 months ago

1.0.6

6 months ago

1.0.5

6 months ago

1.0.4

6 months ago

1.0.3

6 months ago

1.0.2

6 months ago

1.0.1

6 months ago

1.0.0

6 months ago