Architecture
Providers
Providers are the boot layer of a Netpress application.
They register services, load config, attach middleware, and mount routes in a predictable order. If you want to understand how a Netpress app starts, providers are the place to look.
Why Providers Matter
Without providers, boot logic usually gets scattered across:
- route files
- random startup modules
- framework entry files
- one-off infrastructure helpers
Providers keep that setup in one predictable place.
Provider Shape
import { ServiceProvider } from "@admicaa/netpress";
export default class PaymentServiceProvider extends ServiceProvider {
static deferred = true;
static provides = ["payments.stripe"];
async register() {
// bind services, load config, keep it cheap
}
async boot() {
// optional startup side effects
}
}
register() vs boot()
register()is for bindings and lightweight setupboot()is for side effects and runtime wiring- deferred providers skip
boot()until their services are first resolved
This is what lets Netpress stay modular and lazy-loaded.
Common Provider Responsibilities
- bind services into the container
- load config
- register auth guards
- mount routes
- configure mail, queue, storage, cache, and events
Starter Providers
The starter app includes providers with clear responsibilities:
| Provider | Responsibility |
|---|---|
AppServiceProvider | global middleware, response helpers, shared runtime setup |
DatabaseServiceProvider | shared database runtime and models |
AuthServiceProvider | auth guards and optional OAuth setup |
MailServiceProvider | deferred mail system |
QueueServiceProvider | deferred queue runtime |
EventServiceProvider | events and observers |
RouteServiceProvider | web and API routes |
Example: Custom Provider
import { ServiceProvider } from "@admicaa/netpress";
import Stripe from "stripe";
export default class PaymentServiceProvider extends ServiceProvider {
static deferred = true;
static provides = ["payments.stripe"];
async register() {
this.app.container.bind("payments.stripe", () => {
return new Stripe(process.env.STRIPE_SECRET_KEY);
});
}
}
Then add it to bootstrap/providers.js.
Good Provider Rules
- keep
register()cheap - keep infrastructure wiring out of controllers
- use deferred providers for expensive systems
- place providers in a clear dependency order
For the lazy-loading model behind providers, read Hybrid Bootstrap.