Initial public commit
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// Runtime helper: "Is this install licensed?" — call from `main.ts` before
|
||||
// you start your app's main process, so the app can refuse to boot (or boot
|
||||
// in a reduced-functionality trial mode) when no valid key is present.
|
||||
//
|
||||
// This never touches the network — only the signature. The offline check is
|
||||
// what you want at startup: nothing on the internet should be able to keep
|
||||
// the buyer's app from starting if the key is legitimate.
|
||||
|
||||
import { Verifier, PublicKey, type VerifyOk } from '@keysat/licensing-client'
|
||||
import { ISSUER_PUBKEY_PEM, PRODUCT_SLUG } from './config'
|
||||
|
||||
export interface LicenseGateResult {
|
||||
licensed: boolean
|
||||
/** Populated if licensed === true. */
|
||||
details?: VerifyOk
|
||||
/** Populated if licensed === false. Human-readable. */
|
||||
reason?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the license key stored in the package store. Pure offline — runs in
|
||||
* a few milliseconds.
|
||||
*
|
||||
* Typical usage in main.ts:
|
||||
*
|
||||
* const gate = checkLicenseGate(await sdk.store.getOwn(effects, sdk.StorePath).const())
|
||||
* if (!gate.licensed) {
|
||||
* // options: exit, or inject a "trial mode" env var into your daemon
|
||||
* }
|
||||
*/
|
||||
export function checkLicenseGate(store: {
|
||||
license_key?: string | null
|
||||
}): LicenseGateResult {
|
||||
const key = store.license_key
|
||||
if (!key) return { licensed: false, reason: 'no license key stored' }
|
||||
try {
|
||||
const ok = new Verifier(PublicKey.fromPem(ISSUER_PUBKEY_PEM)).verify(key)
|
||||
return { licensed: true, details: ok }
|
||||
} catch (e) {
|
||||
return {
|
||||
licensed: false,
|
||||
reason: e instanceof Error ? e.message : 'verification failed',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export { PRODUCT_SLUG }
|
||||
Reference in New Issue
Block a user