@corelicense/node 0.2.0 → 0.5.1
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/LICENSE +21 -0
- package/README.md +55 -98
- 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/docs/api-reference.md +210 -0
- package/docs/installation.md +188 -0
- package/docs/integration.md +789 -0
- package/package.json +23 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CoreLicense
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,126 +1,83 @@
|
|
|
1
1
|
# @corelicense/node
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Runtime license và policy layer cho ứng dụng Node.js — không chỉ middleware HTTP, mà là lớp kiểm soát **bootstrap**, **module registry**, **DI**, **worker/CLI**, **quota** và **feature gate** theo policy đã ký.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Phiên bản:** `0.5.1`
|
|
6
|
+
**License:** [MIT](./LICENSE)
|
|
7
|
+
**Repository:** [github.com/trailanglc/corelicense](https://github.com/trailanglc/corelicense)
|
|
8
|
+
**Docs trực tuyến:** [corelicense.net/docs](https://corelicense.net/docs/nodejs-sdk/quick-start)
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
---
|
|
8
11
|
|
|
9
|
-
CoreLicense
|
|
12
|
+
## CoreLicense là gì?
|
|
10
13
|
|
|
11
|
-
|
|
14
|
+
CoreLicense gồm **License Server** (API Go) và **Node.js SDK** (package này). Admin cấp license key + policy (features, limits, quotas). SDK:
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
1. Kích hoạt / kiểm tra license với server
|
|
17
|
+
2. Verify **policy token** bằng public key (EdDSA)
|
|
18
|
+
3. Cache policy local, refresh định kỳ
|
|
19
|
+
4. Chặn runtime khi revoke / suspend / expired
|
|
20
|
+
5. (Tùy chọn) Chỉ bind module & service được cấp trong policy
|
|
16
21
|
|
|
17
|
-
|
|
22
|
+
---
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
npm install express # Express middleware
|
|
21
|
-
npm install fastify # Fastify plugin
|
|
22
|
-
npm install @nestjs/common # NestJS module/guard
|
|
23
|
-
```
|
|
24
|
+
## Tài liệu
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
| Tài liệu | Nội dung |
|
|
27
|
+
|----------|----------|
|
|
28
|
+
| [Cài đặt](./docs/installation.md) | `npm install`, biến môi trường, boot lần đầu, dev/prod |
|
|
29
|
+
| [Tích hợp](./docs/integration.md) | **Hướng dẫn chi tiết** — Express, Fastify, NestJS, registry/DI, worker, quota, production |
|
|
30
|
+
| [API Reference](./docs/api-reference.md) | Public API, options, error codes |
|
|
31
|
+
| [LICENSE](./LICENSE) | MIT |
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
> Dành cho agent / CI: đọc [docs/integration.md](./docs/integration.md) trước khi generate code tích hợp.
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Quick links
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm install @corelicense/node
|
|
32
41
|
```
|
|
33
42
|
|
|
34
|
-
`
|
|
35
|
-
`CORELICENSE_API_URL` **optional** — override thủ công (legacy key hoặc dev).
|
|
43
|
+
Production mặc định: `https://api.corelicense.net` — chỉ cần `CORELICENSE_KEY` + `CORELICENSE_PRODUCT_ID`.
|
|
36
44
|
|
|
37
45
|
```ts
|
|
38
|
-
import express from 'express';
|
|
39
46
|
import { CoreLicense, loadOptionsFromEnv } from '@corelicense/node';
|
|
40
47
|
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
const license = new CoreLicense(loadOptionsFromEnv({
|
|
44
|
-
cachePath: './storage/corelicense',
|
|
45
|
-
instance: {
|
|
46
|
-
strategy: 'install-id-domain-hash',
|
|
47
|
-
domain: process.env.APP_DOMAIN,
|
|
48
|
-
},
|
|
49
|
-
}));
|
|
50
|
-
|
|
51
|
-
async function main() {
|
|
52
|
-
await license.boot();
|
|
53
|
-
|
|
54
|
-
app.use(license.express({
|
|
55
|
-
allowPaths: ['/health', '/license/status'],
|
|
56
|
-
}));
|
|
57
|
-
|
|
58
|
-
app.get('/license/status', async (_req, res) => {
|
|
59
|
-
res.json(await license.getStatus());
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
app.listen(3000);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
main().catch(console.error);
|
|
48
|
+
const license = new CoreLicense(loadOptionsFromEnv({ cachePath: './storage/corelicense' }));
|
|
49
|
+
await license.boot();
|
|
66
50
|
```
|
|
67
51
|
|
|
68
|
-
|
|
52
|
+
Chi tiết: [docs/installation.md](./docs/installation.md) → [docs/integration.md](./docs/integration.md).
|
|
69
53
|
|
|
70
|
-
|
|
71
|
-
const license = new CoreLicense(loadOptionsFromEnv({
|
|
72
|
-
publicKey: process.env.CORELICENSE_PUBLIC_KEY, // pinned mode
|
|
73
|
-
}));
|
|
74
|
-
```
|
|
54
|
+
---
|
|
75
55
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
|
81
|
-
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `requireActive()` | Yêu cầu license active |
|
|
85
|
-
| `requireFeature(name)` | Kiểm tra feature flag |
|
|
86
|
-
| `checkLimit(name, value)` | Kiểm tra limit |
|
|
87
|
-
| `consumeQuota(name, amount?)` | Tiêu thụ quota local |
|
|
88
|
-
| `getStatus()` | Trạng thái license hiện tại |
|
|
89
|
-
| `getPolicy()` | Policy đang active |
|
|
90
|
-
| `getRuntimeConfig()` | Runtime config cho app bootstrap |
|
|
91
|
-
| `express(options?)` | Express middleware |
|
|
92
|
-
| `fastifyPlugin(options?)` | Fastify plugin |
|
|
93
|
-
| `guardWorker(name)` | Guard worker |
|
|
94
|
-
| `guardCommand(name)` | Guard CLI/cron command |
|
|
95
|
-
|
|
96
|
-
## Cấu trúc module
|
|
97
|
-
|
|
98
|
-
```txt
|
|
99
|
-
src/
|
|
100
|
-
core-license.ts # Class chính
|
|
101
|
-
types/ # TypeScript interfaces
|
|
102
|
-
errors/ # Error hierarchy
|
|
103
|
-
crypto/ # Policy token verification + public key resolver
|
|
104
|
-
client/ # License API + public keys client
|
|
105
|
-
cache/ # File/memory cache
|
|
106
|
-
instance/ # Instance ID resolution
|
|
107
|
-
guards/ # Express, Fastify, NestJS, worker, CLI
|
|
108
|
-
runtime/ # Runtime config, module registry, DI container
|
|
109
|
-
audit/ # Local audit log
|
|
110
|
-
events/ # Event bus
|
|
111
|
-
```
|
|
56
|
+
## Subpath exports
|
|
57
|
+
|
|
58
|
+
| Import | Mục đích |
|
|
59
|
+
|--------|----------|
|
|
60
|
+
| `@corelicense/node` | Core API |
|
|
61
|
+
| `@corelicense/node/express` | Express middleware |
|
|
62
|
+
| `@corelicense/node/fastify` | Fastify plugin |
|
|
63
|
+
| `@corelicense/node/nestjs` | NestJS module, guards, filter |
|
|
112
64
|
|
|
113
|
-
|
|
65
|
+
---
|
|
114
66
|
|
|
115
|
-
|
|
67
|
+
## Yêu cầu
|
|
116
68
|
|
|
117
|
-
|
|
69
|
+
- Node.js **≥ 18**
|
|
70
|
+
- License Server reachable (hoặc cache + offline grace hợp lệ)
|
|
118
71
|
|
|
119
|
-
|
|
120
|
-
- **v0.2** — Auto-fetch public keys, key rotation retry, worker/CLI guard, offline grace
|
|
121
|
-
- **v0.3** — Fastify, NestJS, module registry helper, quota usage
|
|
122
|
-
- **v1.0** — Stable API, production-ready, security review
|
|
72
|
+
---
|
|
123
73
|
|
|
124
|
-
##
|
|
74
|
+
## Changelog (tóm tắt)
|
|
125
75
|
|
|
126
|
-
|
|
76
|
+
| Version | Highlights |
|
|
77
|
+
|---------|------------|
|
|
78
|
+
| **0.5.1** | Tách tài liệu (installation, integration, api-reference), sửa repository URL |
|
|
79
|
+
| **0.5.0** | Fail-closed offline boot, quota/limit gates, apiUrl pin, sync mutex, Nest 403 filter |
|
|
80
|
+
| **0.4.x** | Deep integration (registry/DI), error `code` + `source`, runtime re-check |
|
|
81
|
+
| **0.3.x** | Production default URL, activate/revoke sync |
|
|
82
|
+
| **0.2.x** | Auto-fetch public keys, worker/CLI guard |
|
|
83
|
+
| **0.1.x** | Boot, express middleware, file cache |
|
|
@@ -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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"}
|