@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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +55 -98
  3. package/dist/client/license-api-client.d.ts +3 -2
  4. package/dist/client/license-api-client.d.ts.map +1 -1
  5. package/dist/client/license-api-client.js +44 -4
  6. package/dist/client/license-api-client.js.map +1 -1
  7. package/dist/client/map-client-error.d.ts +5 -0
  8. package/dist/client/map-client-error.d.ts.map +1 -0
  9. package/dist/client/map-client-error.js +63 -0
  10. package/dist/client/map-client-error.js.map +1 -0
  11. package/dist/client/public-keys-client.d.ts.map +1 -1
  12. package/dist/client/public-keys-client.js +20 -2
  13. package/dist/client/public-keys-client.js.map +1 -1
  14. package/dist/core-license.d.ts +19 -1
  15. package/dist/core-license.d.ts.map +1 -1
  16. package/dist/core-license.js +195 -51
  17. package/dist/core-license.js.map +1 -1
  18. package/dist/crypto/verify-policy-token.d.ts.map +1 -1
  19. package/dist/crypto/verify-policy-token.js +75 -5
  20. package/dist/crypto/verify-policy-token.js.map +1 -1
  21. package/dist/env/load-options-from-env.d.ts.map +1 -1
  22. package/dist/env/load-options-from-env.js +2 -1
  23. package/dist/env/load-options-from-env.js.map +1 -1
  24. package/dist/env/resolve-api-url.js +1 -1
  25. package/dist/env/resolve-api-url.js.map +1 -1
  26. package/dist/errors/api-error.d.ts +17 -0
  27. package/dist/errors/api-error.d.ts.map +1 -0
  28. package/dist/errors/api-error.js +43 -0
  29. package/dist/errors/api-error.js.map +1 -0
  30. package/dist/errors/codes.d.ts +40 -0
  31. package/dist/errors/codes.d.ts.map +1 -0
  32. package/dist/errors/codes.js +39 -0
  33. package/dist/errors/codes.js.map +1 -0
  34. package/dist/errors/config-error.d.ts +7 -0
  35. package/dist/errors/config-error.d.ts.map +1 -0
  36. package/dist/errors/config-error.js +21 -0
  37. package/dist/errors/config-error.js.map +1 -0
  38. package/dist/errors/feature-error.d.ts +2 -1
  39. package/dist/errors/feature-error.d.ts.map +1 -1
  40. package/dist/errors/feature-error.js +13 -2
  41. package/dist/errors/feature-error.js.map +1 -1
  42. package/dist/errors/index.d.ts +6 -0
  43. package/dist/errors/index.d.ts.map +1 -1
  44. package/dist/errors/index.js +6 -0
  45. package/dist/errors/index.js.map +1 -1
  46. package/dist/errors/license-error.d.ts +48 -7
  47. package/dist/errors/license-error.d.ts.map +1 -1
  48. package/dist/errors/license-error.js +104 -14
  49. package/dist/errors/license-error.js.map +1 -1
  50. package/dist/errors/module-error.d.ts +7 -0
  51. package/dist/errors/module-error.d.ts.map +1 -0
  52. package/dist/errors/module-error.js +20 -0
  53. package/dist/errors/module-error.js.map +1 -0
  54. package/dist/errors/policy-error.d.ts +10 -1
  55. package/dist/errors/policy-error.d.ts.map +1 -1
  56. package/dist/errors/policy-error.js +16 -2
  57. package/dist/errors/policy-error.js.map +1 -1
  58. package/dist/errors/quota-error.d.ts +2 -1
  59. package/dist/errors/quota-error.d.ts.map +1 -1
  60. package/dist/errors/quota-error.js +15 -2
  61. package/dist/errors/quota-error.js.map +1 -1
  62. package/dist/errors/runtime-error.d.ts +12 -0
  63. package/dist/errors/runtime-error.d.ts.map +1 -0
  64. package/dist/errors/runtime-error.js +37 -0
  65. package/dist/errors/runtime-error.js.map +1 -0
  66. package/dist/errors/throw-for-status.d.ts +3 -0
  67. package/dist/errors/throw-for-status.d.ts.map +1 -0
  68. package/dist/errors/throw-for-status.js +21 -0
  69. package/dist/errors/throw-for-status.js.map +1 -0
  70. package/dist/guards/cli-guard.d.ts.map +1 -1
  71. package/dist/guards/cli-guard.js +12 -6
  72. package/dist/guards/cli-guard.js.map +1 -1
  73. package/dist/guards/express-middleware.d.ts.map +1 -1
  74. package/dist/guards/express-middleware.js +1 -5
  75. package/dist/guards/express-middleware.js.map +1 -1
  76. package/dist/guards/express-routes.d.ts +9 -0
  77. package/dist/guards/express-routes.d.ts.map +1 -0
  78. package/dist/guards/express-routes.js +12 -0
  79. package/dist/guards/express-routes.js.map +1 -0
  80. package/dist/guards/fastify-plugin.d.ts.map +1 -1
  81. package/dist/guards/fastify-plugin.js +1 -5
  82. package/dist/guards/fastify-plugin.js.map +1 -1
  83. package/dist/guards/feature-guard.d.ts +1 -0
  84. package/dist/guards/feature-guard.d.ts.map +1 -1
  85. package/dist/guards/feature-guard.js +14 -0
  86. package/dist/guards/feature-guard.js.map +1 -1
  87. package/dist/guards/nest-exception-filter.d.ts +6 -0
  88. package/dist/guards/nest-exception-filter.d.ts.map +1 -0
  89. package/dist/guards/nest-exception-filter.js +60 -0
  90. package/dist/guards/nest-exception-filter.js.map +1 -0
  91. package/dist/guards/nest-feature-guard.d.ts +10 -0
  92. package/dist/guards/nest-feature-guard.d.ts.map +1 -0
  93. package/dist/guards/nest-feature-guard.js +72 -0
  94. package/dist/guards/nest-feature-guard.js.map +1 -0
  95. package/dist/guards/nest-module.d.ts +3 -0
  96. package/dist/guards/nest-module.d.ts.map +1 -1
  97. package/dist/guards/nest-module.js +13 -2
  98. package/dist/guards/nest-module.js.map +1 -1
  99. package/dist/guards/nestjs.d.ts +6 -0
  100. package/dist/guards/nestjs.d.ts.map +1 -0
  101. package/dist/guards/nestjs.js +6 -0
  102. package/dist/guards/nestjs.js.map +1 -0
  103. package/dist/guards/quota-guard.d.ts.map +1 -1
  104. package/dist/guards/quota-guard.js +6 -1
  105. package/dist/guards/quota-guard.js.map +1 -1
  106. package/dist/guards/require-feature.decorator.d.ts +3 -0
  107. package/dist/guards/require-feature.decorator.d.ts.map +1 -0
  108. package/dist/guards/require-feature.decorator.js +4 -0
  109. package/dist/guards/require-feature.decorator.js.map +1 -0
  110. package/dist/guards/worker-guard.d.ts.map +1 -1
  111. package/dist/guards/worker-guard.js +8 -6
  112. package/dist/guards/worker-guard.js.map +1 -1
  113. package/dist/index.d.ts +6 -0
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +5 -0
  116. package/dist/index.js.map +1 -1
  117. package/dist/instance/domain-hash.d.ts +3 -0
  118. package/dist/instance/domain-hash.d.ts.map +1 -0
  119. package/dist/instance/domain-hash.js +11 -0
  120. package/dist/instance/domain-hash.js.map +1 -0
  121. package/dist/instance/instance-id.d.ts.map +1 -1
  122. package/dist/instance/instance-id.js +1 -6
  123. package/dist/instance/instance-id.js.map +1 -1
  124. package/dist/runtime/licensed-module-registry.d.ts +22 -0
  125. package/dist/runtime/licensed-module-registry.d.ts.map +1 -0
  126. package/dist/runtime/licensed-module-registry.js +80 -0
  127. package/dist/runtime/licensed-module-registry.js.map +1 -0
  128. package/dist/runtime/licensed-service-container.d.ts +23 -0
  129. package/dist/runtime/licensed-service-container.d.ts.map +1 -0
  130. package/dist/runtime/licensed-service-container.js +89 -0
  131. package/dist/runtime/licensed-service-container.js.map +1 -0
  132. package/dist/runtime/licensed-service.d.ts +7 -0
  133. package/dist/runtime/licensed-service.d.ts.map +1 -0
  134. package/dist/runtime/licensed-service.js +10 -0
  135. package/dist/runtime/licensed-service.js.map +1 -0
  136. package/dist/runtime/module-registry.d.ts.map +1 -1
  137. package/dist/runtime/module-registry.js +2 -1
  138. package/dist/runtime/module-registry.js.map +1 -1
  139. package/dist/runtime/service-container.d.ts.map +1 -1
  140. package/dist/runtime/service-container.js +2 -1
  141. package/dist/runtime/service-container.js.map +1 -1
  142. package/dist/types/bootstrap.d.ts +32 -0
  143. package/dist/types/bootstrap.d.ts.map +1 -0
  144. package/dist/types/bootstrap.js +2 -0
  145. package/dist/types/bootstrap.js.map +1 -0
  146. package/dist/types/index.d.ts +1 -0
  147. package/dist/types/index.d.ts.map +1 -1
  148. package/dist/types/index.js +1 -0
  149. package/dist/types/index.js.map +1 -1
  150. package/dist/types/options.d.ts +14 -3
  151. package/dist/types/options.d.ts.map +1 -1
  152. package/dist/types/policy.d.ts +2 -0
  153. package/dist/types/policy.d.ts.map +1 -1
  154. package/docs/api-reference.md +210 -0
  155. package/docs/installation.md +188 -0
  156. package/docs/integration.md +789 -0
  157. 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
