@corelicense/node 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +126 -0
  2. package/dist/audit/local-audit.d.ts +22 -0
  3. package/dist/audit/local-audit.d.ts.map +1 -0
  4. package/dist/audit/local-audit.js +21 -0
  5. package/dist/audit/local-audit.js.map +1 -0
  6. package/dist/cache/cache-store.d.ts +8 -0
  7. package/dist/cache/cache-store.d.ts.map +1 -0
  8. package/dist/cache/cache-store.js +2 -0
  9. package/dist/cache/cache-store.js.map +1 -0
  10. package/dist/cache/file-cache-store.d.ts +12 -0
  11. package/dist/cache/file-cache-store.d.ts.map +1 -0
  12. package/dist/cache/file-cache-store.js +64 -0
  13. package/dist/cache/file-cache-store.js.map +1 -0
  14. package/dist/cache/memory-cache-store.d.ts +9 -0
  15. package/dist/cache/memory-cache-store.d.ts.map +1 -0
  16. package/dist/cache/memory-cache-store.js +17 -0
  17. package/dist/cache/memory-cache-store.js.map +1 -0
  18. package/dist/client/license-api-client.d.ts +14 -0
  19. package/dist/client/license-api-client.d.ts.map +1 -0
  20. package/dist/client/license-api-client.js +36 -0
  21. package/dist/client/license-api-client.js.map +1 -0
  22. package/dist/client/public-keys-client.d.ts +11 -0
  23. package/dist/client/public-keys-client.d.ts.map +1 -0
  24. package/dist/client/public-keys-client.js +31 -0
  25. package/dist/client/public-keys-client.js.map +1 -0
  26. package/dist/core-license.d.ts +56 -0
  27. package/dist/core-license.d.ts.map +1 -0
  28. package/dist/core-license.js +411 -0
  29. package/dist/core-license.js.map +1 -0
  30. package/dist/crypto/key-loader.d.ts +4 -0
  31. package/dist/crypto/key-loader.d.ts.map +1 -0
  32. package/dist/crypto/key-loader.js +19 -0
  33. package/dist/crypto/key-loader.js.map +1 -0
  34. package/dist/crypto/public-key-resolver.d.ts +16 -0
  35. package/dist/crypto/public-key-resolver.d.ts.map +1 -0
  36. package/dist/crypto/public-key-resolver.js +61 -0
  37. package/dist/crypto/public-key-resolver.js.map +1 -0
  38. package/dist/crypto/verify-policy-token.d.ts +7 -0
  39. package/dist/crypto/verify-policy-token.d.ts.map +1 -0
  40. package/dist/crypto/verify-policy-token.js +47 -0
  41. package/dist/crypto/verify-policy-token.js.map +1 -0
  42. package/dist/env/load-options-from-env.d.ts +7 -0
  43. package/dist/env/load-options-from-env.d.ts.map +1 -0
  44. package/dist/env/load-options-from-env.js +34 -0
  45. package/dist/env/load-options-from-env.js.map +1 -0
  46. package/dist/env/resolve-api-url.d.ts +12 -0
  47. package/dist/env/resolve-api-url.d.ts.map +1 -0
  48. package/dist/env/resolve-api-url.js +44 -0
  49. package/dist/env/resolve-api-url.js.map +1 -0
  50. package/dist/errors/feature-error.d.ts +6 -0
  51. package/dist/errors/feature-error.d.ts.map +1 -0
  52. package/dist/errors/feature-error.js +10 -0
  53. package/dist/errors/feature-error.js.map +1 -0
  54. package/dist/errors/index.d.ts +5 -0
  55. package/dist/errors/index.d.ts.map +1 -0
  56. package/dist/errors/index.js +5 -0
  57. package/dist/errors/index.js.map +1 -0
  58. package/dist/errors/license-error.d.ts +22 -0
  59. package/dist/errors/license-error.d.ts.map +1 -0
  60. package/dist/errors/license-error.js +41 -0
  61. package/dist/errors/license-error.js.map +1 -0
  62. package/dist/errors/policy-error.d.ts +5 -0
  63. package/dist/errors/policy-error.d.ts.map +1 -0
  64. package/dist/errors/policy-error.js +8 -0
  65. package/dist/errors/policy-error.js.map +1 -0
  66. package/dist/errors/quota-error.d.ts +8 -0
  67. package/dist/errors/quota-error.d.ts.map +1 -0
  68. package/dist/errors/quota-error.js +14 -0
  69. package/dist/errors/quota-error.js.map +1 -0
  70. package/dist/events/event-bus.d.ts +17 -0
  71. package/dist/events/event-bus.d.ts.map +1 -0
  72. package/dist/events/event-bus.js +21 -0
  73. package/dist/events/event-bus.js.map +1 -0
  74. package/dist/guards/cli-guard.d.ts +3 -0
  75. package/dist/guards/cli-guard.d.ts.map +1 -0
  76. package/dist/guards/cli-guard.js +22 -0
  77. package/dist/guards/cli-guard.js.map +1 -0
  78. package/dist/guards/express-middleware.d.ts +5 -0
  79. package/dist/guards/express-middleware.d.ts.map +1 -0
  80. package/dist/guards/express-middleware.js +27 -0
  81. package/dist/guards/express-middleware.js.map +1 -0
  82. package/dist/guards/fastify-plugin.d.ts +9 -0
  83. package/dist/guards/fastify-plugin.d.ts.map +1 -0
  84. package/dist/guards/fastify-plugin.js +32 -0
  85. package/dist/guards/fastify-plugin.js.map +1 -0
  86. package/dist/guards/feature-guard.d.ts +3 -0
  87. package/dist/guards/feature-guard.d.ts.map +1 -0
  88. package/dist/guards/feature-guard.js +18 -0
  89. package/dist/guards/feature-guard.js.map +1 -0
  90. package/dist/guards/nest-guard.d.ts +8 -0
  91. package/dist/guards/nest-guard.d.ts.map +1 -0
  92. package/dist/guards/nest-guard.js +11 -0
  93. package/dist/guards/nest-guard.js.map +1 -0
  94. package/dist/guards/nest-module.d.ts +6 -0
  95. package/dist/guards/nest-module.d.ts.map +1 -0
  96. package/dist/guards/nest-module.js +21 -0
  97. package/dist/guards/nest-module.js.map +1 -0
  98. package/dist/guards/quota-guard.d.ts +7 -0
  99. package/dist/guards/quota-guard.d.ts.map +1 -0
  100. package/dist/guards/quota-guard.js +24 -0
  101. package/dist/guards/quota-guard.js.map +1 -0
  102. package/dist/guards/worker-guard.d.ts +3 -0
  103. package/dist/guards/worker-guard.d.ts.map +1 -0
  104. package/dist/guards/worker-guard.js +23 -0
  105. package/dist/guards/worker-guard.js.map +1 -0
  106. package/dist/index.d.ts +22 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +21 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/instance/install-id.d.ts +9 -0
  111. package/dist/instance/install-id.d.ts.map +1 -0
  112. package/dist/instance/install-id.js +27 -0
  113. package/dist/instance/install-id.js.map +1 -0
  114. package/dist/instance/instance-id.d.ts +9 -0
  115. package/dist/instance/instance-id.d.ts.map +1 -0
  116. package/dist/instance/instance-id.js +21 -0
  117. package/dist/instance/instance-id.js.map +1 -0
  118. package/dist/runtime/module-registry.d.ts +8 -0
  119. package/dist/runtime/module-registry.d.ts.map +1 -0
  120. package/dist/runtime/module-registry.js +19 -0
  121. package/dist/runtime/module-registry.js.map +1 -0
  122. package/dist/runtime/runtime-config.d.ts +4 -0
  123. package/dist/runtime/runtime-config.d.ts.map +1 -0
  124. package/dist/runtime/runtime-config.js +41 -0
  125. package/dist/runtime/runtime-config.js.map +1 -0
  126. package/dist/runtime/service-container.d.ts +9 -0
  127. package/dist/runtime/service-container.d.ts.map +1 -0
  128. package/dist/runtime/service-container.js +17 -0
  129. package/dist/runtime/service-container.js.map +1 -0
  130. package/dist/types/index.d.ts +7 -0
  131. package/dist/types/index.d.ts.map +1 -0
  132. package/dist/types/index.js +7 -0
  133. package/dist/types/index.js.map +1 -0
  134. package/dist/types/limits.d.ts +11 -0
  135. package/dist/types/limits.d.ts.map +1 -0
  136. package/dist/types/limits.js +2 -0
  137. package/dist/types/limits.js.map +1 -0
  138. package/dist/types/options.d.ts +62 -0
  139. package/dist/types/options.d.ts.map +1 -0
  140. package/dist/types/options.js +2 -0
  141. package/dist/types/options.js.map +1 -0
  142. package/dist/types/policy.d.ts +41 -0
  143. package/dist/types/policy.d.ts.map +1 -0
  144. package/dist/types/policy.js +2 -0
  145. package/dist/types/policy.js.map +1 -0
  146. package/dist/types/public-keys.d.ts +19 -0
  147. package/dist/types/public-keys.d.ts.map +1 -0
  148. package/dist/types/public-keys.js +2 -0
  149. package/dist/types/public-keys.js.map +1 -0
  150. package/dist/types/runtime.d.ts +11 -0
  151. package/dist/types/runtime.d.ts.map +1 -0
  152. package/dist/types/runtime.js +2 -0
  153. package/dist/types/runtime.js.map +1 -0
  154. package/dist/types/status.d.ts +14 -0
  155. package/dist/types/status.d.ts.map +1 -0
  156. package/dist/types/status.js +2 -0
  157. package/dist/types/status.js.map +1 -0
  158. package/package.json +74 -0
