@qwickapps/server 1.4.0 → 1.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 (273) hide show
  1. package/CHANGELOG.md +507 -0
  2. package/README.md +9 -0
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +12 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/plugins/bans/bans-plugin.d.ts.map +1 -1
  8. package/dist/plugins/bans/bans-plugin.js +12 -3
  9. package/dist/plugins/bans/bans-plugin.js.map +1 -1
  10. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts +11 -0
  11. package/dist/plugins/devices/__tests__/devices-plugin.test.d.ts.map +1 -0
  12. package/dist/plugins/devices/__tests__/devices-plugin.test.js +410 -0
  13. package/dist/plugins/devices/__tests__/devices-plugin.test.js.map +1 -0
  14. package/dist/plugins/devices/__tests__/token-utils.test.d.ts +7 -0
  15. package/dist/plugins/devices/__tests__/token-utils.test.d.ts.map +1 -0
  16. package/dist/plugins/devices/__tests__/token-utils.test.js +197 -0
  17. package/dist/plugins/devices/__tests__/token-utils.test.js.map +1 -0
  18. package/dist/plugins/devices/adapters/compute-adapter.d.ts +36 -0
  19. package/dist/plugins/devices/adapters/compute-adapter.d.ts.map +1 -0
  20. package/dist/plugins/devices/adapters/compute-adapter.js +100 -0
  21. package/dist/plugins/devices/adapters/compute-adapter.js.map +1 -0
  22. package/dist/plugins/devices/adapters/index.d.ts +12 -0
  23. package/dist/plugins/devices/adapters/index.d.ts.map +1 -0
  24. package/dist/plugins/devices/adapters/index.js +10 -0
  25. package/dist/plugins/devices/adapters/index.js.map +1 -0
  26. package/dist/plugins/devices/adapters/mobile-adapter.d.ts +41 -0
  27. package/dist/plugins/devices/adapters/mobile-adapter.d.ts.map +1 -0
  28. package/dist/plugins/devices/adapters/mobile-adapter.js +131 -0
  29. package/dist/plugins/devices/adapters/mobile-adapter.js.map +1 -0
  30. package/dist/plugins/devices/devices-plugin.d.ts +70 -0
  31. package/dist/plugins/devices/devices-plugin.d.ts.map +1 -0
  32. package/dist/plugins/devices/devices-plugin.js +453 -0
  33. package/dist/plugins/devices/devices-plugin.js.map +1 -0
  34. package/dist/plugins/devices/index.d.ts +18 -0
  35. package/dist/plugins/devices/index.d.ts.map +1 -0
  36. package/dist/plugins/devices/index.js +18 -0
  37. package/dist/plugins/devices/index.js.map +1 -0
  38. package/dist/plugins/devices/stores/index.d.ts +9 -0
  39. package/dist/plugins/devices/stores/index.d.ts.map +1 -0
  40. package/dist/plugins/devices/stores/index.js +9 -0
  41. package/dist/plugins/devices/stores/index.js.map +1 -0
  42. package/dist/plugins/devices/stores/postgres-store.d.ts +26 -0
  43. package/dist/plugins/devices/stores/postgres-store.d.ts.map +1 -0
  44. package/dist/plugins/devices/stores/postgres-store.js +199 -0
  45. package/dist/plugins/devices/stores/postgres-store.js.map +1 -0
  46. package/dist/plugins/devices/token-utils.d.ts +100 -0
  47. package/dist/plugins/devices/token-utils.d.ts.map +1 -0
  48. package/dist/plugins/devices/token-utils.js +162 -0
  49. package/dist/plugins/devices/token-utils.js.map +1 -0
  50. package/dist/plugins/devices/types.d.ts +307 -0
  51. package/dist/plugins/devices/types.d.ts.map +1 -0
  52. package/dist/plugins/devices/types.js +10 -0
  53. package/dist/plugins/devices/types.js.map +1 -0
  54. package/dist/plugins/index.d.ts +14 -2
  55. package/dist/plugins/index.d.ts.map +1 -1
  56. package/dist/plugins/index.js +13 -1
  57. package/dist/plugins/index.js.map +1 -1
  58. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts +5 -0
  59. package/dist/plugins/notifications/__tests__/notifications-manager.test.d.ts.map +1 -0
  60. package/dist/plugins/notifications/__tests__/notifications-manager.test.js +470 -0
  61. package/dist/plugins/notifications/__tests__/notifications-manager.test.js.map +1 -0
  62. package/dist/plugins/notifications/index.d.ts +71 -0
  63. package/dist/plugins/notifications/index.d.ts.map +1 -0
  64. package/dist/plugins/notifications/index.js +72 -0
  65. package/dist/plugins/notifications/index.js.map +1 -0
  66. package/dist/plugins/notifications/notifications-manager.d.ts +182 -0
  67. package/dist/plugins/notifications/notifications-manager.d.ts.map +1 -0
  68. package/dist/plugins/notifications/notifications-manager.js +610 -0
  69. package/dist/plugins/notifications/notifications-manager.js.map +1 -0
  70. package/dist/plugins/notifications/notifications-plugin.d.ts +83 -0
  71. package/dist/plugins/notifications/notifications-plugin.d.ts.map +1 -0
  72. package/dist/plugins/notifications/notifications-plugin.js +337 -0
  73. package/dist/plugins/notifications/notifications-plugin.js.map +1 -0
  74. package/dist/plugins/notifications/types.d.ts +164 -0
  75. package/dist/plugins/notifications/types.d.ts.map +1 -0
  76. package/dist/plugins/notifications/types.js +9 -0
  77. package/dist/plugins/notifications/types.js.map +1 -0
  78. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts +12 -0
  79. package/dist/plugins/parental/__tests__/parental-plugin.test.d.ts.map +1 -0
  80. package/dist/plugins/parental/__tests__/parental-plugin.test.js +349 -0
  81. package/dist/plugins/parental/__tests__/parental-plugin.test.js.map +1 -0
  82. package/dist/plugins/parental/adapters/index.d.ts +8 -0
  83. package/dist/plugins/parental/adapters/index.d.ts.map +1 -0
  84. package/dist/plugins/parental/adapters/index.js +7 -0
  85. package/dist/plugins/parental/adapters/index.js.map +1 -0
  86. package/dist/plugins/parental/adapters/kids-adapter.d.ts +24 -0
  87. package/dist/plugins/parental/adapters/kids-adapter.d.ts.map +1 -0
  88. package/dist/plugins/parental/adapters/kids-adapter.js +174 -0
  89. package/dist/plugins/parental/adapters/kids-adapter.js.map +1 -0
  90. package/dist/plugins/parental/index.d.ts +14 -0
  91. package/dist/plugins/parental/index.d.ts.map +1 -0
  92. package/dist/plugins/parental/index.js +15 -0
  93. package/dist/plugins/parental/index.js.map +1 -0
  94. package/dist/plugins/parental/parental-plugin.d.ts +88 -0
  95. package/dist/plugins/parental/parental-plugin.d.ts.map +1 -0
  96. package/dist/plugins/parental/parental-plugin.js +666 -0
  97. package/dist/plugins/parental/parental-plugin.js.map +1 -0
  98. package/dist/plugins/parental/stores/index.d.ts +7 -0
  99. package/dist/plugins/parental/stores/index.d.ts.map +1 -0
  100. package/dist/plugins/parental/stores/index.js +7 -0
  101. package/dist/plugins/parental/stores/index.js.map +1 -0
  102. package/dist/plugins/parental/stores/postgres-store.d.ts +10 -0
  103. package/dist/plugins/parental/stores/postgres-store.d.ts.map +1 -0
  104. package/dist/plugins/parental/stores/postgres-store.js +209 -0
  105. package/dist/plugins/parental/stores/postgres-store.js.map +1 -0
  106. package/dist/plugins/parental/types.d.ts +154 -0
  107. package/dist/plugins/parental/types.d.ts.map +1 -0
  108. package/dist/plugins/parental/types.js +10 -0
  109. package/dist/plugins/parental/types.js.map +1 -0
  110. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts +11 -0
  111. package/dist/plugins/profiles/__tests__/profiles-plugin.test.d.ts.map +1 -0
  112. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js +243 -0
  113. package/dist/plugins/profiles/__tests__/profiles-plugin.test.js.map +1 -0
  114. package/dist/plugins/profiles/index.d.ts +12 -0
  115. package/dist/plugins/profiles/index.d.ts.map +1 -0
  116. package/dist/plugins/profiles/index.js +13 -0
  117. package/dist/plugins/profiles/index.js.map +1 -0
  118. package/dist/plugins/profiles/profiles-plugin.d.ts +71 -0
  119. package/dist/plugins/profiles/profiles-plugin.d.ts.map +1 -0
  120. package/dist/plugins/profiles/profiles-plugin.js +481 -0
  121. package/dist/plugins/profiles/profiles-plugin.js.map +1 -0
  122. package/dist/plugins/profiles/stores/index.d.ts +9 -0
  123. package/dist/plugins/profiles/stores/index.d.ts.map +1 -0
  124. package/dist/plugins/profiles/stores/index.js +9 -0
  125. package/dist/plugins/profiles/stores/index.js.map +1 -0
  126. package/dist/plugins/profiles/stores/postgres-store.d.ts +18 -0
  127. package/dist/plugins/profiles/stores/postgres-store.d.ts.map +1 -0
  128. package/dist/plugins/profiles/stores/postgres-store.js +310 -0
  129. package/dist/plugins/profiles/stores/postgres-store.js.map +1 -0
  130. package/dist/plugins/profiles/types.d.ts +289 -0
  131. package/dist/plugins/profiles/types.d.ts.map +1 -0
  132. package/dist/plugins/profiles/types.js +10 -0
  133. package/dist/plugins/profiles/types.js.map +1 -0
  134. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts +11 -0
  135. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.d.ts.map +1 -0
  136. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js +305 -0
  137. package/dist/plugins/subscriptions/__tests__/subscriptions-plugin.test.js.map +1 -0
  138. package/dist/plugins/subscriptions/index.d.ts +12 -0
  139. package/dist/plugins/subscriptions/index.d.ts.map +1 -0
  140. package/dist/plugins/subscriptions/index.js +13 -0
  141. package/dist/plugins/subscriptions/index.js.map +1 -0
  142. package/dist/plugins/subscriptions/stores/index.d.ts +9 -0
  143. package/dist/plugins/subscriptions/stores/index.d.ts.map +1 -0
  144. package/dist/plugins/subscriptions/stores/index.js +9 -0
  145. package/dist/plugins/subscriptions/stores/index.js.map +1 -0
  146. package/dist/plugins/subscriptions/stores/postgres-store.d.ts +14 -0
  147. package/dist/plugins/subscriptions/stores/postgres-store.d.ts.map +1 -0
  148. package/dist/plugins/subscriptions/stores/postgres-store.js +359 -0
  149. package/dist/plugins/subscriptions/stores/postgres-store.js.map +1 -0
  150. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts +82 -0
  151. package/dist/plugins/subscriptions/subscriptions-plugin.d.ts.map +1 -0
  152. package/dist/plugins/subscriptions/subscriptions-plugin.js +449 -0
  153. package/dist/plugins/subscriptions/subscriptions-plugin.js.map +1 -0
  154. package/dist/plugins/subscriptions/types.d.ts +308 -0
  155. package/dist/plugins/subscriptions/types.d.ts.map +1 -0
  156. package/dist/plugins/subscriptions/types.js +10 -0
  157. package/dist/plugins/subscriptions/types.js.map +1 -0
  158. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts +11 -0
  159. package/dist/plugins/usage/__tests__/usage-plugin.test.d.ts.map +1 -0
  160. package/dist/plugins/usage/__tests__/usage-plugin.test.js +218 -0
  161. package/dist/plugins/usage/__tests__/usage-plugin.test.js.map +1 -0
  162. package/dist/plugins/usage/index.d.ts +12 -0
  163. package/dist/plugins/usage/index.d.ts.map +1 -0
  164. package/dist/plugins/usage/index.js +13 -0
  165. package/dist/plugins/usage/index.js.map +1 -0
  166. package/dist/plugins/usage/stores/index.d.ts +9 -0
  167. package/dist/plugins/usage/stores/index.d.ts.map +1 -0
  168. package/dist/plugins/usage/stores/index.js +9 -0
  169. package/dist/plugins/usage/stores/index.js.map +1 -0
  170. package/dist/plugins/usage/stores/postgres-store.d.ts +14 -0
  171. package/dist/plugins/usage/stores/postgres-store.d.ts.map +1 -0
  172. package/dist/plugins/usage/stores/postgres-store.js +146 -0
  173. package/dist/plugins/usage/stores/postgres-store.js.map +1 -0
  174. package/dist/plugins/usage/types.d.ts +195 -0
  175. package/dist/plugins/usage/types.d.ts.map +1 -0
  176. package/dist/plugins/usage/types.js +10 -0
  177. package/dist/plugins/usage/types.js.map +1 -0
  178. package/dist/plugins/usage/usage-plugin.d.ts +51 -0
  179. package/dist/plugins/usage/usage-plugin.d.ts.map +1 -0
  180. package/dist/plugins/usage/usage-plugin.js +412 -0
  181. package/dist/plugins/usage/usage-plugin.js.map +1 -0
  182. package/dist/plugins/users/__tests__/postgres-store.test.d.ts +10 -0
  183. package/dist/plugins/users/__tests__/postgres-store.test.d.ts.map +1 -0
  184. package/dist/plugins/users/__tests__/postgres-store.test.js +229 -0
  185. package/dist/plugins/users/__tests__/postgres-store.test.js.map +1 -0
  186. package/dist/plugins/users/__tests__/users-plugin.test.js +3 -0
  187. package/dist/plugins/users/__tests__/users-plugin.test.js.map +1 -1
  188. package/dist/plugins/users/index.d.ts +2 -2
  189. package/dist/plugins/users/index.d.ts.map +1 -1
  190. package/dist/plugins/users/index.js +1 -1
  191. package/dist/plugins/users/index.js.map +1 -1
  192. package/dist/plugins/users/stores/postgres-store.d.ts.map +1 -1
  193. package/dist/plugins/users/stores/postgres-store.js +76 -0
  194. package/dist/plugins/users/stores/postgres-store.js.map +1 -1
  195. package/dist/plugins/users/types.d.ts +74 -6
  196. package/dist/plugins/users/types.d.ts.map +1 -1
  197. package/dist/plugins/users/users-plugin.d.ts +15 -1
  198. package/dist/plugins/users/users-plugin.d.ts.map +1 -1
  199. package/dist/plugins/users/users-plugin.js +29 -0
  200. package/dist/plugins/users/users-plugin.js.map +1 -1
  201. package/dist-ui/assets/index-CynOqPkb.js +469 -0
  202. package/dist-ui/assets/index-CynOqPkb.js.map +1 -0
  203. package/dist-ui/index.html +1 -1
  204. package/dist-ui-lib/api/controlPanelApi.d.ts +46 -0
  205. package/dist-ui-lib/components/StatCard.d.ts +16 -0
  206. package/dist-ui-lib/dashboard/widgets/NotificationsStatsWidget.d.ts +12 -0
  207. package/dist-ui-lib/dashboard/widgets/index.d.ts +1 -0
  208. package/dist-ui-lib/index.js +1822 -1611
  209. package/dist-ui-lib/index.js.map +1 -1
  210. package/dist-ui-lib/pages/NotificationsPage.d.ts +9 -0
  211. package/dist-ui-lib/utils/formatters.d.ts +19 -0
  212. package/package.json +3 -2
  213. package/src/index.ts +178 -0
  214. package/src/plugins/bans/bans-plugin.ts +15 -3
  215. package/src/plugins/devices/__tests__/devices-plugin.test.ts +551 -0
  216. package/src/plugins/devices/__tests__/token-utils.test.ts +264 -0
  217. package/src/plugins/devices/adapters/compute-adapter.ts +139 -0
  218. package/src/plugins/devices/adapters/index.ts +13 -0
  219. package/src/plugins/devices/adapters/mobile-adapter.ts +179 -0
  220. package/src/plugins/devices/devices-plugin.ts +538 -0
  221. package/src/plugins/devices/index.ts +69 -0
  222. package/src/plugins/devices/stores/index.ts +9 -0
  223. package/src/plugins/devices/stores/postgres-store.ts +304 -0
  224. package/src/plugins/devices/token-utils.ts +213 -0
  225. package/src/plugins/devices/types.ts +351 -0
  226. package/src/plugins/index.ts +218 -0
  227. package/src/plugins/notifications/__tests__/notifications-manager.test.ts +637 -0
  228. package/src/plugins/notifications/index.ts +91 -0
  229. package/src/plugins/notifications/notifications-manager.ts +773 -0
  230. package/src/plugins/notifications/notifications-plugin.ts +398 -0
  231. package/src/plugins/notifications/types.ts +207 -0
  232. package/src/plugins/parental/__tests__/parental-plugin.test.ts +465 -0
  233. package/src/plugins/parental/adapters/index.ts +8 -0
  234. package/src/plugins/parental/adapters/kids-adapter.ts +206 -0
  235. package/src/plugins/parental/index.ts +55 -0
  236. package/src/plugins/parental/parental-plugin.ts +759 -0
  237. package/src/plugins/parental/stores/index.ts +7 -0
  238. package/src/plugins/parental/stores/postgres-store.ts +304 -0
  239. package/src/plugins/parental/types.ts +180 -0
  240. package/src/plugins/profiles/__tests__/profiles-plugin.test.ts +321 -0
  241. package/src/plugins/profiles/index.ts +49 -0
  242. package/src/plugins/profiles/profiles-plugin.ts +546 -0
  243. package/src/plugins/profiles/stores/index.ts +9 -0
  244. package/src/plugins/profiles/stores/postgres-store.ts +439 -0
  245. package/src/plugins/profiles/types.ts +338 -0
  246. package/src/plugins/subscriptions/__tests__/subscriptions-plugin.test.ts +404 -0
  247. package/src/plugins/subscriptions/index.ts +51 -0
  248. package/src/plugins/subscriptions/stores/index.ts +9 -0
  249. package/src/plugins/subscriptions/stores/postgres-store.ts +482 -0
  250. package/src/plugins/subscriptions/subscriptions-plugin.ts +530 -0
  251. package/src/plugins/subscriptions/types.ts +355 -0
  252. package/src/plugins/usage/__tests__/usage-plugin.test.ts +288 -0
  253. package/src/plugins/usage/index.ts +39 -0
  254. package/src/plugins/usage/stores/index.ts +9 -0
  255. package/src/plugins/usage/stores/postgres-store.ts +213 -0
  256. package/src/plugins/usage/types.ts +222 -0
  257. package/src/plugins/usage/usage-plugin.ts +484 -0
  258. package/src/plugins/users/__tests__/postgres-store.test.ts +326 -0
  259. package/src/plugins/users/__tests__/users-plugin.test.ts +3 -0
  260. package/src/plugins/users/index.ts +6 -0
  261. package/src/plugins/users/stores/postgres-store.ts +104 -0
  262. package/src/plugins/users/types.ts +82 -6
  263. package/src/plugins/users/users-plugin.ts +37 -0
  264. package/ui/src/App.tsx +5 -1
  265. package/ui/src/api/controlPanelApi.ts +103 -6
  266. package/ui/src/components/StatCard.tsx +58 -0
  267. package/ui/src/dashboard/builtInWidgets.tsx +3 -1
  268. package/ui/src/dashboard/widgets/NotificationsStatsWidget.tsx +167 -0
  269. package/ui/src/dashboard/widgets/index.ts +1 -0
  270. package/ui/src/pages/NotificationsPage.tsx +417 -0
  271. package/ui/src/utils/formatters.ts +33 -0
  272. package/dist-ui/assets/index-D7DoZ9rL.js +0 -478
  273. package/dist-ui/assets/index-D7DoZ9rL.js.map +0 -1
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Token Utilities Tests
3
+ *
4
+ * Unit tests for device token generation, hashing, and verification.
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { generateDeviceToken, generatePairingCode, hashToken, verifyToken, isValidTokenFormat, isTokenExpired, getTokenExpiration, } from '../token-utils.js';
8
+ describe('Token Utilities', () => {
9
+ describe('generateDeviceToken', () => {
10
+ it('should generate a token with the correct prefix', async () => {
11
+ const result = await generateDeviceToken('mob');
12
+ expect(result.token).toMatch(/^mob_/);
13
+ });
14
+ it('should generate a 43-character secret after prefix', async () => {
15
+ const result = await generateDeviceToken('mob');
16
+ const secret = result.token.split('_')[1];
17
+ expect(secret.length).toBe(43);
18
+ });
19
+ it('should generate base64url-safe characters', async () => {
20
+ const result = await generateDeviceToken('test');
21
+ const secret = result.token.split('_')[1];
22
+ expect(secret).toMatch(/^[A-Za-z0-9_-]+$/);
23
+ });
24
+ it('should return a SHA-256 hash (64 hex characters)', async () => {
25
+ const result = await generateDeviceToken('mob');
26
+ expect(result.hash).toMatch(/^[a-f0-9]{64}$/);
27
+ });
28
+ it('should return an 8-character prefix for display', async () => {
29
+ const result = await generateDeviceToken('mob');
30
+ expect(result.prefix.length).toBe(8);
31
+ expect(result.token.startsWith(result.prefix)).toBe(true);
32
+ });
33
+ it('should generate unique tokens each time', async () => {
34
+ const result1 = await generateDeviceToken('mob');
35
+ const result2 = await generateDeviceToken('mob');
36
+ expect(result1.token).not.toBe(result2.token);
37
+ expect(result1.hash).not.toBe(result2.hash);
38
+ });
39
+ });
40
+ describe('generatePairingCode', () => {
41
+ it('should generate a 6-character code', () => {
42
+ const code = generatePairingCode();
43
+ expect(code.length).toBe(6);
44
+ });
45
+ it('should only contain uppercase alphanumeric characters', () => {
46
+ const code = generatePairingCode();
47
+ // Excludes confusing chars: 0, O, I, 1
48
+ expect(code).toMatch(/^[ABCDEFGHJKLMNPQRSTUVWXYZ23456789]+$/);
49
+ });
50
+ it('should generate unique codes', () => {
51
+ const codes = new Set();
52
+ for (let i = 0; i < 100; i++) {
53
+ codes.add(generatePairingCode());
54
+ }
55
+ // Should have mostly unique codes (allowing some collisions)
56
+ expect(codes.size).toBeGreaterThan(90);
57
+ });
58
+ });
59
+ describe('hashToken', () => {
60
+ it('should return a 64-character hex string', async () => {
61
+ const hash = await hashToken('test_token');
62
+ expect(hash.length).toBe(64);
63
+ expect(hash).toMatch(/^[a-f0-9]+$/);
64
+ });
65
+ it('should produce consistent hashes for same input', async () => {
66
+ const hash1 = await hashToken('same_token');
67
+ const hash2 = await hashToken('same_token');
68
+ expect(hash1).toBe(hash2);
69
+ });
70
+ it('should produce different hashes for different input', async () => {
71
+ const hash1 = await hashToken('token_one');
72
+ const hash2 = await hashToken('token_two');
73
+ expect(hash1).not.toBe(hash2);
74
+ });
75
+ });
76
+ describe('verifyToken', () => {
77
+ it('should return valid for matching token and hash', async () => {
78
+ const token = 'mob_ABC123testtoken';
79
+ const hash = await hashToken(token);
80
+ const result = await verifyToken(token, hash);
81
+ expect(result.valid).toBe(true);
82
+ expect(result.error).toBeUndefined();
83
+ });
84
+ it('should return invalid for non-matching token', async () => {
85
+ const originalHash = await hashToken('original_token');
86
+ const result = await verifyToken('different_token', originalHash);
87
+ expect(result.valid).toBe(false);
88
+ expect(result.error).toBe('Invalid token');
89
+ });
90
+ it('should handle malformed hash gracefully', async () => {
91
+ const result = await verifyToken('some_token', 'not-a-valid-hex-hash');
92
+ expect(result.valid).toBe(false);
93
+ expect(result.error).toBeDefined();
94
+ });
95
+ it('should use constant-time comparison (timing-safe)', async () => {
96
+ // This test ensures the comparison doesn't leak timing info
97
+ // We can't directly test timing, but we verify the function uses the correct approach
98
+ const token = 'mob_securetoken123';
99
+ const hash = await hashToken(token);
100
+ // Multiple verifications should all succeed
101
+ for (let i = 0; i < 10; i++) {
102
+ const result = await verifyToken(token, hash);
103
+ expect(result.valid).toBe(true);
104
+ }
105
+ });
106
+ });
107
+ describe('isValidTokenFormat', () => {
108
+ it('should return true for valid token format', () => {
109
+ // 43 base64url characters after prefix (32 bytes = 43 chars in base64url)
110
+ const validToken = 'mob_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk123456';
111
+ expect(isValidTokenFormat(validToken, 'mob')).toBe(true);
112
+ });
113
+ it('should return false for wrong prefix', () => {
114
+ const token = 'mob_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk123456';
115
+ expect(isValidTokenFormat(token, 'cpute')).toBe(false);
116
+ });
117
+ it('should return false for missing underscore', () => {
118
+ const token = 'mobABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk123456';
119
+ expect(isValidTokenFormat(token, 'mob')).toBe(false);
120
+ });
121
+ it('should return false for too short secret', () => {
122
+ const token = 'mob_tooshort';
123
+ expect(isValidTokenFormat(token, 'mob')).toBe(false);
124
+ });
125
+ it('should return false for too long secret', () => {
126
+ const token = 'mob_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk123456extra';
127
+ expect(isValidTokenFormat(token, 'mob')).toBe(false);
128
+ });
129
+ it('should return false for invalid characters', () => {
130
+ const token = 'mob_ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()123456';
131
+ expect(isValidTokenFormat(token, 'mob')).toBe(false);
132
+ });
133
+ it('should accept base64url characters including - and _', () => {
134
+ const token = 'mob_ABCDEFGHIJKLMNOPQRSTUVWXYZ-_abcdefghij12345';
135
+ expect(isValidTokenFormat(token, 'mob')).toBe(true);
136
+ });
137
+ });
138
+ describe('isTokenExpired', () => {
139
+ it('should return false for future date', () => {
140
+ const futureDate = new Date();
141
+ futureDate.setDate(futureDate.getDate() + 30);
142
+ expect(isTokenExpired(futureDate)).toBe(false);
143
+ });
144
+ it('should return true for past date', () => {
145
+ const pastDate = new Date();
146
+ pastDate.setDate(pastDate.getDate() - 1);
147
+ expect(isTokenExpired(pastDate)).toBe(true);
148
+ });
149
+ it('should return true for date exactly now (edge case)', () => {
150
+ const now = new Date();
151
+ // Slightly in the past to ensure it's expired
152
+ now.setMilliseconds(now.getMilliseconds() - 1);
153
+ expect(isTokenExpired(now)).toBe(true);
154
+ });
155
+ });
156
+ describe('getTokenExpiration', () => {
157
+ it('should return a date 90 days in the future by default', () => {
158
+ const now = new Date();
159
+ const expiration = getTokenExpiration();
160
+ const daysDiff = Math.round((expiration.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
161
+ expect(daysDiff).toBe(90);
162
+ });
163
+ it('should accept custom validity days', () => {
164
+ const now = new Date();
165
+ const expiration = getTokenExpiration(30);
166
+ const daysDiff = Math.round((expiration.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
167
+ expect(daysDiff).toBe(30);
168
+ });
169
+ it('should handle 0 days (expires immediately)', () => {
170
+ const now = new Date();
171
+ const expiration = getTokenExpiration(0);
172
+ // Should be very close to now
173
+ const diffMs = Math.abs(expiration.getTime() - now.getTime());
174
+ expect(diffMs).toBeLessThan(1000); // Within 1 second
175
+ });
176
+ it('should handle large values', () => {
177
+ const now = new Date();
178
+ const expiration = getTokenExpiration(365);
179
+ const daysDiff = Math.round((expiration.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
180
+ expect(daysDiff).toBe(365);
181
+ });
182
+ });
183
+ describe('integration: generate and verify', () => {
184
+ it('should generate token that can be verified', async () => {
185
+ const { token, hash } = await generateDeviceToken('mob');
186
+ const verifyResult = await verifyToken(token, hash);
187
+ expect(verifyResult.valid).toBe(true);
188
+ });
189
+ it('should reject tampered token', async () => {
190
+ const { hash } = await generateDeviceToken('mob');
191
+ const tamperedToken = 'mob_tamperedtokenthatisdifferentfromoriginal';
192
+ const verifyResult = await verifyToken(tamperedToken, hash);
193
+ expect(verifyResult.valid).toBe(false);
194
+ });
195
+ });
196
+ });
197
+ //# sourceMappingURL=token-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-utils.test.js","sourceRoot":"","sources":["../../../../src/plugins/devices/__tests__/token-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Compute Device Adapter
3
+ *
4
+ * Adapter for computing devices (laptops, desktops, containers).
5
+ * Used by QwickForge for CLI device management.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ import type { DeviceAdapter } from '../types.js';
10
+ /**
11
+ * Compute adapter configuration
12
+ */
13
+ export interface ComputeAdapterConfig {
14
+ /** Token prefix (default: 'qwf_dev') */
15
+ tokenPrefix?: string;
16
+ /** Require hostname in metadata */
17
+ requireHostname?: boolean;
18
+ /** Allowed OS types (optional, allows all if not specified) */
19
+ allowedOS?: string[];
20
+ }
21
+ /**
22
+ * Create a compute device adapter
23
+ *
24
+ * @param config - Adapter configuration
25
+ * @returns DeviceAdapter for compute devices
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * const adapter = computeDeviceAdapter({
30
+ * tokenPrefix: 'qwf_dev',
31
+ * requireHostname: true,
32
+ * });
33
+ * ```
34
+ */
35
+ export declare function computeDeviceAdapter(config?: ComputeAdapterConfig): DeviceAdapter;
36
+ //# sourceMappingURL=compute-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/devices/adapters/compute-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,aAAa,EAKd,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,oBAAyB,GAAG,aAAa,CA+FrF"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Compute Device Adapter
3
+ *
4
+ * Adapter for computing devices (laptops, desktops, containers).
5
+ * Used by QwickForge for CLI device management.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ /**
10
+ * Create a compute device adapter
11
+ *
12
+ * @param config - Adapter configuration
13
+ * @returns DeviceAdapter for compute devices
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const adapter = computeDeviceAdapter({
18
+ * tokenPrefix: 'qwf_dev',
19
+ * requireHostname: true,
20
+ * });
21
+ * ```
22
+ */
23
+ export function computeDeviceAdapter(config = {}) {
24
+ const { tokenPrefix = 'qwf_dev', requireHostname = false, allowedOS, } = config;
25
+ return {
26
+ name: 'compute',
27
+ tokenPrefix,
28
+ validateDeviceInput(input) {
29
+ const errors = [];
30
+ const metadata = input.metadata;
31
+ // Validate name
32
+ if (!input.name || input.name.trim().length === 0) {
33
+ errors.push('Device name is required');
34
+ }
35
+ if (input.name && input.name.length > 255) {
36
+ errors.push('Device name must be 255 characters or less');
37
+ }
38
+ // Validate hostname if required
39
+ if (requireHostname && (!metadata?.hostname || metadata.hostname.trim().length === 0)) {
40
+ errors.push('Hostname is required for compute devices');
41
+ }
42
+ // Validate OS if allowedOS is specified
43
+ if (allowedOS && metadata?.os) {
44
+ if (!allowedOS.includes(metadata.os)) {
45
+ errors.push(`OS '${metadata.os}' is not allowed. Allowed: ${allowedOS.join(', ')}`);
46
+ }
47
+ }
48
+ // Validate architecture
49
+ if (metadata?.arch) {
50
+ const validArchs = ['x64', 'arm64', 'ia32', 'arm'];
51
+ if (!validArchs.includes(metadata.arch)) {
52
+ errors.push(`Invalid architecture '${metadata.arch}'. Valid: ${validArchs.join(', ')}`);
53
+ }
54
+ }
55
+ return {
56
+ valid: errors.length === 0,
57
+ errors: errors.length > 0 ? errors : undefined,
58
+ };
59
+ },
60
+ transformForStorage(input) {
61
+ const metadata = (input.metadata || {});
62
+ // Ensure compute-specific defaults
63
+ return {
64
+ hostname: metadata.hostname || null,
65
+ os: metadata.os || null,
66
+ os_version: metadata.os_version || null,
67
+ arch: metadata.arch || null,
68
+ cli_capabilities: metadata.cli_capabilities || [],
69
+ container_id: metadata.container_id || null,
70
+ node_version: metadata.node_version || null,
71
+ };
72
+ },
73
+ transformFromStorage(row) {
74
+ const metadata = (row.metadata || {});
75
+ // Extract compute-specific fields from metadata
76
+ return {
77
+ hostname: metadata.hostname,
78
+ os: metadata.os,
79
+ os_version: metadata.os_version,
80
+ arch: metadata.arch,
81
+ cli_capabilities: metadata.cli_capabilities || [],
82
+ container_id: metadata.container_id,
83
+ node_version: metadata.node_version,
84
+ };
85
+ },
86
+ async onDeviceCreated(device) {
87
+ // Optional: Log device creation, send notifications, etc.
88
+ console.log(`[ComputeAdapter] Device created: ${device.name} (${device.id})`);
89
+ },
90
+ async onDeviceDeleted(device) {
91
+ // Optional: Cleanup, revoke certificates, etc.
92
+ console.log(`[ComputeAdapter] Device deleted: ${device.name} (${device.id})`);
93
+ },
94
+ async onDeviceVerified(device, ip) {
95
+ // Optional: Log device verification, track activity
96
+ console.log(`[ComputeAdapter] Device verified: ${device.name} from ${ip || 'unknown'}`);
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=compute-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/devices/adapters/compute-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Device Adapters
3
+ *
4
+ * Export all built-in device adapters.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ export { computeDeviceAdapter } from './compute-adapter.js';
9
+ export type { ComputeAdapterConfig } from './compute-adapter.js';
10
+ export { mobileDeviceAdapter } from './mobile-adapter.js';
11
+ export type { MobileAdapterConfig } from './mobile-adapter.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/devices/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Device Adapters
3
+ *
4
+ * Export all built-in device adapters.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ export { computeDeviceAdapter } from './compute-adapter.js';
9
+ export { mobileDeviceAdapter } from './mobile-adapter.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/devices/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Mobile Device Adapter
3
+ *
4
+ * Adapter for mobile devices (phones, tablets).
5
+ * Used by QwickBot for mobile app device management.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ import type { DeviceAdapter } from '../types.js';
10
+ /**
11
+ * Mobile adapter configuration
12
+ */
13
+ export interface MobileAdapterConfig {
14
+ /** Token prefix (default: 'qwb_mob') */
15
+ tokenPrefix?: string;
16
+ /** Require device model in metadata */
17
+ requireDeviceModel?: boolean;
18
+ /** Require app version in metadata */
19
+ requireAppVersion?: boolean;
20
+ /** Allowed OS names (optional, allows all if not specified) */
21
+ allowedOS?: string[];
22
+ /** Minimum app version (optional, uses semver) */
23
+ minAppVersion?: string;
24
+ }
25
+ /**
26
+ * Create a mobile device adapter
27
+ *
28
+ * @param config - Adapter configuration
29
+ * @returns DeviceAdapter for mobile devices
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const adapter = mobileDeviceAdapter({
34
+ * tokenPrefix: 'qwb_mob',
35
+ * requireDeviceModel: true,
36
+ * allowedOS: ['iOS', 'Android'],
37
+ * });
38
+ * ```
39
+ */
40
+ export declare function mobileDeviceAdapter(config?: MobileAdapterConfig): DeviceAdapter;
41
+ //# sourceMappingURL=mobile-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile-adapter.d.ts","sourceRoot":"","sources":["../../../../src/plugins/devices/adapters/mobile-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,aAAa,EAKd,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,mBAAwB,GAAG,aAAa,CAkHnF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Mobile Device Adapter
3
+ *
4
+ * Adapter for mobile devices (phones, tablets).
5
+ * Used by QwickBot for mobile app device management.
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ /**
10
+ * Compare semver versions (simplified)
11
+ */
12
+ function compareSemver(v1, v2) {
13
+ const parts1 = v1.split('.').map(Number);
14
+ const parts2 = v2.split('.').map(Number);
15
+ for (let i = 0; i < 3; i++) {
16
+ const p1 = parts1[i] || 0;
17
+ const p2 = parts2[i] || 0;
18
+ if (p1 > p2)
19
+ return 1;
20
+ if (p1 < p2)
21
+ return -1;
22
+ }
23
+ return 0;
24
+ }
25
+ /**
26
+ * Create a mobile device adapter
27
+ *
28
+ * @param config - Adapter configuration
29
+ * @returns DeviceAdapter for mobile devices
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const adapter = mobileDeviceAdapter({
34
+ * tokenPrefix: 'qwb_mob',
35
+ * requireDeviceModel: true,
36
+ * allowedOS: ['iOS', 'Android'],
37
+ * });
38
+ * ```
39
+ */
40
+ export function mobileDeviceAdapter(config = {}) {
41
+ const { tokenPrefix = 'qwb_mob', requireDeviceModel = false, requireAppVersion = false, allowedOS, minAppVersion, } = config;
42
+ return {
43
+ name: 'mobile',
44
+ tokenPrefix,
45
+ validateDeviceInput(input) {
46
+ const errors = [];
47
+ const metadata = input.metadata;
48
+ // Validate name
49
+ if (!input.name || input.name.trim().length === 0) {
50
+ errors.push('Device name is required');
51
+ }
52
+ if (input.name && input.name.length > 255) {
53
+ errors.push('Device name must be 255 characters or less');
54
+ }
55
+ // Validate device model if required
56
+ if (requireDeviceModel && (!metadata?.device_model || metadata.device_model.trim().length === 0)) {
57
+ errors.push('Device model is required for mobile devices');
58
+ }
59
+ // Validate app version if required
60
+ if (requireAppVersion && (!metadata?.app_version || metadata.app_version.trim().length === 0)) {
61
+ errors.push('App version is required for mobile devices');
62
+ }
63
+ // Validate OS if allowedOS is specified
64
+ if (allowedOS && metadata?.os_name) {
65
+ if (!allowedOS.includes(metadata.os_name)) {
66
+ errors.push(`OS '${metadata.os_name}' is not supported. Supported: ${allowedOS.join(', ')}`);
67
+ }
68
+ }
69
+ // Validate minimum app version
70
+ if (minAppVersion && metadata?.app_version) {
71
+ if (compareSemver(metadata.app_version, minAppVersion) < 0) {
72
+ errors.push(`App version ${metadata.app_version} is below minimum required version ${minAppVersion}`);
73
+ }
74
+ }
75
+ // Validate screen dimensions if provided
76
+ if (metadata?.screen_width !== undefined && metadata.screen_width <= 0) {
77
+ errors.push('Screen width must be a positive number');
78
+ }
79
+ if (metadata?.screen_height !== undefined && metadata.screen_height <= 0) {
80
+ errors.push('Screen height must be a positive number');
81
+ }
82
+ return {
83
+ valid: errors.length === 0,
84
+ errors: errors.length > 0 ? errors : undefined,
85
+ };
86
+ },
87
+ transformForStorage(input) {
88
+ const metadata = (input.metadata || {});
89
+ // Ensure mobile-specific defaults
90
+ return {
91
+ device_model: metadata.device_model || null,
92
+ os_name: metadata.os_name || null,
93
+ os_version: metadata.os_version || null,
94
+ app_version: metadata.app_version || null,
95
+ push_token: metadata.push_token || null,
96
+ screen_width: metadata.screen_width || null,
97
+ screen_height: metadata.screen_height || null,
98
+ };
99
+ },
100
+ transformFromStorage(row) {
101
+ const metadata = (row.metadata || {});
102
+ // Extract mobile-specific fields from metadata
103
+ return {
104
+ device_model: metadata.device_model,
105
+ os_name: metadata.os_name,
106
+ os_version: metadata.os_version,
107
+ app_version: metadata.app_version,
108
+ push_token: metadata.push_token,
109
+ screen_width: metadata.screen_width,
110
+ screen_height: metadata.screen_height,
111
+ };
112
+ },
113
+ async onDeviceCreated(device) {
114
+ // Optional: Log device creation, track in analytics, etc.
115
+ console.log(`[MobileAdapter] Device registered: ${device.name} (${device.id})`);
116
+ },
117
+ async onDeviceDeleted(device) {
118
+ // Optional: Unregister push token, cleanup, etc.
119
+ const metadata = device.metadata;
120
+ if (metadata?.push_token) {
121
+ console.log(`[MobileAdapter] Should unregister push token for device: ${device.id}`);
122
+ }
123
+ console.log(`[MobileAdapter] Device deleted: ${device.name} (${device.id})`);
124
+ },
125
+ async onDeviceVerified(device, ip) {
126
+ // Optional: Log device verification, track activity
127
+ console.log(`[MobileAdapter] Device verified: ${device.name} from ${ip || 'unknown'}`);
128
+ },
129
+ };
130
+ }
131
+ //# sourceMappingURL=mobile-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile-adapter.js","sourceRoot":"","sources":["../../../../src/plugins/devices/adapters/mobile-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0BH;;GAEG;AACH,SAAS,aAAa,CAAC,EAAU,EAAE,EAAU;IAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;QACtB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,SAA8B,EAAE;IAClE,MAAM,EACJ,WAAW,GAAG,SAAS,EACvB,kBAAkB,GAAG,KAAK,EAC1B,iBAAiB,GAAG,KAAK,EACzB,SAAS,EACT,aAAa,GACd,GAAG,MAAM,CAAC;IAEX,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,WAAW;QAEX,mBAAmB,CAAC,KAAwB;YAC1C,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAA4C,CAAC;YAEpE,gBAAgB;YAChB,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1C,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;YAED,oCAAoC;YACpC,IAAI,kBAAkB,IAAI,CAAC,CAAC,QAAQ,EAAE,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjG,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;YAED,mCAAmC;YACnC,IAAI,iBAAiB,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC9F,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;YAED,wCAAwC;YACxC,IAAI,SAAS,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,kCAAkC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/F,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,IAAI,aAAa,IAAI,QAAQ,EAAE,WAAW,EAAE,CAAC;gBAC3C,IAAI,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3D,MAAM,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,WAAW,sCAAsC,aAAa,EAAE,CAAC,CAAC;gBACxG,CAAC;YACH,CAAC;YAED,yCAAyC;YACzC,IAAI,QAAQ,EAAE,YAAY,KAAK,SAAS,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,QAAQ,EAAE,aAAa,KAAK,SAAS,IAAI,QAAQ,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACzD,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;gBAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;aAC/C,CAAC;QACJ,CAAC;QAED,mBAAmB,CAAC,KAAwB;YAC1C,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAyB,CAAC;YAEhE,kCAAkC;YAClC,OAAO;gBACL,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;gBAC3C,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;gBACjC,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI;gBACvC,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI;gBACzC,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,IAAI;gBACvC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;gBAC3C,aAAa,EAAE,QAAQ,CAAC,aAAa,IAAI,IAAI;aAC9C,CAAC;QACJ,CAAC;QAED,oBAAoB,CAAC,GAA4B;YAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;YAEjE,+CAA+C;YAC/C,OAAO;gBACL,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;gBACnC,aAAa,EAAE,QAAQ,CAAC,aAAa;aACtC,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAc;YAClC,0DAA0D;YAC1D,OAAO,CAAC,GAAG,CAAC,sCAAsC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAc;YAClC,iDAAiD;YACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;YACzD,IAAI,QAAQ,EAAE,UAAU,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,4DAA4D,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/E,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,EAAW;YAChD,oDAAoD;YACpD,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,IAAI,SAAS,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC;QACzF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Devices Plugin
3
+ *
4
+ * Device management plugin for @qwickapps/server.
5
+ * Supports different device types through adapters (compute, mobile, IoT).
6
+ *
7
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
8
+ */
9
+ import type { Plugin } from '../../core/plugin-registry.js';
10
+ import type { DevicesPluginConfig, DeviceStore, DeviceAdapter, Device, DeviceWithToken, CreateDeviceInput, UpdateDeviceInput, TokenVerificationResult } from './types.js';
11
+ /**
12
+ * Create the Devices plugin
13
+ */
14
+ export declare function createDevicesPlugin(config: DevicesPluginConfig): Plugin;
15
+ /**
16
+ * Get the current device store instance
17
+ */
18
+ export declare function getDeviceStore(): DeviceStore | null;
19
+ /**
20
+ * Get the current device adapter instance
21
+ */
22
+ export declare function getDeviceAdapter(): DeviceAdapter | null;
23
+ /**
24
+ * Register a new device
25
+ */
26
+ export declare function registerDevice(input: CreateDeviceInput): Promise<DeviceWithToken>;
27
+ /**
28
+ * Verify a device token
29
+ */
30
+ export declare function verifyDeviceToken(token: string, clientIp?: string): Promise<TokenVerificationResult>;
31
+ /**
32
+ * Get a device by ID
33
+ */
34
+ export declare function getDeviceById(id: string): Promise<Device | null>;
35
+ /**
36
+ * Update a device
37
+ */
38
+ export declare function updateDevice(id: string, input: UpdateDeviceInput): Promise<Device | null>;
39
+ /**
40
+ * Delete a device
41
+ */
42
+ export declare function deleteDevice(id: string): Promise<boolean>;
43
+ /**
44
+ * Regenerate token for a device
45
+ */
46
+ export declare function regenerateToken(deviceId: string, validityDays?: number): Promise<{
47
+ token: string;
48
+ expiresAt: Date;
49
+ } | null>;
50
+ /**
51
+ * List devices for a user
52
+ */
53
+ export declare function listUserDevices(userId: string): Promise<Device[]>;
54
+ /**
55
+ * List devices for an organization
56
+ */
57
+ export declare function listOrgDevices(orgId: string): Promise<Device[]>;
58
+ /**
59
+ * Deactivate a device
60
+ */
61
+ export declare function deactivateDevice(id: string): Promise<boolean>;
62
+ /**
63
+ * Activate a device
64
+ */
65
+ export declare function activateDevice(id: string): Promise<boolean>;
66
+ /**
67
+ * Cleanup expired device tokens
68
+ */
69
+ export declare function cleanupExpiredTokens(): Promise<number>;
70
+ //# sourceMappingURL=devices-plugin.d.ts.map