@licensetorun/license-client
v1.1.0
Published
Node client for Licensetorun.com — activate, validate, swap and check updates for your licensed product.
Maintainers
Readme
Node License Client
A tiny Node client for Licensetorun.com. Works in any Node 18+ app (Express, Fastify, NestJS, an Electron main process, a CLI, …).
Install
npm install @licensetorun/license-clientUsage
import { LicenseClient } from '@licensetorun/license-client';
const license = new LicenseClient({
apiBase: 'https://licensetorun.com',
productId: 'PRODUCT-PUBLIC-UUID', // from the product page in the dashboard
licenseKey: 'CUSTOMER-KEY',
instance: 'customer-instance', // optional — defaults to os.hostname()
});
// Activate once (consumes a seat):
const activated = await license.activate();
if (!activated.ok) throw new Error(activated.body.message);
// Gate a feature:
if (await license.isValid()) {
// ...licensed feature...
}
// Move a seat to a new server:
await license.swap('old-server', 'new-server');
// Check for updates:
const update = await license.checkForUpdate('1.2.0');
if (update.body.update_available) {
console.log('New version:', update.body.version, update.body.download_url);
}Every method resolves to { ok, status, body } and never throws on network/HTTP
errors — a failed request comes back as { ok: false, body: { error: 'network_error' } }.
Express middleware example
function requireLicense(req, res, next) {
license.isValid()
.then((ok) => (ok ? next() : res.status(403).send('A valid license is required.')))
.catch(() => res.status(403).end());
}
app.use('/premium', requireLicense);Cache
isValid()yourself (e.g. for a few hours) if you call it on every request.
TypeScript
Type declarations ship with the package — no @types install needed. Everything
is fully typed:
import { LicenseClient, type LicenseResult } from '@licensetorun/license-client';
const license = new LicenseClient({ apiBase: 'https://licensetorun.com', productId: 'UUID', licenseKey: 'KEY' });
const res: LicenseResult = await license.validate();Notes
- ESM-only, Node 18+ (uses the global
fetch). In a CommonJS project, load it with a dynamicawait import('@licensetorun/license-client'). - Zero dependencies.
- Point
apiBaseathttps://licensetorun.comor at your self-hosted on-prem server.
MIT licensed.
