@spinajs/rbac-http-token 2.0.507

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 (198) hide show
  1. package/README.md +152 -0
  2. package/lib/cjs/actions.d.ts +119 -0
  3. package/lib/cjs/actions.d.ts.map +1 -0
  4. package/lib/cjs/actions.js +257 -0
  5. package/lib/cjs/actions.js.map +1 -0
  6. package/lib/cjs/cli/CreateToken.d.ts +13 -0
  7. package/lib/cjs/cli/CreateToken.d.ts.map +1 -0
  8. package/lib/cjs/cli/CreateToken.js +56 -0
  9. package/lib/cjs/cli/CreateToken.js.map +1 -0
  10. package/lib/cjs/cli/DeleteExpiredTokens.d.ts +11 -0
  11. package/lib/cjs/cli/DeleteExpiredTokens.d.ts.map +1 -0
  12. package/lib/cjs/cli/DeleteExpiredTokens.js +39 -0
  13. package/lib/cjs/cli/DeleteExpiredTokens.js.map +1 -0
  14. package/lib/cjs/cli/DeleteToken.d.ts +7 -0
  15. package/lib/cjs/cli/DeleteToken.d.ts.map +1 -0
  16. package/lib/cjs/cli/DeleteToken.js +36 -0
  17. package/lib/cjs/cli/DeleteToken.js.map +1 -0
  18. package/lib/cjs/cli/GrantTokenRole.d.ts +7 -0
  19. package/lib/cjs/cli/GrantTokenRole.d.ts.map +1 -0
  20. package/lib/cjs/cli/GrantTokenRole.js +37 -0
  21. package/lib/cjs/cli/GrantTokenRole.js.map +1 -0
  22. package/lib/cjs/cli/RevokeTokenRole.d.ts +12 -0
  23. package/lib/cjs/cli/RevokeTokenRole.d.ts.map +1 -0
  24. package/lib/cjs/cli/RevokeTokenRole.js +42 -0
  25. package/lib/cjs/cli/RevokeTokenRole.js.map +1 -0
  26. package/lib/cjs/config/rbac-http-token.d.ts +71 -0
  27. package/lib/cjs/config/rbac-http-token.d.ts.map +1 -0
  28. package/lib/cjs/config/rbac-http-token.js +98 -0
  29. package/lib/cjs/config/rbac-http-token.js.map +1 -0
  30. package/lib/cjs/controllers/AccessTokenController.d.ts +139 -0
  31. package/lib/cjs/controllers/AccessTokenController.d.ts.map +1 -0
  32. package/lib/cjs/controllers/AccessTokenController.js +264 -0
  33. package/lib/cjs/controllers/AccessTokenController.js.map +1 -0
  34. package/lib/cjs/dto/create-token-dto.d.ts +34 -0
  35. package/lib/cjs/dto/create-token-dto.d.ts.map +1 -0
  36. package/lib/cjs/dto/create-token-dto.js +35 -0
  37. package/lib/cjs/dto/create-token-dto.js.map +1 -0
  38. package/lib/cjs/events/AccessTokenCreated.d.ts +4 -0
  39. package/lib/cjs/events/AccessTokenCreated.d.ts.map +1 -0
  40. package/lib/cjs/events/AccessTokenCreated.js +18 -0
  41. package/lib/cjs/events/AccessTokenCreated.js.map +1 -0
  42. package/lib/cjs/events/AccessTokenDeleted.d.ts +4 -0
  43. package/lib/cjs/events/AccessTokenDeleted.d.ts.map +1 -0
  44. package/lib/cjs/events/AccessTokenDeleted.js +18 -0
  45. package/lib/cjs/events/AccessTokenDeleted.js.map +1 -0
  46. package/lib/cjs/events/AccessTokenEvent.d.ts +10 -0
  47. package/lib/cjs/events/AccessTokenEvent.d.ts.map +1 -0
  48. package/lib/cjs/events/AccessTokenEvent.js +26 -0
  49. package/lib/cjs/events/AccessTokenEvent.js.map +1 -0
  50. package/lib/cjs/events/AccessTokenRoleGranted.d.ts +7 -0
  51. package/lib/cjs/events/AccessTokenRoleGranted.d.ts.map +1 -0
  52. package/lib/cjs/events/AccessTokenRoleGranted.js +27 -0
  53. package/lib/cjs/events/AccessTokenRoleGranted.js.map +1 -0
  54. package/lib/cjs/events/AccessTokenRoleRevoked.d.ts +7 -0
  55. package/lib/cjs/events/AccessTokenRoleRevoked.d.ts.map +1 -0
  56. package/lib/cjs/events/AccessTokenRoleRevoked.js +27 -0
  57. package/lib/cjs/events/AccessTokenRoleRevoked.js.map +1 -0
  58. package/lib/cjs/events/index.d.ts +6 -0
  59. package/lib/cjs/events/index.d.ts.map +1 -0
  60. package/lib/cjs/events/index.js +22 -0
  61. package/lib/cjs/events/index.js.map +1 -0
  62. package/lib/cjs/generator.d.ts +12 -0
  63. package/lib/cjs/generator.d.ts.map +1 -0
  64. package/lib/cjs/generator.js +42 -0
  65. package/lib/cjs/generator.js.map +1 -0
  66. package/lib/cjs/index.d.ts +20 -0
  67. package/lib/cjs/index.d.ts.map +1 -0
  68. package/lib/cjs/index.js +39 -0
  69. package/lib/cjs/index.js.map +1 -0
  70. package/lib/cjs/interfaces.d.ts +57 -0
  71. package/lib/cjs/interfaces.d.ts.map +1 -0
  72. package/lib/cjs/interfaces.js +11 -0
  73. package/lib/cjs/interfaces.js.map +1 -0
  74. package/lib/cjs/middlewares.d.ts +76 -0
  75. package/lib/cjs/middlewares.d.ts.map +1 -0
  76. package/lib/cjs/middlewares.js +181 -0
  77. package/lib/cjs/middlewares.js.map +1 -0
  78. package/lib/cjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.d.ts +6 -0
  79. package/lib/cjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.d.ts.map +1 -0
  80. package/lib/cjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js +38 -0
  81. package/lib/cjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js.map +1 -0
  82. package/lib/cjs/models/AccessToken.d.ts +55 -0
  83. package/lib/cjs/models/AccessToken.d.ts.map +1 -0
  84. package/lib/cjs/models/AccessToken.js +73 -0
  85. package/lib/cjs/models/AccessToken.js.map +1 -0
  86. package/lib/cjs/package.json +1 -0
  87. package/lib/cjs/policies/NoImpersonationPolicy.d.ts +28 -0
  88. package/lib/cjs/policies/NoImpersonationPolicy.d.ts.map +1 -0
  89. package/lib/cjs/policies/NoImpersonationPolicy.js +45 -0
  90. package/lib/cjs/policies/NoImpersonationPolicy.js.map +1 -0
  91. package/lib/cjs/policies/NoTokenAuthPolicy.d.ts +12 -0
  92. package/lib/cjs/policies/NoTokenAuthPolicy.d.ts.map +1 -0
  93. package/lib/cjs/policies/NoTokenAuthPolicy.js +24 -0
  94. package/lib/cjs/policies/NoTokenAuthPolicy.js.map +1 -0
  95. package/lib/cjs/policies/TokenPolicy.d.ts +49 -0
  96. package/lib/cjs/policies/TokenPolicy.d.ts.map +1 -0
  97. package/lib/cjs/policies/TokenPolicy.js +79 -0
  98. package/lib/cjs/policies/TokenPolicy.js.map +1 -0
  99. package/lib/mjs/actions.d.ts +119 -0
  100. package/lib/mjs/actions.d.ts.map +1 -0
  101. package/lib/mjs/actions.js +242 -0
  102. package/lib/mjs/actions.js.map +1 -0
  103. package/lib/mjs/cli/CreateToken.d.ts +13 -0
  104. package/lib/mjs/cli/CreateToken.d.ts.map +1 -0
  105. package/lib/mjs/cli/CreateToken.js +53 -0
  106. package/lib/mjs/cli/CreateToken.js.map +1 -0
  107. package/lib/mjs/cli/DeleteExpiredTokens.d.ts +11 -0
  108. package/lib/mjs/cli/DeleteExpiredTokens.d.ts.map +1 -0
  109. package/lib/mjs/cli/DeleteExpiredTokens.js +36 -0
  110. package/lib/mjs/cli/DeleteExpiredTokens.js.map +1 -0
  111. package/lib/mjs/cli/DeleteToken.d.ts +7 -0
  112. package/lib/mjs/cli/DeleteToken.d.ts.map +1 -0
  113. package/lib/mjs/cli/DeleteToken.js +33 -0
  114. package/lib/mjs/cli/DeleteToken.js.map +1 -0
  115. package/lib/mjs/cli/GrantTokenRole.d.ts +7 -0
  116. package/lib/mjs/cli/GrantTokenRole.d.ts.map +1 -0
  117. package/lib/mjs/cli/GrantTokenRole.js +34 -0
  118. package/lib/mjs/cli/GrantTokenRole.js.map +1 -0
  119. package/lib/mjs/cli/RevokeTokenRole.d.ts +12 -0
  120. package/lib/mjs/cli/RevokeTokenRole.d.ts.map +1 -0
  121. package/lib/mjs/cli/RevokeTokenRole.js +39 -0
  122. package/lib/mjs/cli/RevokeTokenRole.js.map +1 -0
  123. package/lib/mjs/config/rbac-http-token.d.ts +71 -0
  124. package/lib/mjs/config/rbac-http-token.d.ts.map +1 -0
  125. package/lib/mjs/config/rbac-http-token.js +96 -0
  126. package/lib/mjs/config/rbac-http-token.js.map +1 -0
  127. package/lib/mjs/controllers/AccessTokenController.d.ts +139 -0
  128. package/lib/mjs/controllers/AccessTokenController.d.ts.map +1 -0
  129. package/lib/mjs/controllers/AccessTokenController.js +261 -0
  130. package/lib/mjs/controllers/AccessTokenController.js.map +1 -0
  131. package/lib/mjs/dto/create-token-dto.d.ts +34 -0
  132. package/lib/mjs/dto/create-token-dto.d.ts.map +1 -0
  133. package/lib/mjs/dto/create-token-dto.js +32 -0
  134. package/lib/mjs/dto/create-token-dto.js.map +1 -0
  135. package/lib/mjs/events/AccessTokenCreated.d.ts +4 -0
  136. package/lib/mjs/events/AccessTokenCreated.d.ts.map +1 -0
  137. package/lib/mjs/events/AccessTokenCreated.js +15 -0
  138. package/lib/mjs/events/AccessTokenCreated.js.map +1 -0
  139. package/lib/mjs/events/AccessTokenDeleted.d.ts +4 -0
  140. package/lib/mjs/events/AccessTokenDeleted.d.ts.map +1 -0
  141. package/lib/mjs/events/AccessTokenDeleted.js +15 -0
  142. package/lib/mjs/events/AccessTokenDeleted.js.map +1 -0
  143. package/lib/mjs/events/AccessTokenEvent.d.ts +10 -0
  144. package/lib/mjs/events/AccessTokenEvent.d.ts.map +1 -0
  145. package/lib/mjs/events/AccessTokenEvent.js +23 -0
  146. package/lib/mjs/events/AccessTokenEvent.js.map +1 -0
  147. package/lib/mjs/events/AccessTokenRoleGranted.d.ts +7 -0
  148. package/lib/mjs/events/AccessTokenRoleGranted.d.ts.map +1 -0
  149. package/lib/mjs/events/AccessTokenRoleGranted.js +24 -0
  150. package/lib/mjs/events/AccessTokenRoleGranted.js.map +1 -0
  151. package/lib/mjs/events/AccessTokenRoleRevoked.d.ts +7 -0
  152. package/lib/mjs/events/AccessTokenRoleRevoked.d.ts.map +1 -0
  153. package/lib/mjs/events/AccessTokenRoleRevoked.js +24 -0
  154. package/lib/mjs/events/AccessTokenRoleRevoked.js.map +1 -0
  155. package/lib/mjs/events/index.d.ts +6 -0
  156. package/lib/mjs/events/index.d.ts.map +1 -0
  157. package/lib/mjs/events/index.js +6 -0
  158. package/lib/mjs/events/index.js.map +1 -0
  159. package/lib/mjs/generator.d.ts +12 -0
  160. package/lib/mjs/generator.d.ts.map +1 -0
  161. package/lib/mjs/generator.js +39 -0
  162. package/lib/mjs/generator.js.map +1 -0
  163. package/lib/mjs/index.d.ts +20 -0
  164. package/lib/mjs/index.d.ts.map +1 -0
  165. package/lib/mjs/index.js +23 -0
  166. package/lib/mjs/index.js.map +1 -0
  167. package/lib/mjs/interfaces.d.ts +57 -0
  168. package/lib/mjs/interfaces.d.ts.map +1 -0
  169. package/lib/mjs/interfaces.js +7 -0
  170. package/lib/mjs/interfaces.js.map +1 -0
  171. package/lib/mjs/middlewares.d.ts +76 -0
  172. package/lib/mjs/middlewares.d.ts.map +1 -0
  173. package/lib/mjs/middlewares.js +178 -0
  174. package/lib/mjs/middlewares.js.map +1 -0
  175. package/lib/mjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.d.ts +6 -0
  176. package/lib/mjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.d.ts.map +1 -0
  177. package/lib/mjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js +35 -0
  178. package/lib/mjs/migrations/RbacHttpTokenInitial_2026_08_11_01_00_00.js.map +1 -0
  179. package/lib/mjs/models/AccessToken.d.ts +55 -0
  180. package/lib/mjs/models/AccessToken.d.ts.map +1 -0
  181. package/lib/mjs/models/AccessToken.js +70 -0
  182. package/lib/mjs/models/AccessToken.js.map +1 -0
  183. package/lib/mjs/package.json +1 -0
  184. package/lib/mjs/policies/NoImpersonationPolicy.d.ts +28 -0
  185. package/lib/mjs/policies/NoImpersonationPolicy.d.ts.map +1 -0
  186. package/lib/mjs/policies/NoImpersonationPolicy.js +41 -0
  187. package/lib/mjs/policies/NoImpersonationPolicy.js.map +1 -0
  188. package/lib/mjs/policies/NoTokenAuthPolicy.d.ts +12 -0
  189. package/lib/mjs/policies/NoTokenAuthPolicy.d.ts.map +1 -0
  190. package/lib/mjs/policies/NoTokenAuthPolicy.js +20 -0
  191. package/lib/mjs/policies/NoTokenAuthPolicy.js.map +1 -0
  192. package/lib/mjs/policies/TokenPolicy.d.ts +49 -0
  193. package/lib/mjs/policies/TokenPolicy.d.ts.map +1 -0
  194. package/lib/mjs/policies/TokenPolicy.js +75 -0
  195. package/lib/mjs/policies/TokenPolicy.js.map +1 -0
  196. package/lib/tsconfig.cjs.tsbuildinfo +1 -0
  197. package/lib/tsconfig.mjs.tsbuildinfo +1 -0
  198. package/package.json +78 -0
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AccessTokenController = void 0;
16
+ const http_1 = require("@spinajs/http");
17
+ const rbac_1 = require("@spinajs/rbac");
18
+ const rbac_http_1 = require("@spinajs/rbac-http");
19
+ const exceptions_1 = require("@spinajs/exceptions");
20
+ const luxon_1 = require("luxon");
21
+ const AccessToken_js_1 = require("../models/AccessToken.js");
22
+ const actions_js_1 = require("../actions.js");
23
+ const create_token_dto_js_1 = require("../dto/create-token-dto.js");
24
+ const NoTokenAuthPolicy_js_1 = require("../policies/NoTokenAuthPolicy.js");
25
+ const NoImpersonationPolicy_js_1 = require("../policies/NoImpersonationPolicy.js");
26
+ /**
27
+ * Self-service management of own access tokens.
28
+ *
29
+ * SELF-service in the strict sense: the caller must be the account owner,
30
+ * present in person. Two ways of acting *as* somebody are refused outright -
31
+ * an access token ( which must never mint another token ) and an impersonated
32
+ * session ( which must never mint a credential that outlives it ). Every query
33
+ * is additionally constrained by the calling user's id, so a foreign uuid is
34
+ * simply not found.
35
+ *
36
+ * WIRING - the decorator layout below is load bearing. The two guards share ONE
37
+ * `@Policy([...])` group so they are ANDed; splitting them into two `@Policy()`
38
+ * calls would OR them and each would become optional. And do NOT add a class
39
+ * level `@Policy(RbacPolicy)` alongside:
40
+ *
41
+ * `@spinajs/http` combines policies at three levels ( see `createPolicyGate` in
42
+ * `http/src/route-builder.ts` ): AND inside one `@Policy()` group, OR between
43
+ * the groups declared at one scope, AND between the controller scope and the
44
+ * route scope. `@Permission()` already pushes `RbacPolicy` as a group on the
45
+ * ROUTE ( `rbac-http/src/decorators.ts` ), so:
46
+ *
47
+ * - controller scope holds exactly ONE group,
48
+ * `[NoTokenAuthPolicy, NoImpersonationPolicy]`. A lone group cannot be ORed
49
+ * away, so both are a hard requirement of EVERY route on this controller,
50
+ * including any route added later.
51
+ * - route scope holds `[RbacPolicy]` from `@Permission`, which demands an
52
+ * authorized session AND the declared grant.
53
+ *
54
+ * Adding `@Policy(RbacPolicy)` at class level would make the controller scope
55
+ * `[NoTokenAuthPolicy, NoImpersonationPolicy] OR [RbacPolicy]`, and satisfying
56
+ * `RbacPolicy` alone would then discharge the whole scope - both invariants
57
+ * would rest on nothing but RbacPolicy's own session check, which does not look
58
+ * at impersonation at all.
59
+ *
60
+ * @tags AccessTokens
61
+ */
62
+ let AccessTokenController = class AccessTokenController extends http_1.BaseController {
63
+ /**
64
+ * List own access tokens
65
+ * Hashes are never returned - `Token` is `@Hidden()` on the model, so the
66
+ * dehydrated rows carry the uuid, label, roles and timestamps only.
67
+ * @security cookieAuth
68
+ * @response 200 Own tokens
69
+ * @response 401 Unauthorized - valid session required
70
+ * @response 403 Forbidden - access tokens cannot be used on this route
71
+ */
72
+ async list(user) {
73
+ const tokens = await AccessToken_js_1.AccessToken.where('user_id', user.Id);
74
+ return new http_1.Ok(tokens.map((t) => this.toWire(t)));
75
+ }
76
+ /**
77
+ * Create an access token
78
+ * The plaintext appears in this response only and cannot be retrieved again.
79
+ * Roles must be a subset of the caller's own roles.
80
+ * @security cookieAuth
81
+ * @response 200 Token created, `Plaintext` returned once
82
+ * @response 400 Requested roles are not held by the caller
83
+ * @response 401 Unauthorized - valid session required
84
+ * @response 403 Forbidden - access tokens cannot be used on this route
85
+ */
86
+ async create(user, dto) {
87
+ const expiresAt = dto.ExpiresAt ? luxon_1.DateTime.fromISO(dto.ExpiresAt) : null;
88
+ try {
89
+ const { Token, Plaintext } = await (0, actions_js_1.createToken)(user, dto.Name, dto.Roles, expiresAt);
90
+ return new http_1.Ok({ Token: this.toWire(Token), Plaintext }, { Headers: [{ Name: 'Cache-Control', Value: 'no-store' }] });
91
+ }
92
+ catch (err) {
93
+ return this.roleError(err);
94
+ }
95
+ }
96
+ /**
97
+ * Delete ( revoke ) an own token
98
+ * @security cookieAuth
99
+ * @param uuid Public identifier of the token
100
+ * @response 200 Token deleted
101
+ * @response 401 Unauthorized - valid session required
102
+ * @response 403 Forbidden - access tokens cannot be used on this route
103
+ * @response 404 No such token for this user
104
+ */
105
+ async delete(user, uuid) {
106
+ const token = await this.own(user, uuid);
107
+ if (!token) {
108
+ return new http_1.NotFound({ error: { code: 'E_TOKEN_NOT_FOUND', message: 'No such token' } });
109
+ }
110
+ await (0, actions_js_1.deleteToken)(token);
111
+ return new http_1.Ok();
112
+ }
113
+ /**
114
+ * Grant a role to an own token
115
+ * The role must be held by the caller - a token can never carry more than its
116
+ * owner does.
117
+ * @security cookieAuth
118
+ * @param uuid Public identifier of the token
119
+ * @param role Role name to grant
120
+ * @response 200 Updated token
121
+ * @response 400 Role is not held by the caller
122
+ * @response 401 Unauthorized - valid session required
123
+ * @response 403 Forbidden - access tokens cannot be used on this route
124
+ * @response 404 No such token for this user
125
+ */
126
+ async grantRole(user, uuid, role) {
127
+ const token = await this.own(user, uuid);
128
+ if (!token) {
129
+ return new http_1.NotFound({ error: { code: 'E_TOKEN_NOT_FOUND', message: 'No such token' } });
130
+ }
131
+ try {
132
+ const updated = await (0, actions_js_1.grantTokenRole)(token, role);
133
+ return new http_1.Ok(this.toWire(updated));
134
+ }
135
+ catch (err) {
136
+ return this.roleError(err);
137
+ }
138
+ }
139
+ /**
140
+ * Revoke a role from an own token
141
+ * A token must keep at least one role; dropping the last one is refused with
142
+ * 400 - deleting the token is the way to revoke it entirely.
143
+ * @security cookieAuth
144
+ * @param uuid Public identifier of the token
145
+ * @param role Role name to revoke
146
+ * @response 200 Updated token
147
+ * @response 400 Cannot revoke the token's last role
148
+ * @response 401 Unauthorized - valid session required
149
+ * @response 403 Forbidden - access tokens cannot be used on this route
150
+ * @response 404 No such token for this user
151
+ */
152
+ async revokeRole(user, uuid, role) {
153
+ const token = await this.own(user, uuid);
154
+ if (!token) {
155
+ return new http_1.NotFound({ error: { code: 'E_TOKEN_NOT_FOUND', message: 'No such token' } });
156
+ }
157
+ try {
158
+ const updated = await (0, actions_js_1.revokeTokenRole)(token, role);
159
+ return new http_1.Ok(this.toWire(updated));
160
+ }
161
+ catch (err) {
162
+ return this.roleError(err);
163
+ }
164
+ }
165
+ /**
166
+ * Resolves a token by uuid WITHIN the caller's own tokens - the ownership
167
+ * boundary of this whole controller.
168
+ */
169
+ own(user, uuid) {
170
+ return AccessToken_js_1.AccessToken.where({ Uuid: uuid, user_id: user.Id }).first();
171
+ }
172
+ /**
173
+ * Wire shape of one token: the dehydrated row, with timestamps as ISO
174
+ * instants and `Roles` put back as a real array.
175
+ *
176
+ * `dehydrate()` runs every column through its converter's `toDB` direction -
177
+ * the STORAGE encoding, which is not the API contract in two places:
178
+ *
179
+ * - `dateTimeFormat: 'iso'` is what turns `CreatedAt` / `ExpiresAt` /
180
+ * `LastUsedAt` into offset-carrying ISO strings. Without it the sql
181
+ * converter emits its driver format ( `"2026-08-11 10:00:00"` ), which
182
+ * names no offset at all, so a client has to guess the zone. Every other
183
+ * user-bearing response in the repo dehydrates with this option - see
184
+ * `rbac-http-user/src/controllers/UserController.ts` - and a plain
185
+ * `toJSON()` is exactly `dehydrate()` with the option missing.
186
+ * - `@Set()`'s converter joins the role list into `"user,admin"`. Left
187
+ * alone, `Roles` reaches clients as a string that only looks like a list,
188
+ * which no generated client parses back.
189
+ *
190
+ * `@Hidden()` columns ( `Token`, `Id` ) are dropped by `dehydrate` itself and
191
+ * `user_id` is skipped as the `User` relation's foreign key, so the hash still
192
+ * never leaves here.
193
+ */
194
+ toWire(token) {
195
+ return { ...token.dehydrate({ dateTimeFormat: 'iso' }), Roles: [...token.Roles] };
196
+ }
197
+ /**
198
+ * Turns the actions layer's role refusals into a 400.
199
+ *
200
+ * `ErrorCode` has no entry in the http error map, so an uncaught one leaves as
201
+ * a 500 - and "you asked for a role you do not have" / "a token must keep one
202
+ * role" are the caller's mistakes, not the server's. Anything else is rethrown
203
+ * untouched so a genuine failure still reaches the error handler.
204
+ */
205
+ roleError(err) {
206
+ if (err instanceof exceptions_1.ErrorCode && err.code === actions_js_1.E_TOKEN_CODES.E_TOKEN_ROLE_NOT_ALLOWED) {
207
+ return new http_1.BadRequestResponse({ error: { code: 'E_TOKEN_ROLE_NOT_ALLOWED', message: err.message } });
208
+ }
209
+ throw err;
210
+ }
211
+ };
212
+ exports.AccessTokenController = AccessTokenController;
213
+ __decorate([
214
+ (0, http_1.Get)('tokens'),
215
+ (0, rbac_http_1.Permission)(['readOwn']),
216
+ __param(0, (0, rbac_http_1.User)()),
217
+ __metadata("design:type", Function),
218
+ __metadata("design:paramtypes", [rbac_1.User]),
219
+ __metadata("design:returntype", Promise)
220
+ ], AccessTokenController.prototype, "list", null);
221
+ __decorate([
222
+ (0, http_1.Post)('tokens'),
223
+ (0, rbac_http_1.Permission)(['createOwn']),
224
+ __param(0, (0, rbac_http_1.User)()),
225
+ __param(1, (0, http_1.Body)()),
226
+ __metadata("design:type", Function),
227
+ __metadata("design:paramtypes", [rbac_1.User, create_token_dto_js_1.CreateTokenDto]),
228
+ __metadata("design:returntype", Promise)
229
+ ], AccessTokenController.prototype, "create", null);
230
+ __decorate([
231
+ (0, http_1.Del)('tokens/:uuid'),
232
+ (0, rbac_http_1.Permission)(['deleteOwn']),
233
+ __param(0, (0, rbac_http_1.User)()),
234
+ __param(1, (0, http_1.Param)()),
235
+ __metadata("design:type", Function),
236
+ __metadata("design:paramtypes", [rbac_1.User, String]),
237
+ __metadata("design:returntype", Promise)
238
+ ], AccessTokenController.prototype, "delete", null);
239
+ __decorate([
240
+ (0, http_1.Put)('tokens/:uuid/roles/:role'),
241
+ (0, rbac_http_1.Permission)(['updateOwn']),
242
+ __param(0, (0, rbac_http_1.User)()),
243
+ __param(1, (0, http_1.Param)()),
244
+ __param(2, (0, http_1.Param)()),
245
+ __metadata("design:type", Function),
246
+ __metadata("design:paramtypes", [rbac_1.User, String, String]),
247
+ __metadata("design:returntype", Promise)
248
+ ], AccessTokenController.prototype, "grantRole", null);
249
+ __decorate([
250
+ (0, http_1.Del)('tokens/:uuid/roles/:role'),
251
+ (0, rbac_http_1.Permission)(['updateOwn']),
252
+ __param(0, (0, rbac_http_1.User)()),
253
+ __param(1, (0, http_1.Param)()),
254
+ __param(2, (0, http_1.Param)()),
255
+ __metadata("design:type", Function),
256
+ __metadata("design:paramtypes", [rbac_1.User, String, String]),
257
+ __metadata("design:returntype", Promise)
258
+ ], AccessTokenController.prototype, "revokeRole", null);
259
+ exports.AccessTokenController = AccessTokenController = __decorate([
260
+ (0, http_1.BasePath)('user'),
261
+ (0, rbac_http_1.Resource)('user.tokens'),
262
+ (0, http_1.Policy)([NoTokenAuthPolicy_js_1.NoTokenAuthPolicy, NoImpersonationPolicy_js_1.NoImpersonationPolicy])
263
+ ], AccessTokenController);
264
+ //# sourceMappingURL=AccessTokenController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenController.js","sourceRoot":"","sources":["../../../src/controllers/AccessTokenController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export declare const CreateTokenDtoSchema: {
2
+ $schema: string;
3
+ title: string;
4
+ type: string;
5
+ properties: {
6
+ Name: {
7
+ type: string;
8
+ minLength: number;
9
+ maxLength: number;
10
+ description: string;
11
+ };
12
+ Roles: {
13
+ type: string;
14
+ items: {
15
+ type: string;
16
+ };
17
+ minItems: number;
18
+ description: string;
19
+ };
20
+ ExpiresAt: {
21
+ type: string[];
22
+ format: string;
23
+ description: string;
24
+ };
25
+ };
26
+ required: string[];
27
+ };
28
+ export declare class CreateTokenDto {
29
+ Name: string;
30
+ Roles: string[];
31
+ ExpiresAt?: string | null;
32
+ constructor(data: any);
33
+ }
34
+ //# sourceMappingURL=create-token-dto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-token-dto.d.ts","sourceRoot":"","sources":["../../../src/dto/create-token-dto.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB;IAC/B,OAAO;IACP,KAAK;IACL,IAAI;IACJ,UAAU;QACR,IAAI;YAAI,IAAI;YAAY,SAAS;YAAK,SAAS;YAAO,WAAW;;QACjE,KAAK;YAAI,IAAI;YAAW,KAAK;gBAAI,IAAI;;YAAc,QAAQ;YAAK,WAAW;;QAC3E,SAAS;YAAI,IAAI;YAAsB,MAAM;YAAe,WAAW;;;IAEzE,QAAQ;CACT,CAAC;AAEF,qBACa,cAAc;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC,YAAY,IAAI,EAAE,GAAG,EAEpB;CACF"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CreateTokenDto = exports.CreateTokenDtoSchema = void 0;
13
+ const validation_1 = require("@spinajs/validation");
14
+ exports.CreateTokenDtoSchema = {
15
+ $schema: 'http://json-schema.org/draft-07/schema#',
16
+ title: 'Create access token DTO',
17
+ type: 'object',
18
+ properties: {
19
+ Name: { type: 'string', minLength: 1, maxLength: 128, description: 'Human readable token label' },
20
+ Roles: { type: 'array', items: { type: 'string' }, minItems: 1, description: 'Roles allowed on the token, must be subset of own roles' },
21
+ ExpiresAt: { type: ['string', 'null'], format: 'date-time', description: 'ISO expiration instant; null or omitted = never expires' },
22
+ },
23
+ required: ['Name', 'Roles'],
24
+ };
25
+ let CreateTokenDto = class CreateTokenDto {
26
+ constructor(data) {
27
+ Object.assign(this, data);
28
+ }
29
+ };
30
+ exports.CreateTokenDto = CreateTokenDto;
31
+ exports.CreateTokenDto = CreateTokenDto = __decorate([
32
+ (0, validation_1.Schema)(exports.CreateTokenDtoSchema),
33
+ __metadata("design:paramtypes", [Object])
34
+ ], CreateTokenDto);
35
+ //# sourceMappingURL=create-token-dto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-token-dto.js","sourceRoot":"","sources":["../../../src/dto/create-token-dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA6C;AAEhC,QAAA,oBAAoB,GAAG;IAClC,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,yBAAyB;IAChC,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,4BAA4B,EAAE;QACjG,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,yDAAyD,EAAE;QACxI,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,yDAAyD,EAAE;KACrI;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;CAC5B,CAAC;AAGK,IAAM,cAAc,GAApB,MAAM,cAAc;IAKzB,YAAY,IAAS;QACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF,CAAA;;yBARY,cAAc;IAD1B,IAAA,mBAAM,EAAC,QAAA,oBAAoB,CAAC;;GAChB,cAAc,CAQ1B"}
@@ -0,0 +1,4 @@
1
+ import { AccessTokenEvent } from './AccessTokenEvent.js';
2
+ export declare class AccessTokenCreated extends AccessTokenEvent {
3
+ }
4
+ //# sourceMappingURL=AccessTokenCreated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenCreated.d.ts","sourceRoot":"","sources":["../../../src/events/AccessTokenCreated.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBACa,kBAAmB,SAAQ,gBAAgB;CAAG"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AccessTokenCreated = void 0;
10
+ const queue_1 = require("@spinajs/queue");
11
+ const AccessTokenEvent_js_1 = require("./AccessTokenEvent.js");
12
+ let AccessTokenCreated = class AccessTokenCreated extends AccessTokenEvent_js_1.AccessTokenEvent {
13
+ };
14
+ exports.AccessTokenCreated = AccessTokenCreated;
15
+ exports.AccessTokenCreated = AccessTokenCreated = __decorate([
16
+ (0, queue_1.Event)()
17
+ ], AccessTokenCreated);
18
+ //# sourceMappingURL=AccessTokenCreated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenCreated.js","sourceRoot":"","sources":["../../../src/events/AccessTokenCreated.ts"],"names":[],"mappings":";;;;;;;;;AAAA,0CAAuC;AACvC,+DAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,sCAAgB;CAAG,CAAA;;6BAA9C,kBAAkB;IAD9B,IAAA,aAAK,GAAE;GACK,kBAAkB,CAA4B"}
@@ -0,0 +1,4 @@
1
+ import { AccessTokenEvent } from './AccessTokenEvent.js';
2
+ export declare class AccessTokenDeleted extends AccessTokenEvent {
3
+ }
4
+ //# sourceMappingURL=AccessTokenDeleted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenDeleted.d.ts","sourceRoot":"","sources":["../../../src/events/AccessTokenDeleted.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBACa,kBAAmB,SAAQ,gBAAgB;CAAG"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AccessTokenDeleted = void 0;
10
+ const queue_1 = require("@spinajs/queue");
11
+ const AccessTokenEvent_js_1 = require("./AccessTokenEvent.js");
12
+ let AccessTokenDeleted = class AccessTokenDeleted extends AccessTokenEvent_js_1.AccessTokenEvent {
13
+ };
14
+ exports.AccessTokenDeleted = AccessTokenDeleted;
15
+ exports.AccessTokenDeleted = AccessTokenDeleted = __decorate([
16
+ (0, queue_1.Event)()
17
+ ], AccessTokenDeleted);
18
+ //# sourceMappingURL=AccessTokenDeleted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenDeleted.js","sourceRoot":"","sources":["../../../src/events/AccessTokenDeleted.ts"],"names":[],"mappings":";;;;;;;;;AAAA,0CAAuC;AACvC,+DAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,sCAAgB;CAAG,CAAA;;6BAA9C,kBAAkB;IAD9B,IAAA,aAAK,GAAE;GACK,kBAAkB,CAA4B"}
@@ -0,0 +1,10 @@
1
+ import { QueueEvent } from '@spinajs/queue';
2
+ import { AccessToken } from '../models/AccessToken.js';
3
+ export declare class AccessTokenEvent extends QueueEvent {
4
+ /**
5
+ * Public token identifier. Never the token material.
6
+ */
7
+ TokenUuid: string;
8
+ constructor(token: AccessToken);
9
+ }
10
+ //# sourceMappingURL=AccessTokenEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenEvent.d.ts","sourceRoot":"","sources":["../../../src/events/AccessTokenEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAS,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,qBACa,gBAAiB,SAAQ,UAAU;IAC9C;;OAEG;IACI,SAAS,EAAE,MAAM,CAAC;IAEzB,YAAY,KAAK,EAAE,WAAW,EAG7B;CACF"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AccessTokenEvent = void 0;
13
+ const queue_1 = require("@spinajs/queue");
14
+ const AccessToken_js_1 = require("../models/AccessToken.js");
15
+ let AccessTokenEvent = class AccessTokenEvent extends queue_1.QueueEvent {
16
+ constructor(token) {
17
+ super();
18
+ this.TokenUuid = token.Uuid;
19
+ }
20
+ };
21
+ exports.AccessTokenEvent = AccessTokenEvent;
22
+ exports.AccessTokenEvent = AccessTokenEvent = __decorate([
23
+ (0, queue_1.Event)(),
24
+ __metadata("design:paramtypes", [AccessToken_js_1.AccessToken])
25
+ ], AccessTokenEvent);
26
+ //# sourceMappingURL=AccessTokenEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenEvent.js","sourceRoot":"","sources":["../../../src/events/AccessTokenEvent.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAAmD;AACnD,6DAAuD;AAGhD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,kBAAU;IAM9C,YAAY,KAAkB;QAC5B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF,CAAA;;2BAVY,gBAAgB;IAD5B,IAAA,aAAK,GAAE;qCAOa,4BAAW;GANnB,gBAAgB,CAU5B"}
@@ -0,0 +1,7 @@
1
+ import { AccessToken } from '../models/AccessToken.js';
2
+ import { AccessTokenEvent } from './AccessTokenEvent.js';
3
+ export declare class AccessTokenRoleGranted extends AccessTokenEvent {
4
+ Role: string;
5
+ constructor(token: AccessToken, Role: string);
6
+ }
7
+ //# sourceMappingURL=AccessTokenRoleGranted.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenRoleGranted.d.ts","sourceRoot":"","sources":["../../../src/events/AccessTokenRoleGranted.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBACa,sBAAuB,SAAQ,gBAAgB;IACnB,IAAI,EAAE,MAAM;IAAnD,YAAY,KAAK,EAAE,WAAW,EAAS,IAAI,EAAE,MAAM,EAElD;CACF"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AccessTokenRoleGranted = void 0;
13
+ const queue_1 = require("@spinajs/queue");
14
+ const AccessToken_js_1 = require("../models/AccessToken.js");
15
+ const AccessTokenEvent_js_1 = require("./AccessTokenEvent.js");
16
+ let AccessTokenRoleGranted = class AccessTokenRoleGranted extends AccessTokenEvent_js_1.AccessTokenEvent {
17
+ constructor(token, Role) {
18
+ super(token);
19
+ this.Role = Role;
20
+ }
21
+ };
22
+ exports.AccessTokenRoleGranted = AccessTokenRoleGranted;
23
+ exports.AccessTokenRoleGranted = AccessTokenRoleGranted = __decorate([
24
+ (0, queue_1.Event)(),
25
+ __metadata("design:paramtypes", [AccessToken_js_1.AccessToken, String])
26
+ ], AccessTokenRoleGranted);
27
+ //# sourceMappingURL=AccessTokenRoleGranted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenRoleGranted.js","sourceRoot":"","sources":["../../../src/events/AccessTokenRoleGranted.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAAuC;AACvC,6DAAuD;AACvD,+DAAyD;AAGlD,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,sCAAgB;IAC1D,YAAY,KAAkB,EAAS,IAAY;QACjD,KAAK,CAAC,KAAK,CAAC,CAAC;oBADwB,IAAI;IAE3C,CAAC;CACF,CAAA;;iCAJY,sBAAsB;IADlC,IAAA,aAAK,GAAE;qCAEa,4BAAW;GADnB,sBAAsB,CAIlC"}
@@ -0,0 +1,7 @@
1
+ import { AccessToken } from '../models/AccessToken.js';
2
+ import { AccessTokenEvent } from './AccessTokenEvent.js';
3
+ export declare class AccessTokenRoleRevoked extends AccessTokenEvent {
4
+ Role: string;
5
+ constructor(token: AccessToken, Role: string);
6
+ }
7
+ //# sourceMappingURL=AccessTokenRoleRevoked.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenRoleRevoked.d.ts","sourceRoot":"","sources":["../../../src/events/AccessTokenRoleRevoked.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBACa,sBAAuB,SAAQ,gBAAgB;IACnB,IAAI,EAAE,MAAM;IAAnD,YAAY,KAAK,EAAE,WAAW,EAAS,IAAI,EAAE,MAAM,EAElD;CACF"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AccessTokenRoleRevoked = void 0;
13
+ const queue_1 = require("@spinajs/queue");
14
+ const AccessToken_js_1 = require("../models/AccessToken.js");
15
+ const AccessTokenEvent_js_1 = require("./AccessTokenEvent.js");
16
+ let AccessTokenRoleRevoked = class AccessTokenRoleRevoked extends AccessTokenEvent_js_1.AccessTokenEvent {
17
+ constructor(token, Role) {
18
+ super(token);
19
+ this.Role = Role;
20
+ }
21
+ };
22
+ exports.AccessTokenRoleRevoked = AccessTokenRoleRevoked;
23
+ exports.AccessTokenRoleRevoked = AccessTokenRoleRevoked = __decorate([
24
+ (0, queue_1.Event)(),
25
+ __metadata("design:paramtypes", [AccessToken_js_1.AccessToken, String])
26
+ ], AccessTokenRoleRevoked);
27
+ //# sourceMappingURL=AccessTokenRoleRevoked.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessTokenRoleRevoked.js","sourceRoot":"","sources":["../../../src/events/AccessTokenRoleRevoked.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAAuC;AACvC,6DAAuD;AACvD,+DAAyD;AAGlD,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,sCAAgB;IAC1D,YAAY,KAAkB,EAAS,IAAY;QACjD,KAAK,CAAC,KAAK,CAAC,CAAC;oBADwB,IAAI;IAE3C,CAAC;CACF,CAAA;;iCAJY,sBAAsB;IADlC,IAAA,aAAK,GAAE;qCAEa,4BAAW;GADnB,sBAAsB,CAIlC"}
@@ -0,0 +1,6 @@
1
+ export * from './AccessTokenEvent.js';
2
+ export * from './AccessTokenCreated.js';
3
+ export * from './AccessTokenDeleted.js';
4
+ export * from './AccessTokenRoleGranted.js';
5
+ export * from './AccessTokenRoleRevoked.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/events/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AccessTokenEvent.js"), exports);
18
+ __exportStar(require("./AccessTokenCreated.js"), exports);
19
+ __exportStar(require("./AccessTokenDeleted.js"), exports);
20
+ __exportStar(require("./AccessTokenRoleGranted.js"), exports);
21
+ __exportStar(require("./AccessTokenRoleRevoked.js"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/events/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,0DAAwC;AACxC,0DAAwC;AACxC,8DAA4C;AAC5C,8DAA4C"}
@@ -0,0 +1,12 @@
1
+ import { AccessTokenGenerationProvider, IGeneratedToken } from './interfaces.js';
2
+ /**
3
+ * Default token algorithm: `<prefix>` + N crypto-random bytes base64url encoded.
4
+ * The stable prefix makes leaked tokens findable by secret scanners.
5
+ */
6
+ export declare class SecureRandomTokenProvider extends AccessTokenGenerationProvider {
7
+ protected Prefix: string;
8
+ protected Length: number;
9
+ generate(): Promise<IGeneratedToken>;
10
+ hash(plaintext: string): string;
11
+ }
12
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/generator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEjF;;;GAGG;AACH,qBACa,yBAA0B,SAAQ,6BAA6B;IAE1E,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAGzB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEZ,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAGhD;IAEM,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAErC;CACF"}