@corelicense/node 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +126 -0
- package/dist/audit/local-audit.d.ts +22 -0
- package/dist/audit/local-audit.d.ts.map +1 -0
- package/dist/audit/local-audit.js +21 -0
- package/dist/audit/local-audit.js.map +1 -0
- package/dist/cache/cache-store.d.ts +8 -0
- package/dist/cache/cache-store.d.ts.map +1 -0
- package/dist/cache/cache-store.js +2 -0
- package/dist/cache/cache-store.js.map +1 -0
- package/dist/cache/file-cache-store.d.ts +12 -0
- package/dist/cache/file-cache-store.d.ts.map +1 -0
- package/dist/cache/file-cache-store.js +64 -0
- package/dist/cache/file-cache-store.js.map +1 -0
- package/dist/cache/memory-cache-store.d.ts +9 -0
- package/dist/cache/memory-cache-store.d.ts.map +1 -0
- package/dist/cache/memory-cache-store.js +17 -0
- package/dist/cache/memory-cache-store.js.map +1 -0
- package/dist/client/license-api-client.d.ts +14 -0
- package/dist/client/license-api-client.d.ts.map +1 -0
- package/dist/client/license-api-client.js +36 -0
- package/dist/client/license-api-client.js.map +1 -0
- package/dist/client/public-keys-client.d.ts +11 -0
- package/dist/client/public-keys-client.d.ts.map +1 -0
- package/dist/client/public-keys-client.js +31 -0
- package/dist/client/public-keys-client.js.map +1 -0
- package/dist/core-license.d.ts +56 -0
- package/dist/core-license.d.ts.map +1 -0
- package/dist/core-license.js +411 -0
- package/dist/core-license.js.map +1 -0
- package/dist/crypto/key-loader.d.ts +4 -0
- package/dist/crypto/key-loader.d.ts.map +1 -0
- package/dist/crypto/key-loader.js +19 -0
- package/dist/crypto/key-loader.js.map +1 -0
- package/dist/crypto/public-key-resolver.d.ts +16 -0
- package/dist/crypto/public-key-resolver.d.ts.map +1 -0
- package/dist/crypto/public-key-resolver.js +61 -0
- package/dist/crypto/public-key-resolver.js.map +1 -0
- package/dist/crypto/verify-policy-token.d.ts +7 -0
- package/dist/crypto/verify-policy-token.d.ts.map +1 -0
- package/dist/crypto/verify-policy-token.js +47 -0
- package/dist/crypto/verify-policy-token.js.map +1 -0
- package/dist/env/load-options-from-env.d.ts +7 -0
- package/dist/env/load-options-from-env.d.ts.map +1 -0
- package/dist/env/load-options-from-env.js +34 -0
- package/dist/env/load-options-from-env.js.map +1 -0
- package/dist/env/resolve-api-url.d.ts +12 -0
- package/dist/env/resolve-api-url.d.ts.map +1 -0
- package/dist/env/resolve-api-url.js +44 -0
- package/dist/env/resolve-api-url.js.map +1 -0
- package/dist/errors/feature-error.d.ts +6 -0
- package/dist/errors/feature-error.d.ts.map +1 -0
- package/dist/errors/feature-error.js +10 -0
- package/dist/errors/feature-error.js.map +1 -0
- package/dist/errors/index.d.ts +5 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +5 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/license-error.d.ts +22 -0
- package/dist/errors/license-error.d.ts.map +1 -0
- package/dist/errors/license-error.js +41 -0
- package/dist/errors/license-error.js.map +1 -0
- package/dist/errors/policy-error.d.ts +5 -0
- package/dist/errors/policy-error.d.ts.map +1 -0
- package/dist/errors/policy-error.js +8 -0
- package/dist/errors/policy-error.js.map +1 -0
- package/dist/errors/quota-error.d.ts +8 -0
- package/dist/errors/quota-error.d.ts.map +1 -0
- package/dist/errors/quota-error.js +14 -0
- package/dist/errors/quota-error.js.map +1 -0
- package/dist/events/event-bus.d.ts +17 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +21 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/guards/cli-guard.d.ts +3 -0
- package/dist/guards/cli-guard.d.ts.map +1 -0
- package/dist/guards/cli-guard.js +22 -0
- package/dist/guards/cli-guard.js.map +1 -0
- package/dist/guards/express-middleware.d.ts +5 -0
- package/dist/guards/express-middleware.d.ts.map +1 -0
- package/dist/guards/express-middleware.js +27 -0
- package/dist/guards/express-middleware.js.map +1 -0
- package/dist/guards/fastify-plugin.d.ts +9 -0
- package/dist/guards/fastify-plugin.d.ts.map +1 -0
- package/dist/guards/fastify-plugin.js +32 -0
- package/dist/guards/fastify-plugin.js.map +1 -0
- package/dist/guards/feature-guard.d.ts +3 -0
- package/dist/guards/feature-guard.d.ts.map +1 -0
- package/dist/guards/feature-guard.js +18 -0
- package/dist/guards/feature-guard.js.map +1 -0
- package/dist/guards/nest-guard.d.ts +8 -0
- package/dist/guards/nest-guard.d.ts.map +1 -0
- package/dist/guards/nest-guard.js +11 -0
- package/dist/guards/nest-guard.js.map +1 -0
- package/dist/guards/nest-module.d.ts +6 -0
- package/dist/guards/nest-module.d.ts.map +1 -0
- package/dist/guards/nest-module.js +21 -0
- package/dist/guards/nest-module.js.map +1 -0
- package/dist/guards/quota-guard.d.ts +7 -0
- package/dist/guards/quota-guard.d.ts.map +1 -0
- package/dist/guards/quota-guard.js +24 -0
- package/dist/guards/quota-guard.js.map +1 -0
- package/dist/guards/worker-guard.d.ts +3 -0
- package/dist/guards/worker-guard.d.ts.map +1 -0
- package/dist/guards/worker-guard.js +23 -0
- package/dist/guards/worker-guard.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/install-id.d.ts +9 -0
- package/dist/instance/install-id.d.ts.map +1 -0
- package/dist/instance/install-id.js +27 -0
- package/dist/instance/install-id.js.map +1 -0
- package/dist/instance/instance-id.d.ts +9 -0
- package/dist/instance/instance-id.d.ts.map +1 -0
- package/dist/instance/instance-id.js +21 -0
- package/dist/instance/instance-id.js.map +1 -0
- package/dist/runtime/module-registry.d.ts +8 -0
- package/dist/runtime/module-registry.d.ts.map +1 -0
- package/dist/runtime/module-registry.js +19 -0
- package/dist/runtime/module-registry.js.map +1 -0
- package/dist/runtime/runtime-config.d.ts +4 -0
- package/dist/runtime/runtime-config.d.ts.map +1 -0
- package/dist/runtime/runtime-config.js +41 -0
- package/dist/runtime/runtime-config.js.map +1 -0
- package/dist/runtime/service-container.d.ts +9 -0
- package/dist/runtime/service-container.d.ts.map +1 -0
- package/dist/runtime/service-container.js +17 -0
- package/dist/runtime/service-container.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/limits.d.ts +11 -0
- package/dist/types/limits.d.ts.map +1 -0
- package/dist/types/limits.js +2 -0
- package/dist/types/limits.js.map +1 -0
- package/dist/types/options.d.ts +62 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +2 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/policy.d.ts +41 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +2 -0
- package/dist/types/policy.js.map +1 -0
- package/dist/types/public-keys.d.ts +19 -0
- package/dist/types/public-keys.d.ts.map +1 -0
- package/dist/types/public-keys.js +2 -0
- package/dist/types/public-keys.js.map +1 -0
- package/dist/types/runtime.d.ts +11 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/status.d.ts +14 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +2 -0
- package/dist/types/status.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { resolveApiUrl } from './resolve-api-url.js';
|
|
2
|
+
const REQUIRED_ENV = ['CORELICENSE_KEY', 'CORELICENSE_PRODUCT_ID'];
|
|
3
|
+
function readEnv(name) {
|
|
4
|
+
const value = process.env[name]?.trim();
|
|
5
|
+
return value ? value : undefined;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build CoreLicense options from standard CORELICENSE_* environment variables.
|
|
9
|
+
* API URL is resolved automatically from the license key — no CORELICENSE_API_URL required.
|
|
10
|
+
*/
|
|
11
|
+
export function loadOptionsFromEnv(overrides = {}) {
|
|
12
|
+
const licenseKey = overrides.licenseKey ?? readEnv('CORELICENSE_KEY');
|
|
13
|
+
const productId = overrides.productId ?? readEnv('CORELICENSE_PRODUCT_ID');
|
|
14
|
+
const missing = REQUIRED_ENV.filter((name) => {
|
|
15
|
+
if (name === 'CORELICENSE_KEY')
|
|
16
|
+
return !licenseKey;
|
|
17
|
+
return !productId;
|
|
18
|
+
});
|
|
19
|
+
if (missing.length > 0) {
|
|
20
|
+
throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
|
|
21
|
+
}
|
|
22
|
+
const options = {
|
|
23
|
+
...overrides,
|
|
24
|
+
licenseKey: licenseKey,
|
|
25
|
+
productId: productId,
|
|
26
|
+
publicKey: overrides.publicKey ?? readEnv('CORELICENSE_PUBLIC_KEY'),
|
|
27
|
+
apiUrl: overrides.apiUrl ?? readEnv('CORELICENSE_API_URL'),
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
...options,
|
|
31
|
+
apiUrl: resolveApiUrl(options),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=load-options-from-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-options-from-env.js","sourceRoot":"","sources":["../../src/env/load-options-from-env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,YAAY,GAAG,CAAC,iBAAiB,EAAE,wBAAwB,CAAU,CAAC;AAE5E,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAyC,EAAE;IAE3C,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,IAAI,KAAK,iBAAiB;YAAE,OAAO,CAAC,UAAU,CAAC;QACnD,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,OAAO,GAAuB;QAClC,GAAG,SAAS;QACZ,UAAU,EAAE,UAAW;QACvB,SAAS,EAAE,SAAU;QACrB,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,OAAO,CAAC,wBAAwB,CAAC;QACnE,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,qBAAqB,CAAC;KAC3D,CAAC;IAEF,OAAO;QACL,GAAG,OAAO;QACV,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CoreLicenseOptions } from '../types/options.js';
|
|
2
|
+
export type SdkEndpointCache = {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function normalizeApiUrl(apiUrl: string): string;
|
|
6
|
+
export declare function parseEmbeddedApiUrl(licenseKey: string): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve license server API URL without requiring explicit sdk config.
|
|
9
|
+
* Priority: options.apiUrl → embedded in license key → cached endpoint → env → dev default.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveApiUrl(options: Pick<CoreLicenseOptions, 'apiUrl' | 'licenseKey'>, cachedApiUrl?: string | null): string;
|
|
12
|
+
//# sourceMappingURL=resolve-api-url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-api-url.d.ts","sourceRoot":"","sources":["../../src/env/resolve-api-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBrE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,YAAY,CAAC,EAC1D,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC3B,MAAM,CAoBR"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const LICENSE_KEY_V1_PREFIX = 'CL1.';
|
|
2
|
+
const DEFAULT_API_URL = 'http://localhost:8080';
|
|
3
|
+
export function normalizeApiUrl(apiUrl) {
|
|
4
|
+
return apiUrl.trim().replace(/\/+$/, '');
|
|
5
|
+
}
|
|
6
|
+
export function parseEmbeddedApiUrl(licenseKey) {
|
|
7
|
+
if (!licenseKey.startsWith(LICENSE_KEY_V1_PREFIX)) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
const rest = licenseKey.slice(LICENSE_KEY_V1_PREFIX.length);
|
|
11
|
+
const dot = rest.indexOf('.');
|
|
12
|
+
if (dot <= 0) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const decoded = Buffer.from(rest.slice(0, dot), 'base64url').toString('utf8').trim();
|
|
17
|
+
return decoded ? normalizeApiUrl(decoded) : null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve license server API URL without requiring explicit sdk config.
|
|
25
|
+
* Priority: options.apiUrl → embedded in license key → cached endpoint → env → dev default.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveApiUrl(options, cachedApiUrl) {
|
|
28
|
+
if (options.apiUrl?.trim()) {
|
|
29
|
+
return normalizeApiUrl(options.apiUrl);
|
|
30
|
+
}
|
|
31
|
+
const embedded = parseEmbeddedApiUrl(options.licenseKey);
|
|
32
|
+
if (embedded) {
|
|
33
|
+
return embedded;
|
|
34
|
+
}
|
|
35
|
+
if (cachedApiUrl?.trim()) {
|
|
36
|
+
return normalizeApiUrl(cachedApiUrl);
|
|
37
|
+
}
|
|
38
|
+
const fromEnv = process.env.CORELICENSE_API_URL?.trim();
|
|
39
|
+
if (fromEnv) {
|
|
40
|
+
return normalizeApiUrl(fromEnv);
|
|
41
|
+
}
|
|
42
|
+
return DEFAULT_API_URL;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=resolve-api-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-api-url.js","sourceRoot":"","sources":["../../src/env/resolve-api-url.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAMhD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACrF,OAAO,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA0D,EAC1D,YAA4B;IAE5B,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3B,OAAO,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,OAAO,eAAe,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IACxD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-error.d.ts","sourceRoot":"","sources":["../../src/errors/feature-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAS9C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LicenseError } from './license-error.js';
|
|
2
|
+
export class FeatureDisabledError extends LicenseError {
|
|
3
|
+
feature;
|
|
4
|
+
constructor(feature, message) {
|
|
5
|
+
super(message ?? `Feature "${feature}" is not available for your license`, 'FEATURE_DISABLED', 'limited');
|
|
6
|
+
this.name = 'FeatureDisabledError';
|
|
7
|
+
this.feature = feature;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=feature-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-error.js","sourceRoot":"","sources":["../../src/errors/feature-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IAC3C,OAAO,CAAS;IAEzB,YAAY,OAAe,EAAE,OAAgB;QAC3C,KAAK,CACH,OAAO,IAAI,YAAY,OAAO,qCAAqC,EACnE,kBAAkB,EAClB,SAAS,CACV,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LicenseStatusValue } from '../types/status.js';
|
|
2
|
+
export declare class LicenseError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly status?: LicenseStatusValue;
|
|
5
|
+
constructor(message: string, code?: string, status?: LicenseStatusValue);
|
|
6
|
+
}
|
|
7
|
+
export declare class LicenseRevokedError extends LicenseError {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class LicenseSuspendedError extends LicenseError {
|
|
11
|
+
constructor(message?: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class LicenseExpiredError extends LicenseError {
|
|
14
|
+
constructor(message?: string);
|
|
15
|
+
}
|
|
16
|
+
export declare class LicenseInvalidError extends LicenseError {
|
|
17
|
+
constructor(message?: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class OfflineGraceExpiredError extends LicenseError {
|
|
20
|
+
constructor(message?: string);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=license-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-error.d.ts","sourceRoot":"","sources":["../../src/errors/license-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;gBAEzB,OAAO,EAAE,MAAM,EAAE,IAAI,SAAkB,EAAE,MAAM,CAAC,EAAE,kBAAkB;CAMjF;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAA6B;CAIjD;AAED,qBAAa,qBAAsB,SAAQ,YAAY;gBACzC,OAAO,SAA+B;CAInD;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAAwB;CAI5C;AAED,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAAuB;CAI3C;AAED,qBAAa,wBAAyB,SAAQ,YAAY;gBAC5C,OAAO,SAAqC;CAIzD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export class LicenseError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
status;
|
|
4
|
+
constructor(message, code = 'LICENSE_ERROR', status) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'LicenseError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.status = status;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class LicenseRevokedError extends LicenseError {
|
|
12
|
+
constructor(message = 'License has been revoked') {
|
|
13
|
+
super(message, 'LICENSE_REVOKED', 'revoked');
|
|
14
|
+
this.name = 'LicenseRevokedError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class LicenseSuspendedError extends LicenseError {
|
|
18
|
+
constructor(message = 'License has been suspended') {
|
|
19
|
+
super(message, 'LICENSE_SUSPENDED', 'suspended');
|
|
20
|
+
this.name = 'LicenseSuspendedError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class LicenseExpiredError extends LicenseError {
|
|
24
|
+
constructor(message = 'License has expired') {
|
|
25
|
+
super(message, 'LICENSE_EXPIRED', 'expired');
|
|
26
|
+
this.name = 'LicenseExpiredError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class LicenseInvalidError extends LicenseError {
|
|
30
|
+
constructor(message = 'License is invalid') {
|
|
31
|
+
super(message, 'LICENSE_INVALID', 'invalid');
|
|
32
|
+
this.name = 'LicenseInvalidError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class OfflineGraceExpiredError extends LicenseError {
|
|
36
|
+
constructor(message = 'Offline grace period has expired') {
|
|
37
|
+
super(message, 'OFFLINE_GRACE_EXPIRED', 'grace_expired');
|
|
38
|
+
this.name = 'OfflineGraceExpiredError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=license-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license-error.js","sourceRoot":"","sources":["../../src/errors/license-error.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAS;IACb,MAAM,CAAsB;IAErC,YAAY,OAAe,EAAE,IAAI,GAAG,eAAe,EAAE,MAA2B;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,GAAG,0BAA0B;QAC9C,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IACrD,YAAY,OAAO,GAAG,4BAA4B;QAChD,KAAK,CAAC,OAAO,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,GAAG,qBAAqB;QACzC,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAO,GAAG,oBAAoB;QACxC,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,YAAY;IACxD,YAAY,OAAO,GAAG,kCAAkC;QACtD,KAAK,CAAC,OAAO,EAAE,uBAAuB,EAAE,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-error.d.ts","sourceRoot":"","sources":["../../src/errors/policy-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,OAAO,SAA+C;CAInE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LicenseError } from './license-error.js';
|
|
2
|
+
export class PolicySignatureError extends LicenseError {
|
|
3
|
+
constructor(message = 'Policy token signature verification failed') {
|
|
4
|
+
super(message, 'POLICY_SIGNATURE_ERROR', 'invalid');
|
|
5
|
+
this.name = 'PolicySignatureError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=policy-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-error.js","sourceRoot":"","sources":["../../src/errors/policy-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,oBAAqB,SAAQ,YAAY;IACpD,YAAY,OAAO,GAAG,4CAA4C;QAChE,KAAK,CAAC,OAAO,EAAE,wBAAwB,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LicenseError } from './license-error.js';
|
|
2
|
+
export declare class QuotaExceededError extends LicenseError {
|
|
3
|
+
readonly quotaName: string;
|
|
4
|
+
readonly limit?: number;
|
|
5
|
+
readonly current?: number;
|
|
6
|
+
constructor(quotaName: string, limit?: number, current?: number);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=quota-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-error.d.ts","sourceRoot":"","sources":["../../src/errors/quota-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAWhE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LicenseError } from './license-error.js';
|
|
2
|
+
export class QuotaExceededError extends LicenseError {
|
|
3
|
+
quotaName;
|
|
4
|
+
limit;
|
|
5
|
+
current;
|
|
6
|
+
constructor(quotaName, limit, current) {
|
|
7
|
+
super(`Quota "${quotaName}" exceeded${limit !== undefined ? ` (limit: ${limit})` : ''}`, 'QUOTA_EXCEEDED', 'limited');
|
|
8
|
+
this.name = 'QuotaExceededError';
|
|
9
|
+
this.quotaName = quotaName;
|
|
10
|
+
this.limit = limit;
|
|
11
|
+
this.current = current;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=quota-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-error.js","sourceRoot":"","sources":["../../src/errors/quota-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IACzC,SAAS,CAAS;IAClB,KAAK,CAAU;IACf,OAAO,CAAU;IAE1B,YAAY,SAAiB,EAAE,KAAc,EAAE,OAAgB;QAC7D,KAAK,CACH,UAAU,SAAS,aAAa,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EACjF,gBAAgB,EAChB,SAAS,CACV,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CoreLicenseEvent, CoreLicenseEventHandler } from '../types/options.js';
|
|
2
|
+
import type { LicenseStatus } from '../types/status.js';
|
|
3
|
+
import type { Policy } from '../types/policy.js';
|
|
4
|
+
export interface CoreLicenseEventMap {
|
|
5
|
+
statusChanged: LicenseStatus;
|
|
6
|
+
policyUpdated: Policy;
|
|
7
|
+
licenseRevoked: void;
|
|
8
|
+
licenseSuspended: void;
|
|
9
|
+
offlineMode: void;
|
|
10
|
+
}
|
|
11
|
+
export declare class EventBus {
|
|
12
|
+
private readonly handlers;
|
|
13
|
+
on<E extends CoreLicenseEvent>(event: E, handler: CoreLicenseEventHandler<CoreLicenseEventMap[E]>): void;
|
|
14
|
+
off<E extends CoreLicenseEvent>(event: E, handler: CoreLicenseEventHandler<CoreLicenseEventMap[E]>): void;
|
|
15
|
+
emit<E extends CoreLicenseEvent>(event: E, payload: CoreLicenseEventMap[E]): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,IAAI,CAAC;IACrB,gBAAgB,EAAE,IAAI,CAAC;IACvB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6D;IAEtF,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAC3B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,uBAAuB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GACvD,IAAI;IAMP,GAAG,CAAC,CAAC,SAAS,gBAAgB,EAC5B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,uBAAuB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,GACvD,IAAI;IAID,IAAI,CAAC,CAAC,SAAS,gBAAgB,EACnC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;CAUjB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class EventBus {
|
|
2
|
+
handlers = new Map();
|
|
3
|
+
on(event, handler) {
|
|
4
|
+
const existing = this.handlers.get(event) ?? new Set();
|
|
5
|
+
existing.add(handler);
|
|
6
|
+
this.handlers.set(event, existing);
|
|
7
|
+
}
|
|
8
|
+
off(event, handler) {
|
|
9
|
+
this.handlers.get(event)?.delete(handler);
|
|
10
|
+
}
|
|
11
|
+
async emit(event, payload) {
|
|
12
|
+
const handlers = this.handlers.get(event);
|
|
13
|
+
if (!handlers) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
for (const handler of handlers) {
|
|
17
|
+
await handler(payload);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../src/events/event-bus.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,QAAQ;IACF,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;IAEtF,EAAE,CACA,KAAQ,EACR,OAAwD;QAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACvD,QAAQ,CAAC,GAAG,CAAC,OAAkC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,GAAG,CACD,KAAQ,EACR,OAAwD;QAExD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAkC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAQ,EACR,OAA+B;QAE/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-guard.d.ts","sourceRoot":"","sources":["../../src/guards/cli-guard.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB5F"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LicenseExpiredError, LicenseInvalidError, LicenseRevokedError, LicenseSuspendedError, OfflineGraceExpiredError, } from '../errors/license-error.js';
|
|
2
|
+
export async function guardCommand(status, commandName) {
|
|
3
|
+
switch (status.status) {
|
|
4
|
+
case 'active':
|
|
5
|
+
case 'limited':
|
|
6
|
+
case 'offline':
|
|
7
|
+
return;
|
|
8
|
+
case 'suspended':
|
|
9
|
+
throw new LicenseSuspendedError(`Command "${commandName}" is suspended`);
|
|
10
|
+
case 'revoked':
|
|
11
|
+
throw new LicenseRevokedError(`Command "${commandName}" is revoked`);
|
|
12
|
+
case 'expired':
|
|
13
|
+
throw new LicenseExpiredError(`Command "${commandName}" is expired`);
|
|
14
|
+
case 'grace_expired':
|
|
15
|
+
throw new OfflineGraceExpiredError(`Command "${commandName}" grace expired`);
|
|
16
|
+
case 'invalid':
|
|
17
|
+
throw new LicenseInvalidError(`Command "${commandName}" invalid license`);
|
|
18
|
+
default:
|
|
19
|
+
throw new LicenseInvalidError(`Command "${commandName}" is not allowed`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cli-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-guard.js","sourceRoot":"","sources":["../../src/guards/cli-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAqB,EAAE,WAAmB;IAC3E,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,OAAO;QACT,KAAK,WAAW;YACd,MAAM,IAAI,qBAAqB,CAAC,YAAY,WAAW,gBAAgB,CAAC,CAAC;QAC3E,KAAK,SAAS;YACZ,MAAM,IAAI,mBAAmB,CAAC,YAAY,WAAW,cAAc,CAAC,CAAC;QACvE,KAAK,SAAS;YACZ,MAAM,IAAI,mBAAmB,CAAC,YAAY,WAAW,cAAc,CAAC,CAAC;QACvE,KAAK,eAAe;YAClB,MAAM,IAAI,wBAAwB,CAAC,YAAY,WAAW,iBAAiB,CAAC,CAAC;QAC/E,KAAK,SAAS;YACZ,MAAM,IAAI,mBAAmB,CAAC,YAAY,WAAW,mBAAmB,CAAC,CAAC;QAC5E;YACE,MAAM,IAAI,mBAAmB,CAAC,YAAY,WAAW,kBAAkB,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RequestHandler } from 'express';
|
|
2
|
+
import type { CoreLicense } from '../core-license.js';
|
|
3
|
+
import type { ExpressGuardOptions } from '../types/options.js';
|
|
4
|
+
export declare function createExpressMiddleware(license: CoreLicense, options?: ExpressGuardOptions): RequestHandler;
|
|
5
|
+
//# sourceMappingURL=express-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-middleware.d.ts","sourceRoot":"","sources":["../../src/guards/express-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,mBAAwB,GAChC,cAAc,CA2BhB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { LicenseError } from '../errors/license-error.js';
|
|
2
|
+
export function createExpressMiddleware(license, options = {}) {
|
|
3
|
+
const allowPaths = new Set(options.allowPaths ?? []);
|
|
4
|
+
return async (req, res, next) => {
|
|
5
|
+
const path = req.path ?? req.url;
|
|
6
|
+
if (allowPaths.has(path)) {
|
|
7
|
+
next();
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
await license.requireActive();
|
|
12
|
+
next();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof LicenseError) {
|
|
16
|
+
res.status(403).json({
|
|
17
|
+
code: error.code,
|
|
18
|
+
message: error.message,
|
|
19
|
+
status: error.status,
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
next(error);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=express-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-middleware.js","sourceRoot":"","sources":["../../src/guards/express-middleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,UAAU,uBAAuB,CACrC,OAAoB,EACpB,UAA+B,EAAE;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAErD,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC;QAEjC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FastifyPluginAsync } from 'fastify';
|
|
2
|
+
import type { CoreLicense } from '../core-license.js';
|
|
3
|
+
import type { FastifyGuardOptions } from '../types/options.js';
|
|
4
|
+
export interface CoreLicenseFastifyPluginOptions extends FastifyGuardOptions {
|
|
5
|
+
license: CoreLicense;
|
|
6
|
+
}
|
|
7
|
+
export declare const coreLicenseFastifyPlugin: FastifyPluginAsync<CoreLicenseFastifyPluginOptions>;
|
|
8
|
+
export declare function createFastifyPlugin(license: CoreLicense, guardOptions?: FastifyGuardOptions): FastifyPluginAsync;
|
|
9
|
+
//# sourceMappingURL=fastify-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify-plugin.d.ts","sourceRoot":"","sources":["../../src/guards/fastify-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,WAAW,+BAAgC,SAAQ,mBAAmB;IAC1E,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,+BAA+B,CA2BxF,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,YAAY,GAAE,mBAAwB,GACrC,kBAAkB,CAOpB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LicenseError } from '../errors/license-error.js';
|
|
2
|
+
export const coreLicenseFastifyPlugin = async (fastify, options) => {
|
|
3
|
+
const allowPaths = new Set(options.allowPaths ?? []);
|
|
4
|
+
fastify.addHook('preHandler', async (request, reply) => {
|
|
5
|
+
const path = request.url.split('?')[0];
|
|
6
|
+
if (allowPaths.has(path)) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
await options.license.requireActive();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
if (error instanceof LicenseError) {
|
|
14
|
+
return reply.status(403).send({
|
|
15
|
+
code: error.code,
|
|
16
|
+
message: error.message,
|
|
17
|
+
status: error.status,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
export function createFastifyPlugin(license, guardOptions = {}) {
|
|
25
|
+
return async (fastify) => {
|
|
26
|
+
await fastify.register(coreLicenseFastifyPlugin, {
|
|
27
|
+
...guardOptions,
|
|
28
|
+
license,
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=fastify-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify-plugin.js","sourceRoot":"","sources":["../../src/guards/fastify-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D,MAAM,CAAC,MAAM,wBAAwB,GAAwD,KAAK,EAChG,OAAO,EACP,OAAO,EACP,EAAE;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAErD,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CACjC,OAAoB,EACpB,eAAoC,EAAE;IAEtC,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,OAAO,CAAC,QAAQ,CAAC,wBAAwB,EAAE;YAC/C,GAAG,YAAY;YACf,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-guard.d.ts","sourceRoot":"","sources":["../../src/guards/feature-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAmBjF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FeatureDisabledError } from '../errors/feature-error.js';
|
|
2
|
+
export function assertFeatureEnabled(policy, feature) {
|
|
3
|
+
if (!policy) {
|
|
4
|
+
throw new FeatureDisabledError(feature, 'No active policy available');
|
|
5
|
+
}
|
|
6
|
+
const segments = feature.split('.');
|
|
7
|
+
let current = policy.features;
|
|
8
|
+
for (const segment of segments) {
|
|
9
|
+
if (typeof current !== 'object' || current === null) {
|
|
10
|
+
throw new FeatureDisabledError(feature);
|
|
11
|
+
}
|
|
12
|
+
current = current[segment];
|
|
13
|
+
}
|
|
14
|
+
if (current !== true) {
|
|
15
|
+
throw new FeatureDisabledError(feature);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=feature-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-guard.js","sourceRoot":"","sources":["../../src/guards/feature-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,MAAM,UAAU,oBAAoB,CAAC,MAAqB,EAAE,OAAe;IACzE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAoB,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,GAAY,MAAM,CAAC,QAAQ,CAAC;IAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CanActivate, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import type { CoreLicense } from '../core-license.js';
|
|
3
|
+
export declare class CoreLicenseGuard implements CanActivate {
|
|
4
|
+
private readonly license;
|
|
5
|
+
constructor(license: CoreLicense);
|
|
6
|
+
canActivate(_context: ExecutionContext): Promise<boolean>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=nest-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-guard.d.ts","sourceRoot":"","sources":["../../src/guards/nest-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,qBAAa,gBAAiB,YAAW,WAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW;IAE3C,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-guard.js","sourceRoot":"","sources":["../../src/guards/nest-guard.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,OAAoB;QAApB,YAAO,GAAP,OAAO,CAAa;IAAG,CAAC;IAErD,KAAK,CAAC,WAAW,CAAC,QAA0B;QAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import type { CoreLicenseOptions } from '../types/options.js';
|
|
3
|
+
export declare class CoreLicenseModule {
|
|
4
|
+
static forRoot(options: CoreLicenseOptions): DynamicModule;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=nest-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-module.d.ts","sourceRoot":"","sources":["../../src/guards/nest-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,aAAa;CAiB3D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CoreLicense } from '../core-license.js';
|
|
2
|
+
import { CoreLicenseGuard } from './nest-guard.js';
|
|
3
|
+
export class CoreLicenseModule {
|
|
4
|
+
static forRoot(options) {
|
|
5
|
+
const licenseProvider = {
|
|
6
|
+
provide: CoreLicense,
|
|
7
|
+
useFactory: async () => {
|
|
8
|
+
const license = new CoreLicense(options);
|
|
9
|
+
await license.boot();
|
|
10
|
+
return license;
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
return {
|
|
14
|
+
module: CoreLicenseModule,
|
|
15
|
+
providers: [licenseProvider, CoreLicenseGuard],
|
|
16
|
+
exports: [CoreLicense, CoreLicenseGuard],
|
|
17
|
+
global: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=nest-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-module.js","sourceRoot":"","sources":["../../src/guards/nest-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,OAAO,CAAC,OAA2B;QACxC,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;YAC9C,OAAO,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC;YACxC,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Policy } from '../types/policy.js';
|
|
2
|
+
import type { QuotaUsage } from '../types/limits.js';
|
|
3
|
+
export declare function assertWithinLimit(policy: Policy | null, limitName: string, currentValue: number): void;
|
|
4
|
+
export declare function assertQuotaAvailable(usage: QuotaUsage, quotaName: string, amount: number, dailyLimit?: number): void;
|
|
5
|
+
export declare function todayDateString(): string;
|
|
6
|
+
export declare function createEmptyUsage(date?: string): QuotaUsage;
|
|
7
|
+
//# sourceMappingURL=quota-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-guard.d.ts","sourceRoot":"","sources":["../../src/guards/quota-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,IAAI,CAUN;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAON;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,SAAoB,GAAG,UAAU,CAErE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { QuotaExceededError } from '../errors/quota-error.js';
|
|
2
|
+
export function assertWithinLimit(policy, limitName, currentValue) {
|
|
3
|
+
if (!policy) {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
const limit = policy.limits[limitName];
|
|
7
|
+
if (limit !== undefined && currentValue > limit) {
|
|
8
|
+
throw new QuotaExceededError(limitName, limit, currentValue);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function assertQuotaAvailable(usage, quotaName, amount, dailyLimit) {
|
|
12
|
+
const current = usage.quotas[quotaName] ?? 0;
|
|
13
|
+
const next = current + amount;
|
|
14
|
+
if (dailyLimit !== undefined && next > dailyLimit) {
|
|
15
|
+
throw new QuotaExceededError(quotaName, dailyLimit, next);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function todayDateString() {
|
|
19
|
+
return new Date().toISOString().slice(0, 10);
|
|
20
|
+
}
|
|
21
|
+
export function createEmptyUsage(date = todayDateString()) {
|
|
22
|
+
return { date, quotas: {} };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=quota-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-guard.js","sourceRoot":"","sources":["../../src/guards/quota-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI9D,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,SAAiB,EACjB,YAAoB;IAEpB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEvC,IAAI,KAAK,KAAK,SAAS,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;QAChD,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAiB,EACjB,SAAiB,EACjB,MAAc,EACd,UAAmB;IAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC;IAE9B,IAAI,UAAU,KAAK,SAAS,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;QAClD,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAI,GAAG,eAAe,EAAE;IACvD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC9B,CAAC"}
|