- CoreLicense Node.js SDK — runtime license và policy layer cho ứng dụng Node.js.
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
- > **Trạng thái:** v0.2 — auto-fetch public key, offline grace, key rotation retry.
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
- ## Triết lý
10
+ ---
8
11
 
9
- CoreLicense không chỉ middleware. SDK được thiết kế như một **Runtime Layer** nằm sâu trong bootstrap, runtime config, module registry, service guard, worker/CLI guard và quota enforcement.
12
+ ## CoreLicense là gì?
10
13
 
11
- ## Cài đặt
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
- ```bash
14
- npm install @corelicense/node
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
- Peer dependencies tùy chọn (chỉ cài khi dùng integration tương ứng):
22
+ ---
18
23
 
19
- ```bash
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
- ## Quick start
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
- Chỉ cần **2 biến môi trường** license key mới (CL1.*) đã nhúng domain license server:
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
- ```env
30
- CORELICENSE_KEY=CL1.xxxxx.CL-AAAAA-BBBBB-...
31
- CORELICENSE_PRODUCT_ID=demo
35
+ ---
36
+
37
+ ## Quick links
38
+
39
+ ```bash
40
+ npm install @corelicense/node
32
41
  ```
33
42
 
34
- `CORELICENSE_PUBLIC_KEY` **optional** pin public key (enterprise / air-gapped).
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 app = express();
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
- ### Pin public key (optional)
52
+ Chi tiết: [docs/installation.md](./docs/installation.md) [docs/integration.md](./docs/integration.md).
69
53
 
70
- ```ts
71
- const license = new CoreLicense(loadOptionsFromEnv({
72
- publicKey: process.env.CORELICENSE_PUBLIC_KEY, // pinned mode
73
- }));
74
- ```
54
+ ---
75
55
 
76
- Khi pin, SDK không fetch keys từ server. Nếu verify fail sau key rotation, cập nhật `CORELICENSE_PUBLIC_KEY` thủ công.
77
-
78
- ## Public API
79
-
80
- | Method | tả |
81
- |--------|-------|
82
- | `boot()` | Khởi tạo SDK, fetch/cache public keys, load cache, verify token |
83
- | `refresh()` | Refresh policy token từ server |
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
- ## Tài liệu thiết kế
65
+ ---
114
66
 
115
- Xem [CoreLicense Node.js SDK — Tài liệu thiết kế & tích hợp sâu](../../docs/CoreLicense_NodeJS_SDK_Deep_Integration.md).
67
+ ## Yêu cầu
116
68
 
117
- ## Roadmap
69
+ - Node.js **≥ 18**
70
+ - License Server reachable (hoặc cache + offline grace hợp lệ)
118
71
 
119
- - **v0.1** — Types, errors, boot, express middleware, file cache, local audit
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
- ## License
74
+ ## Changelog (tóm tắt)
125
75
 
126
- MIT
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: LicenseCheckRequest): Promise<LicenseCheckResponse>;
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,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAErF,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,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIrE,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIlE,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAI5D,IAAI;CA4BnB"}
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.post('/v1/client/activate', request);
11
+ return this.postWithRetry('/v1/client/activate', request);
8
12
  }
9
13
  async check(request) {
10
- return this.post('/v1/client/check', request);
14
+ return this.postWithRetry('/v1/client/check', request);
11
15
  }
12
16
  async refresh(request) {
13
- return this.post('/v1/client/refresh', request);
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 Error(`License API error: ${response.status} ${response.statusText}`);
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":"AAOA,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;IAAG,CAAC;IAEjE,KAAK,CAAC,QAAQ,CAAC,OAA4B;QACzC,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA4B;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,IAAI,CAChB,IAAY,EACZ,IAAyB;QAEzB,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,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAClF,CAAC;YAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
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;AAEnE,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;CA8BxE"}
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 Error(`Public keys API error: ${response.status} ${response.statusText}`);
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 Error('Public keys API returned no keys');
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":"AAOA,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,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACtF,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,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
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"}
@@ -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 refreshFromServer;
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;AA+BlD,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAsB,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMvD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAG2B;IAE1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IAEpD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,kBAAkB;IAwBjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA8CrB,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAKjC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB9B,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1D,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAKnC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAU5B,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAUhD,OAAO,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc;IAItD,aAAa,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,kBAAkB;IAI1D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,oBAAoB,IAAI,IAAI;IAc5B,mBAAmB,IAAI,IAAI;IAO3B,EAAE,CAAC,CAAC,SAAS,gBAAgB,EAC3B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,uBAAuB,GAC/B,IAAI;IAIP,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,kBAAkB;YAUZ,iBAAiB;YAuBjB,qBAAqB;YAgBrB,gBAAgB;YA0ChB,uBAAuB;YAmBvB,sBAAsB;IASpC,OAAO,CAAC,qBAAqB;YAcf,iBAAiB;YAmBjB,QAAQ;YAaR,oBAAoB;IAWlC,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,uBAAuB;YAajB,iBAAiB;YASjB,yBAAyB;IAavC,OAAO,CAAC,SAAS;CAKlB"}
1
+ {"version":3,"file":"core-license.d.ts","sourceRoot":"","sources":["../src/core-license.ts"],"names":[],"mappings":"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"}