package/README.md ADDED
@@ -0,0 +1,126 @@
1
+ # @corelicense/node
2
+
3
+ CoreLicense Node.js SDK — runtime license và policy layer cho ứng dụng Node.js.
4
+
5
+ > **Trạng thái:** v0.2 — auto-fetch public key, offline grace, key rotation retry.
6
+
7
+ ## Triết lý
8
+
9
+ CoreLicense không chỉ là 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.
10
+
11
+ ## Cài đặt
12
+
13
+ ```bash
14
+ npm install @corelicense/node
15
+ ```
16
+
17
+ Peer dependencies tùy chọn (chỉ cài khi dùng integration tương ứng):
18
+
19
+ ```bash
20
+ npm install express # Express middleware
21
+ npm install fastify # Fastify plugin
22
+ npm install @nestjs/common # NestJS module/guard
23
+ ```
24
+
25
+ ## Quick start
26
+
27
+ Chỉ cần **2 biến môi trường** — license key mới (CL1.*) đã nhúng domain license server:
28
+
29
+ ```env
30
+ CORELICENSE_KEY=CL1.xxxxx.CL-AAAAA-BBBBB-...
31
+ CORELICENSE_PRODUCT_ID=demo
32
+ ```
33
+
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).
36
+
37
+ ```ts
38
+ import express from 'express';
39
+ import { CoreLicense, loadOptionsFromEnv } from '@corelicense/node';
40
+
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);
66
+ ```
67
+
68
+ ### Pin public key (optional)
69
+
70
+ ```ts
71
+ const license = new CoreLicense(loadOptionsFromEnv({
72
+ publicKey: process.env.CORELICENSE_PUBLIC_KEY, // pinned mode
73
+ }));
74
+ ```
75
+
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 | Mô 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
+ ```
112
+
113
+ ## Tài liệu thiết kế
114
+
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).
116
+
117
+ ## Roadmap
118
+
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
123
+
124
+ ## License
125
+
126
+ MIT
@@ -0,0 +1,22 @@
1
+ export interface AuditEntry {
2
+ time: string;
3
+ event: string;
4
+ status?: string;
5
+ policyVersion?: string;
6
+ feature?: string;
7
+ quotaName?: string;
8
+ amount?: number;
9
+ total?: number;
10
+ offline?: boolean;
11
+ message?: string;
12
+ }
13
+ export interface LocalAuditOptions {
14
+ enabled?: boolean;
15
+ path?: string;
16
+ }
17
+ export declare class LocalAudit {
18
+ private readonly options;
19
+ constructor(options: LocalAuditOptions);
20
+ log(entry: Pick<AuditEntry, 'event'> & Partial<Omit<AuditEntry, 'time' | 'event'>>): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=local-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-audit.d.ts","sourceRoot":"","sources":["../../src/audit/local-audit.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAEjD,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAczG"}
@@ -0,0 +1,21 @@
1
+ import { appendFile, mkdir } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ export class LocalAudit {
4
+ options;
5
+ constructor(options) {
6
+ this.options = options;
7
+ }
8
+ async log(entry) {
9
+ if (this.options.enabled === false) {
10
+ return;
11
+ }
12
+ const path = this.options.path ?? './storage/logs/corelicense.log';
13
+ const record = {
14
+ time: new Date().toISOString(),
15
+ ...entry,
16
+ };
17
+ await mkdir(dirname(path), { recursive: true });
18
+ await appendFile(path, `${JSON.stringify(record)}\n`, 'utf8');
19
+ }
20
+ }
21
+ //# sourceMappingURL=local-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-audit.js","sourceRoot":"","sources":["../../src/audit/local-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAE3D,KAAK,CAAC,GAAG,CAAC,KAA8E;QACtF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,gCAAgC,CAAC;QACnE,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9B,GAAG,KAAK;SACT,CAAC;QAEF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export type CacheKey = 'policy.token' | 'instance.json' | 'runtime.json' | 'usage.json' | 'public.keys.json' | 'sdk.endpoint.json';
2
+ export interface CacheStore {
3
+ get<T>(key: CacheKey): Promise<T | null>;
4
+ set<T>(key: CacheKey, value: T): Promise<void>;
5
+ delete(key: CacheKey): Promise<void>;
6
+ has(key: CacheKey): Promise<boolean>;
7
+ }
8
+ //# sourceMappingURL=cache-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-store.d.ts","sourceRoot":"","sources":["../../src/cache/cache-store.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,cAAc,GACd,eAAe,GACf,cAAc,GACd,YAAY,GACZ,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cache-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-store.js","sourceRoot":"","sources":["../../src/cache/cache-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { CacheKey, CacheStore } from './cache-store.js';
2
+ export declare class FileCacheStore implements CacheStore {
3
+ private readonly basePath;
4
+ constructor(basePath: string);
5
+ private resolvePath;
6
+ private ensureDir;
7
+ get<T>(key: CacheKey): Promise<T | null>;
8
+ set<T>(key: CacheKey, value: T): Promise<void>;
9
+ delete(key: CacheKey): Promise<void>;
10
+ has(key: CacheKey): Promise<boolean>;
11
+ }
12
+ //# sourceMappingURL=file-cache-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-cache-store.d.ts","sourceRoot":"","sources":["../../src/cache/file-cache-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAW7D,qBAAa,cAAe,YAAW,UAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,OAAO,CAAC,WAAW;YAIL,SAAS;IAIjB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAgBxC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAU3C"}
@@ -0,0 +1,64 @@
1
+ import { mkdir, readFile, writeFile, unlink, access } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ const KEY_TO_FILENAME = {
4
+ 'policy.token': 'policy.token',
5
+ 'instance.json': 'instance.json',
6
+ 'runtime.json': 'runtime.json',
7
+ 'usage.json': 'usage.json',
8
+ 'public.keys.json': 'public.keys.json',
9
+ 'sdk.endpoint.json': 'sdk.endpoint.json',
10
+ };
11
+ export class FileCacheStore {
12
+ basePath;
13
+ constructor(basePath) {
14
+ this.basePath = basePath;
15
+ }
16
+ resolvePath(key) {
17
+ return join(this.basePath, KEY_TO_FILENAME[key]);
18
+ }
19
+ async ensureDir() {
20
+ await mkdir(this.basePath, { recursive: true });
21
+ }
22
+ async get(key) {
23
+ const filePath = this.resolvePath(key);
24
+ try {
25
+ const raw = await readFile(filePath, 'utf8');
26
+ if (key === 'policy.token') {
27
+ return raw;
28
+ }
29
+ return JSON.parse(raw);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ async set(key, value) {
36
+ await this.ensureDir();
37
+ const filePath = this.resolvePath(key);
38
+ if (key === 'policy.token') {
39
+ await writeFile(filePath, String(value), 'utf8');
40
+ return;
41
+ }
42
+ await writeFile(filePath, JSON.stringify(value, null, 2), 'utf8');
43
+ }
44
+ async delete(key) {
45
+ const filePath = this.resolvePath(key);
46
+ try {
47
+ await unlink(filePath);
48
+ }
49
+ catch {
50
+ // ignore missing file
51
+ }
52
+ }
53
+ async has(key) {
54
+ const filePath = this.resolvePath(key);
55
+ try {
56
+ await access(filePath);
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ }
64
+ //# sourceMappingURL=file-cache-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-cache-store.js","sourceRoot":"","sources":["../../src/cache/file-cache-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,eAAe,GAA6B;IAChD,cAAc,EAAE,cAAc;IAC9B,eAAe,EAAE,eAAe;IAChC,cAAc,EAAE,cAAc;IAC9B,YAAY,EAAE,YAAY;IAC1B,kBAAkB,EAAE,kBAAkB;IACtC,mBAAmB,EAAE,mBAAmB;CACzC,CAAC;AAEF,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEzC,WAAW,CAAC,GAAa;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAa;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE7C,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;gBAC3B,OAAO,GAAQ,CAAC;YAClB,CAAC;YAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAa,EAAE,KAAQ;QAClC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAa;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAa;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ import type { CacheKey, CacheStore } from './cache-store.js';
2
+ export declare class MemoryCacheStore implements CacheStore {
3
+ private readonly store;
4
+ get<T>(key: CacheKey): Promise<T | null>;
5
+ set<T>(key: CacheKey, value: T): Promise<void>;
6
+ delete(key: CacheKey): Promise<void>;
7
+ has(key: CacheKey): Promise<boolean>;
8
+ }
9
+ //# sourceMappingURL=memory-cache-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cache-store.d.ts","sourceRoot":"","sources":["../../src/cache/memory-cache-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE7D,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEhD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAKxC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;CAG3C"}
@@ -0,0 +1,17 @@
1
+ export class MemoryCacheStore {
2
+ store = new Map();
3
+ async get(key) {
4
+ const value = this.store.get(key);
5
+ return value !== undefined ? value : null;
6
+ }
7
+ async set(key, value) {
8
+ this.store.set(key, value);
9
+ }
10
+ async delete(key) {
11
+ this.store.delete(key);
12
+ }
13
+ async has(key) {
14
+ return this.store.has(key);
15
+ }
16
+ }
17
+ //# sourceMappingURL=memory-cache-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-cache-store.js","sourceRoot":"","sources":["../../src/cache/memory-cache-store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,gBAAgB;IACV,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEtD,KAAK,CAAC,GAAG,CAAI,GAAa;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAE,KAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,GAAa,EAAE,KAAQ;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAa;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAa;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { LicenseCheckRequest, LicenseCheckResponse } from '../types/options.js';
2
+ export interface LicenseApiClientOptions {
3
+ apiUrl: string;
4
+ requestTimeoutMs?: number;
5
+ }
6
+ export declare class LicenseApiClient {
7
+ private readonly options;
8
+ constructor(options: LicenseApiClientOptions);
9
+ activate(request: LicenseCheckRequest): Promise<LicenseCheckResponse>;
10
+ check(request: LicenseCheckRequest): Promise<LicenseCheckResponse>;
11
+ refresh(request: LicenseCheckRequest): Promise<LicenseCheckResponse>;
12
+ private post;
13
+ }
14
+ //# sourceMappingURL=license-api-client.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,36 @@
1
+ export class LicenseApiClient {
2
+ options;
3
+ constructor(options) {
4
+ this.options = options;
5
+ }
6
+ async activate(request) {
7
+ return this.post('/v1/client/activate', request);
8
+ }
9
+ async check(request) {
10
+ return this.post('/v1/client/check', request);
11
+ }
12
+ async refresh(request) {
13
+ return this.post('/v1/client/refresh', request);
14
+ }
15
+ async post(path, body) {
16
+ const url = new URL(path, this.options.apiUrl);
17
+ const controller = new AbortController();
18
+ const timeout = setTimeout(() => controller.abort(), this.options.requestTimeoutMs ?? 5000);
19
+ try {
20
+ const response = await fetch(url, {
21
+ method: 'POST',
22
+ headers: { 'Content-Type': 'application/json' },
23
+ body: JSON.stringify(body),
24
+ signal: controller.signal,
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`License API error: ${response.status} ${response.statusText}`);
28
+ }
29
+ return (await response.json());
30
+ }
31
+ finally {
32
+ clearTimeout(timeout);
33
+ }
34
+ }
35
+ }
36
+ //# sourceMappingURL=license-api-client.js.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ import type { ProductKeysResponse } from '../types/public-keys.js';
2
+ export interface PublicKeysClientOptions {
3
+ apiUrl: string;
4
+ requestTimeoutMs?: number;
5
+ }
6
+ export declare class PublicKeysClient {
7
+ private readonly options;
8
+ constructor(options: PublicKeysClientOptions);
9
+ fetchProductKeys(productId: string): Promise<ProductKeysResponse>;
10
+ }
11
+ //# sourceMappingURL=public-keys-client.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,31 @@
1
+ export class PublicKeysClient {
2
+ options;
3
+ constructor(options) {
4
+ this.options = options;
5
+ }
6
+ async fetchProductKeys(productId) {
7
+ const path = `/v1/public/products/${encodeURIComponent(productId)}/keys`;
8
+ const url = new URL(path, this.options.apiUrl);
9
+ const controller = new AbortController();
10
+ const timeout = setTimeout(() => controller.abort(), this.options.requestTimeoutMs ?? 5000);
11
+ try {
12
+ const response = await fetch(url, {
13
+ method: 'GET',
14
+ headers: { Accept: 'application/json' },
15
+ signal: controller.signal,
16
+ });
17
+ if (!response.ok) {
18
+ throw new Error(`Public keys API error: ${response.status} ${response.statusText}`);
19
+ }
20
+ const data = (await response.json());
21
+ if (!data.keys?.length) {
22
+ throw new Error('Public keys API returned no keys');
23
+ }
24
+ return data;
25
+ }
26
+ finally {
27
+ clearTimeout(timeout);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=public-keys-client.js.map
@@ -0,0 +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"}
@@ -0,0 +1,56 @@
1
+ import type { RequestHandler } from 'express';
2
+ import type { FastifyPluginAsync } from 'fastify';
3
+ import type { CoreLicenseEvent, CoreLicenseEventHandler, CoreLicenseOptions, ExpressGuardOptions, FastifyGuardOptions } from './types/options.js';
4
+ import type { Policy } from './types/policy.js';
5
+ import type { RuntimeConfig } from './types/runtime.js';
6
+ import type { LicenseStatus } from './types/status.js';
7
+ export declare class CoreLicense {
8
+ private options;
9
+ private readonly cache;
10
+ private apiClient;
11
+ private publicKeyResolver;
12
+ private readonly audit;
13
+ private readonly events;
14
+ private readonly installIdStore;
15
+ private instanceId;
16
+ private resolvedProductId;
17
+ private policy;
18
+ private runtimeConfig;
19
+ private backgroundTimer;
20
+ private booted;
21
+ constructor(options: CoreLicenseOptions);
22
+ boot(): Promise<void>;
23
+ refresh(): Promise<LicenseStatus>;
24
+ requireActive(): Promise<void>;
25
+ requireFeature(feature: string): Promise<void>;
26
+ checkLimit(limitName: string, currentValue: number): Promise<void>;
27
+ consumeQuota(quotaName: string, amount?: number): Promise<void>;
28
+ getStatus(): Promise<LicenseStatus>;
29
+ getPolicy(): Promise<Policy>;
30
+ getRuntimeConfig(): Promise<RuntimeConfig>;
31
+ express(options?: ExpressGuardOptions): RequestHandler;
32
+ fastifyPlugin(options?: FastifyGuardOptions): FastifyPluginAsync;
33
+ guardWorker(name: string): Promise<void>;
34
+ guardCommand(name: string): Promise<void>;
35
+ startBackgroundCheck(): void;
36
+ stopBackgroundCheck(): void;
37
+ on<E extends CoreLicenseEvent>(event: E, handler: CoreLicenseEventHandler): void;
38
+ private ensureBooted;
39
+ private resolveStatus;
40
+ private shouldRefreshToken;
41
+ private refreshFromServer;
42
+ private handleOfflineFallback;
43
+ private applyPolicyToken;
44
+ private verifyTokenWithResolver;
45
+ private verifyWithResolvedKeys;
46
+ private validatePolicyBinding;
47
+ private buildCheckRequest;
48
+ private getUsage;
49
+ private runBackgroundRefresh;
50
+ private createApiClient;
51
+ private createPublicKeyResolver;
52
+ private ensureApiEndpoint;
53
+ private persistApiUrlFromResponse;
54
+ private setApiUrl;
55
+ }
56
+ //# sourceMappingURL=core-license.d.ts.map
@@ -0,0 +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"}