@jackle.dev/zalox 1.0.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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +185 -0
  3. package/dist/cli/commands/admin.d.ts +17 -0
  4. package/dist/cli/commands/admin.d.ts.map +1 -0
  5. package/dist/cli/commands/admin.js +359 -0
  6. package/dist/cli/commands/admin.js.map +1 -0
  7. package/dist/cli/commands/auth.d.ts +3 -0
  8. package/dist/cli/commands/auth.d.ts.map +1 -0
  9. package/dist/cli/commands/auth.js +88 -0
  10. package/dist/cli/commands/auth.js.map +1 -0
  11. package/dist/cli/commands/autoreply.d.ts +12 -0
  12. package/dist/cli/commands/autoreply.d.ts.map +1 -0
  13. package/dist/cli/commands/autoreply.js +162 -0
  14. package/dist/cli/commands/autoreply.js.map +1 -0
  15. package/dist/cli/commands/bulk.d.ts +9 -0
  16. package/dist/cli/commands/bulk.d.ts.map +1 -0
  17. package/dist/cli/commands/bulk.js +169 -0
  18. package/dist/cli/commands/bulk.js.map +1 -0
  19. package/dist/cli/commands/config.d.ts +14 -0
  20. package/dist/cli/commands/config.d.ts.map +1 -0
  21. package/dist/cli/commands/config.js +122 -0
  22. package/dist/cli/commands/config.js.map +1 -0
  23. package/dist/cli/commands/conv.d.ts +3 -0
  24. package/dist/cli/commands/conv.d.ts.map +1 -0
  25. package/dist/cli/commands/conv.js +229 -0
  26. package/dist/cli/commands/conv.js.map +1 -0
  27. package/dist/cli/commands/daemon.d.ts +13 -0
  28. package/dist/cli/commands/daemon.d.ts.map +1 -0
  29. package/dist/cli/commands/daemon.js +102 -0
  30. package/dist/cli/commands/daemon.js.map +1 -0
  31. package/dist/cli/commands/export.d.ts +10 -0
  32. package/dist/cli/commands/export.d.ts.map +1 -0
  33. package/dist/cli/commands/export.js +98 -0
  34. package/dist/cli/commands/export.js.map +1 -0
  35. package/dist/cli/commands/friend.d.ts +13 -0
  36. package/dist/cli/commands/friend.d.ts.map +1 -0
  37. package/dist/cli/commands/friend.js +337 -0
  38. package/dist/cli/commands/friend.js.map +1 -0
  39. package/dist/cli/commands/group-settings.d.ts +11 -0
  40. package/dist/cli/commands/group-settings.d.ts.map +1 -0
  41. package/dist/cli/commands/group-settings.js +154 -0
  42. package/dist/cli/commands/group-settings.js.map +1 -0
  43. package/dist/cli/commands/group.d.ts +14 -0
  44. package/dist/cli/commands/group.d.ts.map +1 -0
  45. package/dist/cli/commands/group.js +365 -0
  46. package/dist/cli/commands/group.js.map +1 -0
  47. package/dist/cli/commands/license.d.ts +13 -0
  48. package/dist/cli/commands/license.d.ts.map +1 -0
  49. package/dist/cli/commands/license.js +218 -0
  50. package/dist/cli/commands/license.js.map +1 -0
  51. package/dist/cli/commands/listen.d.ts +3 -0
  52. package/dist/cli/commands/listen.d.ts.map +1 -0
  53. package/dist/cli/commands/listen.js +177 -0
  54. package/dist/cli/commands/listen.js.map +1 -0
  55. package/dist/cli/commands/me.d.ts +9 -0
  56. package/dist/cli/commands/me.d.ts.map +1 -0
  57. package/dist/cli/commands/me.js +135 -0
  58. package/dist/cli/commands/me.js.map +1 -0
  59. package/dist/cli/commands/msg.d.ts +11 -0
  60. package/dist/cli/commands/msg.d.ts.map +1 -0
  61. package/dist/cli/commands/msg.js +255 -0
  62. package/dist/cli/commands/msg.js.map +1 -0
  63. package/dist/cli/commands/profile.d.ts +3 -0
  64. package/dist/cli/commands/profile.d.ts.map +1 -0
  65. package/dist/cli/commands/profile.js +50 -0
  66. package/dist/cli/commands/profile.js.map +1 -0
  67. package/dist/cli/commands/schedule.d.ts +12 -0
  68. package/dist/cli/commands/schedule.d.ts.map +1 -0
  69. package/dist/cli/commands/schedule.js +175 -0
  70. package/dist/cli/commands/schedule.js.map +1 -0
  71. package/dist/cli/commands/serve.d.ts +3 -0
  72. package/dist/cli/commands/serve.d.ts.map +1 -0
  73. package/dist/cli/commands/serve.js +87 -0
  74. package/dist/cli/commands/serve.js.map +1 -0
  75. package/dist/cli/commands/template.d.ts +12 -0
  76. package/dist/cli/commands/template.d.ts.map +1 -0
  77. package/dist/cli/commands/template.js +163 -0
  78. package/dist/cli/commands/template.js.map +1 -0
  79. package/dist/cli/index.d.ts +3 -0
  80. package/dist/cli/index.d.ts.map +1 -0
  81. package/dist/cli/index.js +116 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/output.d.ts +63 -0
  84. package/dist/cli/output.d.ts.map +1 -0
  85. package/dist/cli/output.js +144 -0
  86. package/dist/cli/output.js.map +1 -0
  87. package/dist/core/autoreply.d.ts +57 -0
  88. package/dist/core/autoreply.d.ts.map +1 -0
  89. package/dist/core/autoreply.js +159 -0
  90. package/dist/core/autoreply.js.map +1 -0
  91. package/dist/core/bulk.d.ts +36 -0
  92. package/dist/core/bulk.d.ts.map +1 -0
  93. package/dist/core/bulk.js +117 -0
  94. package/dist/core/bulk.js.map +1 -0
  95. package/dist/core/client.d.ts +8 -0
  96. package/dist/core/client.d.ts.map +1 -0
  97. package/dist/core/client.js +91 -0
  98. package/dist/core/client.js.map +1 -0
  99. package/dist/core/daemon.d.ts +30 -0
  100. package/dist/core/daemon.d.ts.map +1 -0
  101. package/dist/core/daemon.js +213 -0
  102. package/dist/core/daemon.js.map +1 -0
  103. package/dist/core/dm-commands.d.ts +41 -0
  104. package/dist/core/dm-commands.d.ts.map +1 -0
  105. package/dist/core/dm-commands.js +313 -0
  106. package/dist/core/dm-commands.js.map +1 -0
  107. package/dist/core/export.d.ts +20 -0
  108. package/dist/core/export.d.ts.map +1 -0
  109. package/dist/core/export.js +92 -0
  110. package/dist/core/export.js.map +1 -0
  111. package/dist/core/gate.d.ts +39 -0
  112. package/dist/core/gate.d.ts.map +1 -0
  113. package/dist/core/gate.js +75 -0
  114. package/dist/core/gate.js.map +1 -0
  115. package/dist/core/group-settings.d.ts +35 -0
  116. package/dist/core/group-settings.d.ts.map +1 -0
  117. package/dist/core/group-settings.js +70 -0
  118. package/dist/core/group-settings.js.map +1 -0
  119. package/dist/core/index.d.ts +22 -0
  120. package/dist/core/index.d.ts.map +1 -0
  121. package/dist/core/index.js +12 -0
  122. package/dist/core/index.js.map +1 -0
  123. package/dist/core/license.d.ts +103 -0
  124. package/dist/core/license.d.ts.map +1 -0
  125. package/dist/core/license.js +444 -0
  126. package/dist/core/license.js.map +1 -0
  127. package/dist/core/scheduler.d.ts +45 -0
  128. package/dist/core/scheduler.d.ts.map +1 -0
  129. package/dist/core/scheduler.js +203 -0
  130. package/dist/core/scheduler.js.map +1 -0
  131. package/dist/core/templates.d.ts +35 -0
  132. package/dist/core/templates.d.ts.map +1 -0
  133. package/dist/core/templates.js +107 -0
  134. package/dist/core/templates.js.map +1 -0
  135. package/dist/core/types.d.ts +57 -0
  136. package/dist/core/types.d.ts.map +1 -0
  137. package/dist/core/types.js +10 -0
  138. package/dist/core/types.js.map +1 -0
  139. package/dist/server/api.d.ts +2 -0
  140. package/dist/server/api.d.ts.map +1 -0
  141. package/dist/server/api.js +79 -0
  142. package/dist/server/api.js.map +1 -0
  143. package/dist/server/index.d.ts +16 -0
  144. package/dist/server/index.d.ts.map +1 -0
  145. package/dist/server/index.js +48 -0
  146. package/dist/server/index.js.map +1 -0
  147. package/dist/server/license-api.d.ts +55 -0
  148. package/dist/server/license-api.d.ts.map +1 -0
  149. package/dist/server/license-api.js +496 -0
  150. package/dist/server/license-api.js.map +1 -0
  151. package/dist/server/middleware.d.ts +18 -0
  152. package/dist/server/middleware.d.ts.map +1 -0
  153. package/dist/server/middleware.js +92 -0
  154. package/dist/server/middleware.js.map +1 -0
  155. package/dist/server/webhook.d.ts +10 -0
  156. package/dist/server/webhook.d.ts.map +1 -0
  157. package/dist/server/webhook.js +53 -0
  158. package/dist/server/webhook.js.map +1 -0
  159. package/dist/server/ws.d.ts +66 -0
  160. package/dist/server/ws.d.ts.map +1 -0
  161. package/dist/server/ws.js +203 -0
  162. package/dist/server/ws.js.map +1 -0
  163. package/dist/utils/cache.d.ts +35 -0
  164. package/dist/utils/cache.d.ts.map +1 -0
  165. package/dist/utils/cache.js +78 -0
  166. package/dist/utils/cache.js.map +1 -0
  167. package/dist/utils/config.d.ts +16 -0
  168. package/dist/utils/config.d.ts.map +1 -0
  169. package/dist/utils/config.js +88 -0
  170. package/dist/utils/config.js.map +1 -0
  171. package/dist/utils/logger.d.ts +17 -0
  172. package/dist/utils/logger.d.ts.map +1 -0
  173. package/dist/utils/logger.js +51 -0
  174. package/dist/utils/logger.js.map +1 -0
  175. package/package.json +74 -0
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ZaloX License Server — Standalone entry point
4
+ *
5
+ * Usage:
6
+ * ADMIN_TOKEN=secret PORT=3456 node dist/server/index.js
7
+ * ADMIN_TOKEN=secret zalox admin serve --port 3456
8
+ *
9
+ * Environment:
10
+ * ADMIN_TOKEN — Required. Admin API authentication token.
11
+ * PORT — Server port (default: 3456)
12
+ * DATA_DIR — License data directory (default: ~/.config/zalox/server)
13
+ * HOST — Bind address (default: 0.0.0.0)
14
+ */
15
+ import { serve } from '@hono/node-server';
16
+ import { createLicenseApi } from './license-api.js';
17
+ import { join } from 'path';
18
+ import { homedir } from 'os';
19
+ const adminToken = process.env.ADMIN_TOKEN;
20
+ if (!adminToken) {
21
+ console.error('❌ ADMIN_TOKEN environment variable is required');
22
+ console.error(' Usage: ADMIN_TOKEN=your-secret PORT=3456 node dist/server/index.js');
23
+ process.exit(1);
24
+ }
25
+ const port = parseInt(process.env.PORT || '3456', 10);
26
+ const host = process.env.HOST || '0.0.0.0';
27
+ const dataDir = process.env.DATA_DIR || join(homedir(), '.config', 'zalox', 'server');
28
+ const app = createLicenseApi({ dataDir, adminToken });
29
+ console.log(`
30
+ ╔══════════════════════════════════════════╗
31
+ ║ ZaloX License Server ║
32
+ ╠══════════════════════════════════════════╣
33
+ ║ Port: ${String(port).padEnd(29)}║
34
+ ║ Host: ${host.padEnd(29)}║
35
+ ║ Data: ${dataDir.slice(0, 29).padEnd(29)}║
36
+ ║ Admin: Token configured ✓ ║
37
+ ╚══════════════════════════════════════════╝
38
+ `);
39
+ serve({
40
+ fetch: app.fetch,
41
+ port,
42
+ hostname: host,
43
+ }, (info) => {
44
+ console.log(`🚀 Server running at http://${info.address}:${info.port}`);
45
+ console.log(`📊 Admin dashboard: set API URL to http://${info.address}:${info.port}`);
46
+ console.log(`🔑 Verify: curl -H "X-Admin-Token: $ADMIN_TOKEN" http://localhost:${info.port}/api/admin/verify`);
47
+ });
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAChE,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,CAAC;AAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEtF,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AAEtD,OAAO,CAAC,GAAG,CAAC;;;;eAIG,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;eACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;eACf,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;;;CAG7C,CAAC,CAAC;AAEH,KAAK,CAAC;IACJ,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,IAAI;IACJ,QAAQ,EAAE,IAAI;CACf,EAAE,CAAC,IAAI,EAAE,EAAE;IACV,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,qEAAqE,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC;AACjH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * ZaloX — License Server (Admin API)
3
+ *
4
+ * Manages license keys: generate, activate, verify, revoke, transfer.
5
+ * Storage: JSON file (can migrate to SQLite/Supabase later).
6
+ *
7
+ * Endpoints:
8
+ * POST /api/admin/keys/generate — Generate new license key
9
+ * GET /api/admin/keys — List all keys
10
+ * GET /api/admin/keys/:key — Key details
11
+ * POST /api/admin/keys/revoke — Revoke a key
12
+ * POST /api/admin/keys/transfer — Transfer to new device
13
+ * GET /api/admin/stats — License stats
14
+ *
15
+ * POST /api/license/activate — Activate key (client)
16
+ * POST /api/license/verify — Verify key (client periodic)
17
+ * POST /api/license/deactivate — Deactivate key (client)
18
+ */
19
+ import { Hono } from 'hono';
20
+ export type LicenseTier = 'starter' | 'pro' | 'team';
21
+ export interface LicenseKey {
22
+ key: string;
23
+ tier: LicenseTier;
24
+ status: 'active' | 'activated' | 'revoked' | 'expired';
25
+ createdAt: string;
26
+ activatedAt: string | null;
27
+ revokedAt: string | null;
28
+ expiresAt: string | null;
29
+ maxDevices: number;
30
+ devices: DeviceActivation[];
31
+ owner: string | null;
32
+ email: string | null;
33
+ note: string | null;
34
+ paymentRef: string | null;
35
+ metadata: Record<string, unknown>;
36
+ }
37
+ export interface DeviceActivation {
38
+ deviceCode: string;
39
+ activatedAt: string;
40
+ lastVerifiedAt: string;
41
+ hostname: string | null;
42
+ platform: string | null;
43
+ ip: string | null;
44
+ }
45
+ export interface LicenseStore {
46
+ keys: Record<string, LicenseKey>;
47
+ version: number;
48
+ lastUpdated: string;
49
+ }
50
+ export interface LicenseServerOptions {
51
+ dataDir: string;
52
+ adminToken: string;
53
+ }
54
+ export declare function createLicenseApi(opts: LicenseServerOptions): Hono;
55
+ //# sourceMappingURL=license-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-api.d.ts","sourceRoot":"","sources":["../../src/server/license-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAyED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CA4ajE"}
@@ -0,0 +1,496 @@
1
+ /**
2
+ * ZaloX — License Server (Admin API)
3
+ *
4
+ * Manages license keys: generate, activate, verify, revoke, transfer.
5
+ * Storage: JSON file (can migrate to SQLite/Supabase later).
6
+ *
7
+ * Endpoints:
8
+ * POST /api/admin/keys/generate — Generate new license key
9
+ * GET /api/admin/keys — List all keys
10
+ * GET /api/admin/keys/:key — Key details
11
+ * POST /api/admin/keys/revoke — Revoke a key
12
+ * POST /api/admin/keys/transfer — Transfer to new device
13
+ * GET /api/admin/stats — License stats
14
+ *
15
+ * POST /api/license/activate — Activate key (client)
16
+ * POST /api/license/verify — Verify key (client periodic)
17
+ * POST /api/license/deactivate — Deactivate key (client)
18
+ */
19
+ import { Hono } from 'hono';
20
+ import { cors } from 'hono/cors';
21
+ import { randomBytes } from 'crypto';
22
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
23
+ import { join, dirname } from 'path';
24
+ // ── Storage ──────────────────────────────────────────────
25
+ const DEFAULT_STORE = {
26
+ keys: {},
27
+ version: 1,
28
+ lastUpdated: new Date().toISOString(),
29
+ };
30
+ let storePath = '';
31
+ let store = { ...DEFAULT_STORE };
32
+ function initStore(dataDir) {
33
+ storePath = join(dataDir, 'licenses.json');
34
+ const dir = dirname(storePath);
35
+ if (!existsSync(dir))
36
+ mkdirSync(dir, { recursive: true });
37
+ if (existsSync(storePath)) {
38
+ try {
39
+ store = JSON.parse(readFileSync(storePath, 'utf-8'));
40
+ }
41
+ catch {
42
+ store = { ...DEFAULT_STORE };
43
+ }
44
+ }
45
+ else {
46
+ store = { ...DEFAULT_STORE };
47
+ saveStore();
48
+ }
49
+ }
50
+ function saveStore() {
51
+ store.lastUpdated = new Date().toISOString();
52
+ writeFileSync(storePath, JSON.stringify(store, null, 2));
53
+ }
54
+ // ── Key Generation ───────────────────────────────────────
55
+ function generateKey(tier) {
56
+ const prefix = 'ZALOX';
57
+ const tierCode = tier.toUpperCase();
58
+ const random = randomBytes(4).toString('hex').toUpperCase();
59
+ const checkPart = randomBytes(2).toString('hex').toUpperCase();
60
+ // Format: ZALOX-PRO-A1B2C3D4-E5F6
61
+ return `${prefix}-${tierCode}-${random}-${checkPart}`;
62
+ }
63
+ function generateBatchKeys(tier, count) {
64
+ const keys = [];
65
+ for (let i = 0; i < count; i++) {
66
+ let key;
67
+ do {
68
+ key = generateKey(tier);
69
+ } while (store.keys[key]); // ensure unique
70
+ keys.push(key);
71
+ }
72
+ return keys;
73
+ }
74
+ // ── Admin Auth Middleware ─────────────────────────────────
75
+ function adminAuth(adminToken) {
76
+ return async (c, next) => {
77
+ const token = c.req.header('X-Admin-Token') || c.req.query('admin_token');
78
+ if (!token || token !== adminToken) {
79
+ return c.json({ ok: false, error: 'Unauthorized. Provide X-Admin-Token header.' }, 401);
80
+ }
81
+ await next();
82
+ };
83
+ }
84
+ export function createLicenseApi(opts) {
85
+ initStore(opts.dataDir);
86
+ const app = new Hono();
87
+ // CORS for dashboard
88
+ app.use('*', cors({
89
+ origin: '*',
90
+ allowHeaders: ['Content-Type', 'X-Admin-Token'],
91
+ allowMethods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'],
92
+ }));
93
+ // ═══════════════════════════════════════════════════════
94
+ // PUBLIC ENDPOINTS (client-facing)
95
+ // ═══════════════════════════════════════════════════════
96
+ /** Activate a license key on a device */
97
+ app.post('/api/license/activate', async (c) => {
98
+ const body = await c.req.json().catch(() => null);
99
+ if (!body?.key || !body?.deviceCode) {
100
+ return c.json({ ok: false, error: 'Missing key or deviceCode' }, 400);
101
+ }
102
+ const { key, deviceCode, hostname, platform } = body;
103
+ const license = store.keys[key.toUpperCase()];
104
+ if (!license) {
105
+ return c.json({ ok: false, error: 'Invalid license key' }, 404);
106
+ }
107
+ if (license.status === 'revoked') {
108
+ return c.json({ ok: false, error: 'License has been revoked' }, 403);
109
+ }
110
+ if (license.status === 'expired') {
111
+ return c.json({ ok: false, error: 'License has expired' }, 403);
112
+ }
113
+ // Check expiration
114
+ if (license.expiresAt && new Date(license.expiresAt) < new Date()) {
115
+ license.status = 'expired';
116
+ saveStore();
117
+ return c.json({ ok: false, error: 'License has expired' }, 403);
118
+ }
119
+ // Check if device already activated
120
+ const existing = license.devices.find(d => d.deviceCode === deviceCode);
121
+ if (existing) {
122
+ existing.lastVerifiedAt = new Date().toISOString();
123
+ existing.ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || null;
124
+ saveStore();
125
+ return c.json({
126
+ ok: true,
127
+ tier: license.tier,
128
+ features: getTierFeatures(license.tier),
129
+ expiresAt: license.expiresAt,
130
+ message: 'Device already activated',
131
+ });
132
+ }
133
+ // Check max devices
134
+ const activeDevices = license.devices.length;
135
+ if (activeDevices >= license.maxDevices) {
136
+ return c.json({
137
+ ok: false,
138
+ error: `Maximum devices reached (${activeDevices}/${license.maxDevices}). Use 'zalox license transfer' or contact support.`,
139
+ }, 403);
140
+ }
141
+ // Activate
142
+ license.devices.push({
143
+ deviceCode,
144
+ activatedAt: new Date().toISOString(),
145
+ lastVerifiedAt: new Date().toISOString(),
146
+ hostname: hostname || null,
147
+ platform: platform || null,
148
+ ip: c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || null,
149
+ });
150
+ license.status = 'activated';
151
+ if (!license.activatedAt)
152
+ license.activatedAt = new Date().toISOString();
153
+ saveStore();
154
+ return c.json({
155
+ ok: true,
156
+ tier: license.tier,
157
+ features: getTierFeatures(license.tier),
158
+ expiresAt: license.expiresAt,
159
+ maxDevices: license.maxDevices,
160
+ activeDevices: license.devices.length,
161
+ });
162
+ });
163
+ /** Verify a license key (periodic check from client) */
164
+ app.post('/api/license/verify', async (c) => {
165
+ const body = await c.req.json().catch(() => null);
166
+ if (!body?.key || !body?.deviceCode) {
167
+ return c.json({ ok: false, error: 'Missing key or deviceCode' }, 400);
168
+ }
169
+ const license = store.keys[body.key.toUpperCase()];
170
+ if (!license) {
171
+ return c.json({ ok: false, error: 'Invalid license key', valid: false }, 404);
172
+ }
173
+ if (license.status === 'revoked') {
174
+ return c.json({ ok: false, error: 'License revoked', valid: false }, 403);
175
+ }
176
+ // Check expiration
177
+ if (license.expiresAt && new Date(license.expiresAt) < new Date()) {
178
+ license.status = 'expired';
179
+ saveStore();
180
+ return c.json({ ok: false, error: 'License expired', valid: false }, 403);
181
+ }
182
+ // Check device
183
+ const device = license.devices.find(d => d.deviceCode === body.deviceCode);
184
+ if (!device) {
185
+ return c.json({ ok: false, error: 'Device not activated for this key', valid: false }, 403);
186
+ }
187
+ // Update last verified
188
+ device.lastVerifiedAt = new Date().toISOString();
189
+ device.ip = c.req.header('x-forwarded-for') || c.req.header('x-real-ip') || null;
190
+ saveStore();
191
+ return c.json({
192
+ ok: true,
193
+ valid: true,
194
+ tier: license.tier,
195
+ features: getTierFeatures(license.tier),
196
+ expiresAt: license.expiresAt,
197
+ });
198
+ });
199
+ /** Deactivate a device */
200
+ app.post('/api/license/deactivate', async (c) => {
201
+ const body = await c.req.json().catch(() => null);
202
+ if (!body?.key || !body?.deviceCode) {
203
+ return c.json({ ok: false, error: 'Missing key or deviceCode' }, 400);
204
+ }
205
+ const license = store.keys[body.key.toUpperCase()];
206
+ if (!license) {
207
+ return c.json({ ok: false, error: 'Invalid license key' }, 404);
208
+ }
209
+ const idx = license.devices.findIndex(d => d.deviceCode === body.deviceCode);
210
+ if (idx === -1) {
211
+ return c.json({ ok: false, error: 'Device not found' }, 404);
212
+ }
213
+ license.devices.splice(idx, 1);
214
+ if (license.devices.length === 0) {
215
+ license.status = 'active'; // back to unused
216
+ }
217
+ saveStore();
218
+ return c.json({ ok: true, message: 'Device deactivated successfully' });
219
+ });
220
+ // ═══════════════════════════════════════════════════════
221
+ // ADMIN ENDPOINTS (protected)
222
+ // ═══════════════════════════════════════════════════════
223
+ const admin = new Hono();
224
+ admin.use('*', adminAuth(opts.adminToken));
225
+ /** Generate new license key(s) */
226
+ admin.post('/keys/generate', async (c) => {
227
+ const body = await c.req.json().catch(() => null);
228
+ const tier = (body?.tier || 'pro');
229
+ const count = Math.min(body?.count || 1, 100); // max 100 at once
230
+ const owner = body?.owner || null;
231
+ const email = body?.email || null;
232
+ const note = body?.note || null;
233
+ const expiresAt = body?.expiresAt || null;
234
+ const paymentRef = body?.paymentRef || null;
235
+ if (!['starter', 'pro', 'team'].includes(tier)) {
236
+ return c.json({ ok: false, error: 'Invalid tier. Use: starter, pro, team' }, 400);
237
+ }
238
+ const maxDevices = tier === 'team' ? (body?.maxDevices || 5) : (body?.maxDevices || 1);
239
+ const keys = generateBatchKeys(tier, count);
240
+ const generated = [];
241
+ for (const key of keys) {
242
+ const licenseKey = {
243
+ key,
244
+ tier,
245
+ status: 'active',
246
+ createdAt: new Date().toISOString(),
247
+ activatedAt: null,
248
+ revokedAt: null,
249
+ expiresAt,
250
+ maxDevices,
251
+ devices: [],
252
+ owner,
253
+ email,
254
+ note,
255
+ paymentRef,
256
+ metadata: {},
257
+ };
258
+ store.keys[key] = licenseKey;
259
+ generated.push(licenseKey);
260
+ }
261
+ saveStore();
262
+ return c.json({
263
+ ok: true,
264
+ count: generated.length,
265
+ tier,
266
+ keys: generated.map(k => ({
267
+ key: k.key,
268
+ tier: k.tier,
269
+ maxDevices: k.maxDevices,
270
+ expiresAt: k.expiresAt,
271
+ })),
272
+ });
273
+ });
274
+ /** List all keys with filters */
275
+ admin.get('/keys', (c) => {
276
+ const tier = c.req.query('tier');
277
+ const status = c.req.query('status');
278
+ const search = c.req.query('q')?.toLowerCase();
279
+ const page = parseInt(c.req.query('page') || '1');
280
+ const limit = Math.min(parseInt(c.req.query('limit') || '50'), 200);
281
+ let keys = Object.values(store.keys);
282
+ // Filters
283
+ if (tier)
284
+ keys = keys.filter(k => k.tier === tier);
285
+ if (status)
286
+ keys = keys.filter(k => k.status === status);
287
+ if (search) {
288
+ keys = keys.filter(k => k.key.toLowerCase().includes(search) ||
289
+ k.owner?.toLowerCase().includes(search) ||
290
+ k.email?.toLowerCase().includes(search) ||
291
+ k.note?.toLowerCase().includes(search));
292
+ }
293
+ // Sort by createdAt desc
294
+ keys.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
295
+ const total = keys.length;
296
+ const offset = (page - 1) * limit;
297
+ const paged = keys.slice(offset, offset + limit);
298
+ return c.json({
299
+ ok: true,
300
+ total,
301
+ page,
302
+ limit,
303
+ keys: paged.map(k => ({
304
+ key: k.key,
305
+ tier: k.tier,
306
+ status: k.status,
307
+ owner: k.owner,
308
+ email: k.email,
309
+ createdAt: k.createdAt,
310
+ activatedAt: k.activatedAt,
311
+ expiresAt: k.expiresAt,
312
+ maxDevices: k.maxDevices,
313
+ activeDevices: k.devices.length,
314
+ note: k.note,
315
+ paymentRef: k.paymentRef,
316
+ })),
317
+ });
318
+ });
319
+ /** Get key details */
320
+ admin.get('/keys/:key', (c) => {
321
+ const key = c.req.param('key').toUpperCase();
322
+ const license = store.keys[key];
323
+ if (!license) {
324
+ return c.json({ ok: false, error: 'Key not found' }, 404);
325
+ }
326
+ return c.json({ ok: true, license });
327
+ });
328
+ /** Update key metadata */
329
+ admin.patch('/keys/:key', async (c) => {
330
+ const key = c.req.param('key').toUpperCase();
331
+ const license = store.keys[key];
332
+ if (!license) {
333
+ return c.json({ ok: false, error: 'Key not found' }, 404);
334
+ }
335
+ const body = await c.req.json().catch(() => null);
336
+ if (!body)
337
+ return c.json({ ok: false, error: 'Invalid body' }, 400);
338
+ // Updatable fields
339
+ if (body.owner !== undefined)
340
+ license.owner = body.owner;
341
+ if (body.email !== undefined)
342
+ license.email = body.email;
343
+ if (body.note !== undefined)
344
+ license.note = body.note;
345
+ if (body.expiresAt !== undefined)
346
+ license.expiresAt = body.expiresAt;
347
+ if (body.maxDevices !== undefined)
348
+ license.maxDevices = body.maxDevices;
349
+ if (body.paymentRef !== undefined)
350
+ license.paymentRef = body.paymentRef;
351
+ if (body.metadata !== undefined)
352
+ license.metadata = { ...license.metadata, ...body.metadata };
353
+ saveStore();
354
+ return c.json({ ok: true, license });
355
+ });
356
+ /** Revoke a key */
357
+ admin.post('/keys/revoke', async (c) => {
358
+ const body = await c.req.json().catch(() => null);
359
+ if (!body?.key)
360
+ return c.json({ ok: false, error: 'Missing key' }, 400);
361
+ const license = store.keys[body.key.toUpperCase()];
362
+ if (!license)
363
+ return c.json({ ok: false, error: 'Key not found' }, 404);
364
+ license.status = 'revoked';
365
+ license.revokedAt = new Date().toISOString();
366
+ saveStore();
367
+ return c.json({ ok: true, message: `Key ${license.key} revoked`, devices: license.devices.length });
368
+ });
369
+ /** Unrevoking a key */
370
+ admin.post('/keys/unrevoke', async (c) => {
371
+ const body = await c.req.json().catch(() => null);
372
+ if (!body?.key)
373
+ return c.json({ ok: false, error: 'Missing key' }, 400);
374
+ const license = store.keys[body.key.toUpperCase()];
375
+ if (!license)
376
+ return c.json({ ok: false, error: 'Key not found' }, 404);
377
+ license.status = license.devices.length > 0 ? 'activated' : 'active';
378
+ license.revokedAt = null;
379
+ saveStore();
380
+ return c.json({ ok: true, message: `Key ${license.key} restored` });
381
+ });
382
+ /** Transfer key to new device (remove old, allow new) */
383
+ admin.post('/keys/transfer', async (c) => {
384
+ const body = await c.req.json().catch(() => null);
385
+ if (!body?.key)
386
+ return c.json({ ok: false, error: 'Missing key' }, 400);
387
+ const license = store.keys[body.key.toUpperCase()];
388
+ if (!license)
389
+ return c.json({ ok: false, error: 'Key not found' }, 404);
390
+ const oldDeviceCode = body.oldDeviceCode;
391
+ if (oldDeviceCode) {
392
+ // Remove specific device
393
+ const idx = license.devices.findIndex(d => d.deviceCode === oldDeviceCode);
394
+ if (idx !== -1)
395
+ license.devices.splice(idx, 1);
396
+ }
397
+ else {
398
+ // Remove all devices
399
+ license.devices = [];
400
+ }
401
+ license.status = 'active';
402
+ saveStore();
403
+ return c.json({
404
+ ok: true,
405
+ message: `Key ${license.key} reset. ${oldDeviceCode ? 'Old device removed.' : 'All devices removed.'} Ready for new activation.`,
406
+ });
407
+ });
408
+ /** Delete a key permanently */
409
+ admin.delete('/keys/:key', (c) => {
410
+ const key = c.req.param('key').toUpperCase();
411
+ if (!store.keys[key]) {
412
+ return c.json({ ok: false, error: 'Key not found' }, 404);
413
+ }
414
+ delete store.keys[key];
415
+ saveStore();
416
+ return c.json({ ok: true, message: `Key ${key} deleted permanently` });
417
+ });
418
+ /** Dashboard stats */
419
+ admin.get('/stats', (c) => {
420
+ const keys = Object.values(store.keys);
421
+ const now = new Date();
422
+ const stats = {
423
+ total: keys.length,
424
+ byTier: { starter: 0, pro: 0, team: 0 },
425
+ byStatus: { active: 0, activated: 0, revoked: 0, expired: 0 },
426
+ totalDevices: 0,
427
+ revenue: { starter: 0, pro: 0, team: 0, total: 0 },
428
+ recentActivations: [],
429
+ };
430
+ const prices = { starter: 499000, pro: 999000, team: 2499000 };
431
+ for (const k of keys) {
432
+ stats.byTier[k.tier]++;
433
+ stats.byStatus[k.status]++;
434
+ stats.totalDevices += k.devices.length;
435
+ if (k.status !== 'revoked') {
436
+ stats.revenue[k.tier] += prices[k.tier];
437
+ stats.revenue.total += prices[k.tier];
438
+ }
439
+ }
440
+ // Recent activations (last 10)
441
+ const allActivations = [];
442
+ for (const k of keys) {
443
+ for (const d of k.devices) {
444
+ allActivations.push({ key: k.key, deviceCode: d.deviceCode, at: d.activatedAt });
445
+ }
446
+ }
447
+ allActivations.sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime());
448
+ stats.recentActivations = allActivations.slice(0, 10);
449
+ return c.json({ ok: true, stats });
450
+ });
451
+ /** Verify admin token (used by dashboard login) */
452
+ admin.get('/verify', (c) => {
453
+ // If we reach here, adminAuth middleware already passed
454
+ return c.json({ ok: true, valid: true });
455
+ });
456
+ // Mount admin routes
457
+ app.route('/api/admin', admin);
458
+ return app;
459
+ }
460
+ // ── Tier Features (shared with client) ──────────────────
461
+ function getTierFeatures(tier) {
462
+ const features = {
463
+ starter: {
464
+ maxProfiles: 2, maxGroups: 5,
465
+ sendImages: true, sendFiles: false, sendStickers: false,
466
+ listener: true, listenerAutoRestart: true,
467
+ restApi: false, webhooks: false,
468
+ bulkSend: false, bulkSendLimit: 0,
469
+ scheduling: false, autoReply: false,
470
+ templates: true, export: false,
471
+ friendManagement: true, groupManagement: true,
472
+ },
473
+ pro: {
474
+ maxProfiles: -1, maxGroups: -1,
475
+ sendImages: true, sendFiles: true, sendStickers: true,
476
+ listener: true, listenerAutoRestart: true,
477
+ restApi: true, webhooks: true,
478
+ bulkSend: true, bulkSendLimit: 1000,
479
+ scheduling: true, autoReply: true,
480
+ templates: true, export: true,
481
+ friendManagement: true, groupManagement: true,
482
+ },
483
+ team: {
484
+ maxProfiles: -1, maxGroups: -1,
485
+ sendImages: true, sendFiles: true, sendStickers: true,
486
+ listener: true, listenerAutoRestart: true,
487
+ restApi: true, webhooks: true,
488
+ bulkSend: true, bulkSendLimit: 5000,
489
+ scheduling: true, autoReply: true,
490
+ templates: true, export: true,
491
+ friendManagement: true, groupManagement: true,
492
+ },
493
+ };
494
+ return features[tier] || features.pro;
495
+ }
496
+ //# sourceMappingURL=license-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-api.js","sourceRoot":"","sources":["../../src/server/license-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ /**
3
+ * API Key authentication middleware
4
+ */
5
+ export declare function apiKeyAuth(key: string): MiddlewareHandler;
6
+ /**
7
+ * Request logging middleware
8
+ */
9
+ export declare function requestLogger(): MiddlewareHandler;
10
+ /**
11
+ * Global error handler middleware
12
+ */
13
+ export declare function errorHandler(): MiddlewareHandler;
14
+ /**
15
+ * CORS middleware
16
+ */
17
+ export declare function corsMiddleware(origins?: string[]): MiddlewareHandler;
18
+ //# sourceMappingURL=middleware.d.ts.map