@corelicense/node 0.2.0 → 0.5.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 +71 -4
- package/dist/client/license-api-client.d.ts +3 -2
- package/dist/client/license-api-client.d.ts.map +1 -1
- package/dist/client/license-api-client.js +44 -4
- package/dist/client/license-api-client.js.map +1 -1
- package/dist/client/map-client-error.d.ts +5 -0
- package/dist/client/map-client-error.d.ts.map +1 -0
- package/dist/client/map-client-error.js +63 -0
- package/dist/client/map-client-error.js.map +1 -0
- package/dist/client/public-keys-client.d.ts.map +1 -1
- package/dist/client/public-keys-client.js +20 -2
- package/dist/client/public-keys-client.js.map +1 -1
- package/dist/core-license.d.ts +19 -1
- package/dist/core-license.d.ts.map +1 -1
- package/dist/core-license.js +195 -51
- package/dist/core-license.js.map +1 -1
- package/dist/crypto/verify-policy-token.d.ts.map +1 -1
- package/dist/crypto/verify-policy-token.js +75 -5
- package/dist/crypto/verify-policy-token.js.map +1 -1
- package/dist/env/load-options-from-env.d.ts.map +1 -1
- package/dist/env/load-options-from-env.js +2 -1
- package/dist/env/load-options-from-env.js.map +1 -1
- package/dist/env/resolve-api-url.js +1 -1
- package/dist/env/resolve-api-url.js.map +1 -1
- package/dist/errors/api-error.d.ts +17 -0
- package/dist/errors/api-error.d.ts.map +1 -0
- package/dist/errors/api-error.js +43 -0
- package/dist/errors/api-error.js.map +1 -0
- package/dist/errors/codes.d.ts +40 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +39 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/config-error.d.ts +7 -0
- package/dist/errors/config-error.d.ts.map +1 -0
- package/dist/errors/config-error.js +21 -0
- package/dist/errors/config-error.js.map +1 -0
- package/dist/errors/feature-error.d.ts +2 -1
- package/dist/errors/feature-error.d.ts.map +1 -1
- package/dist/errors/feature-error.js +13 -2
- package/dist/errors/feature-error.js.map +1 -1
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +6 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/license-error.d.ts +48 -7
- package/dist/errors/license-error.d.ts.map +1 -1
- package/dist/errors/license-error.js +104 -14
- package/dist/errors/license-error.js.map +1 -1
- package/dist/errors/module-error.d.ts +7 -0
- package/dist/errors/module-error.d.ts.map +1 -0
- package/dist/errors/module-error.js +20 -0
- package/dist/errors/module-error.js.map +1 -0
- package/dist/errors/policy-error.d.ts +10 -1
- package/dist/errors/policy-error.d.ts.map +1 -1
- package/dist/errors/policy-error.js +16 -2
- package/dist/errors/policy-error.js.map +1 -1
- package/dist/errors/quota-error.d.ts +2 -1
- package/dist/errors/quota-error.d.ts.map +1 -1
- package/dist/errors/quota-error.js +15 -2
- package/dist/errors/quota-error.js.map +1 -1
- package/dist/errors/runtime-error.d.ts +12 -0
- package/dist/errors/runtime-error.d.ts.map +1 -0
- package/dist/errors/runtime-error.js +37 -0
- package/dist/errors/runtime-error.js.map +1 -0
- package/dist/errors/throw-for-status.d.ts +3 -0
- package/dist/errors/throw-for-status.d.ts.map +1 -0
- package/dist/errors/throw-for-status.js +21 -0
- package/dist/errors/throw-for-status.js.map +1 -0
- package/dist/guards/cli-guard.d.ts.map +1 -1
- package/dist/guards/cli-guard.js +12 -6
- package/dist/guards/cli-guard.js.map +1 -1
- package/dist/guards/express-middleware.d.ts.map +1 -1
- package/dist/guards/express-middleware.js +1 -5
- package/dist/guards/express-middleware.js.map +1 -1
- package/dist/guards/express-routes.d.ts +9 -0
- package/dist/guards/express-routes.d.ts.map +1 -0
- package/dist/guards/express-routes.js +12 -0
- package/dist/guards/express-routes.js.map +1 -0
- package/dist/guards/fastify-plugin.d.ts.map +1 -1
- package/dist/guards/fastify-plugin.js +1 -5
- package/dist/guards/fastify-plugin.js.map +1 -1
- package/dist/guards/feature-guard.d.ts +1 -0
- package/dist/guards/feature-guard.d.ts.map +1 -1
- package/dist/guards/feature-guard.js +14 -0
- package/dist/guards/feature-guard.js.map +1 -1
- package/dist/guards/nest-exception-filter.d.ts +6 -0
- package/dist/guards/nest-exception-filter.d.ts.map +1 -0
- package/dist/guards/nest-exception-filter.js +60 -0
- package/dist/guards/nest-exception-filter.js.map +1 -0
- package/dist/guards/nest-feature-guard.d.ts +10 -0
- package/dist/guards/nest-feature-guard.d.ts.map +1 -0
- package/dist/guards/nest-feature-guard.js +72 -0
- package/dist/guards/nest-feature-guard.js.map +1 -0
- package/dist/guards/nest-module.d.ts +3 -0
- package/dist/guards/nest-module.d.ts.map +1 -1
- package/dist/guards/nest-module.js +13 -2
- package/dist/guards/nest-module.js.map +1 -1
- package/dist/guards/nestjs.d.ts +6 -0
- package/dist/guards/nestjs.d.ts.map +1 -0
- package/dist/guards/nestjs.js +6 -0
- package/dist/guards/nestjs.js.map +1 -0
- package/dist/guards/quota-guard.d.ts.map +1 -1
- package/dist/guards/quota-guard.js +6 -1
- package/dist/guards/quota-guard.js.map +1 -1
- package/dist/guards/require-feature.decorator.d.ts +3 -0
- package/dist/guards/require-feature.decorator.d.ts.map +1 -0
- package/dist/guards/require-feature.decorator.js +4 -0
- package/dist/guards/require-feature.decorator.js.map +1 -0
- package/dist/guards/worker-guard.d.ts.map +1 -1
- package/dist/guards/worker-guard.js +8 -6
- package/dist/guards/worker-guard.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/instance/domain-hash.d.ts +3 -0
- package/dist/instance/domain-hash.d.ts.map +1 -0
- package/dist/instance/domain-hash.js +11 -0
- package/dist/instance/domain-hash.js.map +1 -0
- package/dist/instance/instance-id.d.ts.map +1 -1
- package/dist/instance/instance-id.js +1 -6
- package/dist/instance/instance-id.js.map +1 -1
- package/dist/runtime/licensed-module-registry.d.ts +22 -0
- package/dist/runtime/licensed-module-registry.d.ts.map +1 -0
- package/dist/runtime/licensed-module-registry.js +80 -0
- package/dist/runtime/licensed-module-registry.js.map +1 -0
- package/dist/runtime/licensed-service-container.d.ts +23 -0
- package/dist/runtime/licensed-service-container.d.ts.map +1 -0
- package/dist/runtime/licensed-service-container.js +89 -0
- package/dist/runtime/licensed-service-container.js.map +1 -0
- package/dist/runtime/licensed-service.d.ts +7 -0
- package/dist/runtime/licensed-service.d.ts.map +1 -0
- package/dist/runtime/licensed-service.js +10 -0
- package/dist/runtime/licensed-service.js.map +1 -0
- package/dist/runtime/module-registry.d.ts.map +1 -1
- package/dist/runtime/module-registry.js +2 -1
- package/dist/runtime/module-registry.js.map +1 -1
- package/dist/runtime/service-container.d.ts.map +1 -1
- package/dist/runtime/service-container.js +2 -1
- package/dist/runtime/service-container.js.map +1 -1
- package/dist/types/bootstrap.d.ts +32 -0
- package/dist/types/bootstrap.d.ts.map +1 -0
- package/dist/types/bootstrap.js +2 -0
- package/dist/types/bootstrap.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/options.d.ts +14 -3
- package/dist/types/options.d.ts.map +1 -1
- package/dist/types/policy.d.ts +2 -0
- package/dist/types/policy.d.ts.map +1 -1
- package/package.json +20 -5
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
CoreLicense Node.js SDK — runtime license và policy layer cho ứng dụng Node.js.
|
|
4
4
|
|
|
5
|
-
> **Trạng thái:** v0.
|
|
5
|
+
> **Trạng thái:** v0.4 — tích hợp sâu (module registry & DI), production default URL, revoke handling.
|
|
6
6
|
|
|
7
7
|
## Triết lý
|
|
8
8
|
|
|
@@ -24,7 +24,9 @@ npm install @nestjs/common # NestJS module/guard
|
|
|
24
24
|
|
|
25
25
|
## Quick start
|
|
26
26
|
|
|
27
|
-
Chỉ cần **2 biến môi trường
|
|
27
|
+
Chỉ cần **2 biến môi trường**. SDK mặc định kết nối `https://api.corelicense.net` — không cần cấu hình thêm cho production.
|
|
28
|
+
|
|
29
|
+
License key mới (CL1.*) vẫn ưu tiên URL nhúng trong key nếu server generate với `SDK_PUBLIC_URL` khác.
|
|
28
30
|
|
|
29
31
|
```env
|
|
30
32
|
CORELICENSE_KEY=CL1.xxxxx.CL-AAAAA-BBBBB-...
|
|
@@ -32,7 +34,13 @@ CORELICENSE_PRODUCT_ID=demo
|
|
|
32
34
|
```
|
|
33
35
|
|
|
34
36
|
`CORELICENSE_PUBLIC_KEY` **optional** — pin public key (enterprise / air-gapped).
|
|
35
|
-
`CORELICENSE_API_URL` **optional** — override thủ công (
|
|
37
|
+
`CORELICENSE_API_URL` **optional** — override thủ công (dev local hoặc legacy key).
|
|
38
|
+
|
|
39
|
+
Dev local với server Go chạy localhost:
|
|
40
|
+
|
|
41
|
+
```env
|
|
42
|
+
CORELICENSE_API_URL=http://localhost:8080
|
|
43
|
+
```
|
|
36
44
|
|
|
37
45
|
```ts
|
|
38
46
|
import express from 'express';
|
|
@@ -92,6 +100,60 @@ Khi pin, SDK không fetch keys từ server. Nếu verify fail sau key rotation,
|
|
|
92
100
|
| `fastifyPlugin(options?)` | Fastify plugin |
|
|
93
101
|
| `guardWorker(name)` | Guard worker |
|
|
94
102
|
| `guardCommand(name)` | Guard CLI/cron command |
|
|
103
|
+
| `createLicensedRegistry()` | Module registry gắn license |
|
|
104
|
+
| `createLicensedContainer()` | DI container gắn license |
|
|
105
|
+
| `bootstrap(options?)` | Bootstrap modules + services theo policy |
|
|
106
|
+
|
|
107
|
+
## Tích hợp sâu (v0.4)
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
await license.boot();
|
|
111
|
+
|
|
112
|
+
const { modules, services, skipped } = await license.bootstrap({
|
|
113
|
+
modules: [
|
|
114
|
+
{ name: 'automation', feature: 'automation', factory: ({ license }) => new AutomationModule(license) },
|
|
115
|
+
],
|
|
116
|
+
services: [
|
|
117
|
+
{ name: 'ExportService', feature: 'export', factory: ({ license }) => new ExportService(license) },
|
|
118
|
+
],
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const automation = await modules.get<AutomationModule>('automation');
|
|
122
|
+
const exportService = await services.resolve<ExportService>('ExportService');
|
|
123
|
+
|
|
124
|
+
import { registerLicensedRoutes } from '@corelicense/node';
|
|
125
|
+
registerLicensedRoutes(app, modules, [
|
|
126
|
+
{ path: '/automation', module: 'automation', router: automationRouter },
|
|
127
|
+
]);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`get()` và `resolve()` gọi `requireFeature` mỗi lần truy cập — revoke/suspend chặn ngay. Đổi feature trong policy vẫn cần **restart** để bind/unbind module mới.
|
|
131
|
+
|
|
132
|
+
Xem [Tích hợp sâu](https://corelicense.net/docs/nodejs-sdk/deep-integration) trên docs site.
|
|
133
|
+
|
|
134
|
+
## Xử lý lỗi
|
|
135
|
+
|
|
136
|
+
Mọi lỗi SDK đều có `code` (mã định vị) và `source` (module SDK phát sinh):
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import { isLicenseError, formatLicenseError, LicenseErrorCode } from '@corelicense/node';
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
await license.boot();
|
|
143
|
+
} catch (error) {
|
|
144
|
+
if (isLicenseError(error)) {
|
|
145
|
+
console.error(error.code, error.source); // e.g. CONFIG_MISSING_ENV, load-options-from-env
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Dùng `error.toJSON()` hoặc `formatLicenseError(error)` khi trả lỗi qua HTTP API.
|
|
151
|
+
|
|
152
|
+
## Production deploy
|
|
153
|
+
|
|
154
|
+
**SDK:** `cd SDK/corelicense-node && npm test && npm run build && npm publish --access public`
|
|
155
|
+
|
|
156
|
+
**API (Go):** deploy backend với `SDK_PUBLIC_URL=https://api.corelicense.net`, policy signer configured, và `APP_ENV=production`. Production validate yêu cầu HTTPS URL (không localhost) và secrets không dùng `change-me`.
|
|
95
157
|
|
|
96
158
|
## Cấu trúc module
|
|
97
159
|
|
|
@@ -118,7 +180,12 @@ Xem [CoreLicense Node.js SDK — Tài liệu thiết kế & tích hợp sâu](..
|
|
|
118
180
|
|
|
119
181
|
- **v0.1** — Types, errors, boot, express middleware, file cache, local audit
|
|
120
182
|
- **v0.2** — Auto-fetch public keys, key rotation retry, worker/CLI guard, offline grace
|
|
121
|
-
- **v0.3** —
|
|
183
|
+
- **v0.3** — Production default URL, activate flow, revoke handling, server contract sync
|
|
184
|
+
- **v0.4** — Licensed module registry, DI container, Express routes, NestJS `@RequireFeature`
|
|
185
|
+
- **v0.4.1** — Runtime re-check license trên `get()` / `resolve()`, fix `ModuleNotLicensedError` status
|
|
186
|
+
- **v0.4.2** — Mã lỗi (`code`) + `source` trên mọi `LicenseError`, `LicenseErrorCode`, `formatLicenseError()`
|
|
187
|
+
- **v0.4.3** — Re-check registry/DI không ghi audit; middleware 403 trả `source` qua `toClientPayload()`
|
|
188
|
+
- **v0.5.0** — Fail-closed offline boot, quota/limit gates, apiUrl pin, Nest 403 filter, sync mutex
|
|
122
189
|
- **v1.0** — Stable API, production-ready, security review
|
|
123
190
|
|
|
124
191
|
## License
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { LicenseCheckRequest, LicenseCheckResponse } from '../types/options.js';
|
|
1
|
+
import type { LicenseActivateRequest, LicenseCheckRequest, LicenseCheckResponse } from '../types/options.js';
|
|
2
2
|
export interface LicenseApiClientOptions {
|
|
3
3
|
apiUrl: string;
|
|
4
4
|
requestTimeoutMs?: number;
|
|
@@ -6,9 +6,10 @@ export interface LicenseApiClientOptions {
|
|
|
6
6
|
export declare class LicenseApiClient {
|
|
7
7
|
private readonly options;
|
|
8
8
|
constructor(options: LicenseApiClientOptions);
|
|
9
|
-
activate(request:
|
|
9
|
+
activate(request: LicenseActivateRequest): Promise<LicenseCheckResponse>;
|
|
10
10
|
check(request: LicenseCheckRequest): Promise<LicenseCheckResponse>;
|
|
11
11
|
refresh(request: LicenseCheckRequest): Promise<LicenseCheckResponse>;
|
|
12
|
+
private postWithRetry;
|
|
12
13
|
private post;
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=license-api-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license-api-client.d.ts","sourceRoot":"","sources":["../../src/client/license-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"license-api-client.d.ts","sourceRoot":"","sources":["../../src/client/license-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAK7B,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,uBAAuB;IAEvD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIxE,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIlE,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAI5D,aAAa;YAuBb,IAAI;CA+CnB"}
|
|
@@ -1,16 +1,36 @@
|
|
|
1
|
+
import { LicenseApiError } from '../errors/api-error.js';
|
|
2
|
+
import { LicenseErrorCode } from '../errors/codes.js';
|
|
3
|
+
import { LicenseRateLimitError } from '../errors/license-error.js';
|
|
4
|
+
const RETRY_DELAYS_MS = [1000, 3000];
|
|
1
5
|
export class LicenseApiClient {
|
|
2
6
|
options;
|
|
3
7
|
constructor(options) {
|
|
4
8
|
this.options = options;
|
|
5
9
|
}
|
|
6
10
|
async activate(request) {
|
|
7
|
-
return this.
|
|
11
|
+
return this.postWithRetry('/v1/client/activate', request);
|
|
8
12
|
}
|
|
9
13
|
async check(request) {
|
|
10
|
-
return this.
|
|
14
|
+
return this.postWithRetry('/v1/client/check', request);
|
|
11
15
|
}
|
|
12
16
|
async refresh(request) {
|
|
13
|
-
return this.
|
|
17
|
+
return this.postWithRetry('/v1/client/refresh', request);
|
|
18
|
+
}
|
|
19
|
+
async postWithRetry(path, body) {
|
|
20
|
+
let lastError;
|
|
21
|
+
for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {
|
|
22
|
+
try {
|
|
23
|
+
return await this.post(path, body);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
lastError = error;
|
|
27
|
+
if (!(error instanceof LicenseRateLimitError) || attempt >= RETRY_DELAYS_MS.length) {
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
await sleep(RETRY_DELAYS_MS[attempt] ?? 3000);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw lastError;
|
|
14
34
|
}
|
|
15
35
|
async post(path, body) {
|
|
16
36
|
const url = new URL(path, this.options.apiUrl);
|
|
@@ -23,14 +43,34 @@ export class LicenseApiClient {
|
|
|
23
43
|
body: JSON.stringify(body),
|
|
24
44
|
signal: controller.signal,
|
|
25
45
|
});
|
|
46
|
+
if (response.status === 429) {
|
|
47
|
+
throw new LicenseRateLimitError();
|
|
48
|
+
}
|
|
26
49
|
if (!response.ok) {
|
|
27
|
-
throw new
|
|
50
|
+
throw new LicenseApiError(`License API error: ${response.status} ${response.statusText}`, {
|
|
51
|
+
httpStatus: response.status,
|
|
52
|
+
});
|
|
28
53
|
}
|
|
29
54
|
return (await response.json());
|
|
30
55
|
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof LicenseRateLimitError || error instanceof LicenseApiError) {
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
61
|
+
throw new LicenseApiError('License API request timed out', {
|
|
62
|
+
code: LicenseErrorCode.LICENSE_API_TIMEOUT,
|
|
63
|
+
cause: error,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
throw new LicenseApiError('License API request failed', { cause: error });
|
|
67
|
+
}
|
|
31
68
|
finally {
|
|
32
69
|
clearTimeout(timeout);
|
|
33
70
|
}
|
|
34
71
|
}
|
|
35
72
|
}
|
|
73
|
+
function sleep(ms) {
|
|
74
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
75
|
+
}
|
|
36
76
|
//# sourceMappingURL=license-api-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"license-api-client.js","sourceRoot":"","sources":["../../src/client/license-api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"license-api-client.js","sourceRoot":"","sources":["../../src/client/license-api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LicenseCheckResponse } from '../types/options.js';
|
|
2
|
+
import { LicenseError } from '../errors/license-error.js';
|
|
3
|
+
export declare function isTerminalClientResponse(response: LicenseCheckResponse): boolean;
|
|
4
|
+
export declare function mapClientError(response: LicenseCheckResponse): LicenseError;
|
|
5
|
+
//# sourceMappingURL=map-client-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-client-error.d.ts","sourceRoot":"","sources":["../../src/client/map-client-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAEL,YAAY,EAMb,MAAM,4BAA4B,CAAC;AAyBpC,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAUhF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,YAAY,CAgC3E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { InstanceBlockedError, LicenseExpiredError, LicenseInvalidError, LicenseRevokedError, LicenseSuspendedError, MaxInstancesError, } from '../errors/license-error.js';
|
|
2
|
+
import { PolicySignatureError } from '../errors/policy-error.js';
|
|
3
|
+
const TERMINAL_STATUSES = new Set([
|
|
4
|
+
'revoked',
|
|
5
|
+
'suspended',
|
|
6
|
+
'expired',
|
|
7
|
+
'invalid',
|
|
8
|
+
'blocked',
|
|
9
|
+
'grace_expired',
|
|
10
|
+
]);
|
|
11
|
+
const TERMINAL_CODES = new Set([
|
|
12
|
+
'LICENSE_REVOKED',
|
|
13
|
+
'LICENSE_SUSPENDED',
|
|
14
|
+
'LICENSE_EXPIRED',
|
|
15
|
+
'LICENSE_INVALID',
|
|
16
|
+
'INVALID_LICENSE',
|
|
17
|
+
'INVALID_PRODUCT',
|
|
18
|
+
'INSTANCE_BLOCKED',
|
|
19
|
+
'MAX_INSTANCES',
|
|
20
|
+
'POLICY_SIGN_FAILED',
|
|
21
|
+
'LICENSE_NOT_STARTED',
|
|
22
|
+
]);
|
|
23
|
+
export function isTerminalClientResponse(response) {
|
|
24
|
+
if (response.ok) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (response.code && TERMINAL_CODES.has(response.code)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return TERMINAL_STATUSES.has(response.status);
|
|
31
|
+
}
|
|
32
|
+
export function mapClientError(response) {
|
|
33
|
+
const message = response.message ?? 'License check failed';
|
|
34
|
+
switch (response.code) {
|
|
35
|
+
case 'LICENSE_REVOKED':
|
|
36
|
+
return new LicenseRevokedError(message);
|
|
37
|
+
case 'LICENSE_SUSPENDED':
|
|
38
|
+
return new LicenseSuspendedError(message);
|
|
39
|
+
case 'LICENSE_EXPIRED':
|
|
40
|
+
return new LicenseExpiredError(message);
|
|
41
|
+
case 'INSTANCE_BLOCKED':
|
|
42
|
+
return new InstanceBlockedError(message);
|
|
43
|
+
case 'MAX_INSTANCES':
|
|
44
|
+
return new MaxInstancesError(message);
|
|
45
|
+
case 'POLICY_SIGN_FAILED':
|
|
46
|
+
return new PolicySignatureError(message, {
|
|
47
|
+
source: 'map-client-error',
|
|
48
|
+
});
|
|
49
|
+
default:
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
switch (response.status) {
|
|
53
|
+
case 'revoked':
|
|
54
|
+
return new LicenseRevokedError(message);
|
|
55
|
+
case 'suspended':
|
|
56
|
+
return new LicenseSuspendedError(message);
|
|
57
|
+
case 'expired':
|
|
58
|
+
return new LicenseExpiredError(message);
|
|
59
|
+
default:
|
|
60
|
+
return new LicenseInvalidError(message);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=map-client-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-client-error.js","sourceRoot":"","sources":["../../src/client/map-client-error.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EAEpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,SAAS;IACT,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;IACT,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,iBAAiB;IACjB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;IACf,oBAAoB;IACpB,qBAAqB;CACtB,CAAC,CAAC;AAEH,MAAM,UAAU,wBAAwB,CAAC,QAA8B;IACrE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA8B;IAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,sBAAsB,CAAC;IAE3D,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,iBAAiB;YACpB,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,mBAAmB;YACtB,OAAO,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC5C,KAAK,iBAAiB;YACpB,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,kBAAkB;YACrB,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,KAAK,eAAe;YAClB,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,KAAK,oBAAoB;YACvB,OAAO,IAAI,oBAAoB,CAAC,OAAO,EAAE;gBACvC,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;QACL;YACE,MAAM;IACV,CAAC;IAED,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,SAAS;YACZ,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,WAAW;YACd,OAAO,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC5C,KAAK,SAAS;YACZ,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C;YACE,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-keys-client.d.ts","sourceRoot":"","sources":["../../src/client/public-keys-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"public-keys-client.d.ts","sourceRoot":"","sources":["../../src/client/public-keys-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,uBAAuB;IAEvD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA+CxE"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { PublicKeysError } from '../errors/api-error.js';
|
|
2
|
+
import { LicenseErrorCode } from '../errors/codes.js';
|
|
1
3
|
export class PublicKeysClient {
|
|
2
4
|
options;
|
|
3
5
|
constructor(options) {
|
|
@@ -15,14 +17,30 @@ export class PublicKeysClient {
|
|
|
15
17
|
signal: controller.signal,
|
|
16
18
|
});
|
|
17
19
|
if (!response.ok) {
|
|
18
|
-
throw new
|
|
20
|
+
throw new PublicKeysError(`Public keys API error: ${response.status} ${response.statusText}`, {
|
|
21
|
+
httpStatus: response.status,
|
|
22
|
+
});
|
|
19
23
|
}
|
|
20
24
|
const data = (await response.json());
|
|
21
25
|
if (!data.keys?.length) {
|
|
22
|
-
throw new
|
|
26
|
+
throw new PublicKeysError('Public keys API returned no keys', {
|
|
27
|
+
code: LicenseErrorCode.PUBLIC_KEYS_EMPTY,
|
|
28
|
+
});
|
|
23
29
|
}
|
|
24
30
|
return data;
|
|
25
31
|
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof PublicKeysError) {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
37
|
+
throw new PublicKeysError('Public keys API request timed out', {
|
|
38
|
+
code: LicenseErrorCode.LICENSE_API_TIMEOUT,
|
|
39
|
+
cause: error,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
throw new PublicKeysError('Public keys API request failed', { cause: error });
|
|
43
|
+
}
|
|
26
44
|
finally {
|
|
27
45
|
clearTimeout(timeout);
|
|
28
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-keys-client.js","sourceRoot":"","sources":["../../src/client/public-keys-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"public-keys-client.js","sourceRoot":"","sources":["../../src/client/public-keys-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IAAG,CAAC;IAEjE,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QACtC,MAAM,IAAI,GAAG,uBAAuB,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,IAAI,CACtC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;gBACvC,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,eAAe,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EAAE;oBAC5F,UAAU,EAAE,QAAQ,CAAC,MAAM;iBAC5B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBACvB,MAAM,IAAI,eAAe,CAAC,kCAAkC,EAAE;oBAC5D,IAAI,EAAE,gBAAgB,CAAC,iBAAiB;iBACzC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,IAAI,eAAe,CAAC,mCAAmC,EAAE;oBAC7D,IAAI,EAAE,gBAAgB,CAAC,mBAAmB;oBAC1C,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
|
package/dist/core-license.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { RequestHandler } from 'express';
|
|
2
2
|
import type { FastifyPluginAsync } from 'fastify';
|
|
3
|
+
import { LicensedModuleRegistry } from './runtime/licensed-module-registry.js';
|
|
4
|
+
import { LicensedServiceContainer } from './runtime/licensed-service-container.js';
|
|
3
5
|
import type { CoreLicenseEvent, CoreLicenseEventHandler, CoreLicenseOptions, ExpressGuardOptions, FastifyGuardOptions } from './types/options.js';
|
|
4
6
|
import type { Policy } from './types/policy.js';
|
|
5
7
|
import type { RuntimeConfig } from './types/runtime.js';
|
|
6
8
|
import type { LicenseStatus } from './types/status.js';
|
|
9
|
+
import type { BootstrapResult, ModuleDefinition, ServiceDefinition } from './types/bootstrap.js';
|
|
7
10
|
export declare class CoreLicense {
|
|
8
11
|
private options;
|
|
9
12
|
private readonly cache;
|
|
@@ -18,16 +21,25 @@ export declare class CoreLicense {
|
|
|
18
21
|
private runtimeConfig;
|
|
19
22
|
private backgroundTimer;
|
|
20
23
|
private booted;
|
|
24
|
+
private syncChain;
|
|
25
|
+
private readonly trustedApiUrl;
|
|
21
26
|
constructor(options: CoreLicenseOptions);
|
|
22
27
|
boot(): Promise<void>;
|
|
23
28
|
refresh(): Promise<LicenseStatus>;
|
|
24
29
|
requireActive(): Promise<void>;
|
|
25
30
|
requireFeature(feature: string): Promise<void>;
|
|
31
|
+
private ensureFeature;
|
|
26
32
|
checkLimit(limitName: string, currentValue: number): Promise<void>;
|
|
27
33
|
consumeQuota(quotaName: string, amount?: number): Promise<void>;
|
|
28
34
|
getStatus(): Promise<LicenseStatus>;
|
|
29
35
|
getPolicy(): Promise<Policy>;
|
|
30
36
|
getRuntimeConfig(): Promise<RuntimeConfig>;
|
|
37
|
+
createLicensedRegistry(): LicensedModuleRegistry;
|
|
38
|
+
createLicensedContainer(): LicensedServiceContainer;
|
|
39
|
+
bootstrap(options?: {
|
|
40
|
+
modules?: ModuleDefinition[];
|
|
41
|
+
services?: ServiceDefinition[];
|
|
42
|
+
}): Promise<BootstrapResult>;
|
|
31
43
|
express(options?: ExpressGuardOptions): RequestHandler;
|
|
32
44
|
fastifyPlugin(options?: FastifyGuardOptions): FastifyPluginAsync;
|
|
33
45
|
guardWorker(name: string): Promise<void>;
|
|
@@ -38,13 +50,19 @@ export declare class CoreLicense {
|
|
|
38
50
|
private ensureBooted;
|
|
39
51
|
private resolveStatus;
|
|
40
52
|
private shouldRefreshToken;
|
|
41
|
-
private
|
|
53
|
+
private syncFromServer;
|
|
54
|
+
private performSyncFromServer;
|
|
55
|
+
private callClientEndpoint;
|
|
56
|
+
private handleClientResponse;
|
|
57
|
+
private invalidatePolicy;
|
|
58
|
+
private updateCheckInterval;
|
|
42
59
|
private handleOfflineFallback;
|
|
43
60
|
private applyPolicyToken;
|
|
44
61
|
private verifyTokenWithResolver;
|
|
45
62
|
private verifyWithResolvedKeys;
|
|
46
63
|
private validatePolicyBinding;
|
|
47
64
|
private buildCheckRequest;
|
|
65
|
+
private buildActivateRequest;
|
|
48
66
|
private getUsage;
|
|
49
67
|
private runBackgroundRefresh;
|
|
50
68
|
private createApiClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-license.d.ts","sourceRoot":"","sources":["../src/core-license.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"core-license.d.ts","sourceRoot":"","sources":["../src/core-license.ts"],"names":[],"mappings":"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"}
|