@atlasauth/emulator-core 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/dist/adopt.d.ts +50 -0
  2. package/dist/adopt.js +57 -0
  3. package/dist/adopt.js.map +1 -0
  4. package/dist/coverage.d.ts +15 -0
  5. package/dist/coverage.js +31 -0
  6. package/dist/coverage.js.map +1 -0
  7. package/dist/crypto-util.d.ts +10 -0
  8. package/dist/crypto-util.js +76 -0
  9. package/dist/crypto-util.js.map +1 -0
  10. package/dist/custom-html.d.ts +57 -0
  11. package/dist/custom-html.js +491 -0
  12. package/dist/custom-html.js.map +1 -0
  13. package/dist/engine.d.ts +34 -3
  14. package/dist/engine.js +57 -8
  15. package/dist/engine.js.map +1 -1
  16. package/dist/error-catalog.js +16 -0
  17. package/dist/error-catalog.js.map +1 -1
  18. package/dist/event-gate.d.ts +3 -0
  19. package/dist/event-gate.js +430 -0
  20. package/dist/event-gate.js.map +1 -0
  21. package/dist/generic.js +14 -2
  22. package/dist/generic.js.map +1 -1
  23. package/dist/handlers/access-signals.d.ts +48 -0
  24. package/dist/handlers/access-signals.js +76 -0
  25. package/dist/handlers/access-signals.js.map +1 -0
  26. package/dist/handlers/approvals.d.ts +2 -0
  27. package/dist/handlers/approvals.js +418 -0
  28. package/dist/handlers/approvals.js.map +1 -0
  29. package/dist/handlers/authz-data.d.ts +2 -0
  30. package/dist/handlers/authz-data.js +627 -0
  31. package/dist/handlers/authz-data.js.map +1 -0
  32. package/dist/handlers/authz-layers.d.ts +229 -0
  33. package/dist/handlers/authz-layers.js +786 -0
  34. package/dist/handlers/authz-layers.js.map +1 -0
  35. package/dist/handlers/authz-state.d.ts +80 -0
  36. package/dist/handlers/authz-state.js +175 -0
  37. package/dist/handlers/authz-state.js.map +1 -0
  38. package/dist/handlers/authz.d.ts +2 -0
  39. package/dist/handlers/authz.js +410 -0
  40. package/dist/handlers/authz.js.map +1 -0
  41. package/dist/handlers/billing.d.ts +100 -0
  42. package/dist/handlers/billing.js +877 -0
  43. package/dist/handlers/billing.js.map +1 -0
  44. package/dist/handlers/cedar-ext.d.ts +35 -0
  45. package/dist/handlers/cedar-ext.js +174 -0
  46. package/dist/handlers/cedar-ext.js.map +1 -0
  47. package/dist/handlers/cedar.d.ts +146 -0
  48. package/dist/handlers/cedar.js +689 -0
  49. package/dist/handlers/cedar.js.map +1 -0
  50. package/dist/handlers/connections.d.ts +5 -0
  51. package/dist/handlers/connections.js +561 -0
  52. package/dist/handlers/connections.js.map +1 -0
  53. package/dist/handlers/control.js +6 -1
  54. package/dist/handlers/control.js.map +1 -1
  55. package/dist/handlers/device.d.ts +47 -0
  56. package/dist/handlers/device.js +665 -0
  57. package/dist/handlers/device.js.map +1 -0
  58. package/dist/handlers/emu3-misc.d.ts +38 -0
  59. package/dist/handlers/emu3-misc.js +1056 -0
  60. package/dist/handlers/emu3-misc.js.map +1 -0
  61. package/dist/handlers/emu4-actions-access.d.ts +46 -0
  62. package/dist/handlers/emu4-actions-access.js +107 -0
  63. package/dist/handlers/emu4-actions-access.js.map +1 -0
  64. package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
  65. package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
  66. package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
  67. package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
  68. package/dist/handlers/emu4-actions-catalog.js +143 -0
  69. package/dist/handlers/emu4-actions-catalog.js.map +1 -0
  70. package/dist/handlers/emu4-actions-def.d.ts +50 -0
  71. package/dist/handlers/emu4-actions-def.js +250 -0
  72. package/dist/handlers/emu4-actions-def.js.map +1 -0
  73. package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
  74. package/dist/handlers/emu4-actions-sandbox.js +318 -0
  75. package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
  76. package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
  77. package/dist/handlers/emu4-actions-typegen.js +73 -0
  78. package/dist/handlers/emu4-actions-typegen.js.map +1 -0
  79. package/dist/handlers/emu4-actions.d.ts +2 -0
  80. package/dist/handlers/emu4-actions.js +506 -0
  81. package/dist/handlers/emu4-actions.js.map +1 -0
  82. package/dist/handlers/emu4-authz-trust.d.ts +40 -0
  83. package/dist/handlers/emu4-authz-trust.js +488 -0
  84. package/dist/handlers/emu4-authz-trust.js.map +1 -0
  85. package/dist/handlers/emu4-authz.d.ts +2 -0
  86. package/dist/handlers/emu4-authz.js +752 -0
  87. package/dist/handlers/emu4-authz.js.map +1 -0
  88. package/dist/handlers/emu4-billing-core.d.ts +23 -0
  89. package/dist/handlers/emu4-billing-core.js +22 -0
  90. package/dist/handlers/emu4-billing-core.js.map +1 -0
  91. package/dist/handlers/emu4-billing-x.d.ts +2 -0
  92. package/dist/handlers/emu4-billing-x.js +489 -0
  93. package/dist/handlers/emu4-billing-x.js.map +1 -0
  94. package/dist/handlers/emu4-billing.d.ts +14 -0
  95. package/dist/handlers/emu4-billing.js +846 -0
  96. package/dist/handlers/emu4-billing.js.map +1 -0
  97. package/dist/handlers/emu4-clones.d.ts +2 -0
  98. package/dist/handlers/emu4-clones.js +322 -0
  99. package/dist/handlers/emu4-clones.js.map +1 -0
  100. package/dist/handlers/emu4-compliance.d.ts +8 -0
  101. package/dist/handlers/emu4-compliance.js +39 -0
  102. package/dist/handlers/emu4-compliance.js.map +1 -0
  103. package/dist/handlers/emu4-config.d.ts +14 -0
  104. package/dist/handlers/emu4-config.js +148 -0
  105. package/dist/handlers/emu4-config.js.map +1 -0
  106. package/dist/handlers/emu4-cookies.d.ts +8 -0
  107. package/dist/handlers/emu4-cookies.js +248 -0
  108. package/dist/handlers/emu4-cookies.js.map +1 -0
  109. package/dist/handlers/emu4-erasure.d.ts +2 -0
  110. package/dist/handlers/emu4-erasure.js +587 -0
  111. package/dist/handlers/emu4-erasure.js.map +1 -0
  112. package/dist/handlers/emu4-federation.d.ts +8 -0
  113. package/dist/handlers/emu4-federation.js +18 -0
  114. package/dist/handlers/emu4-federation.js.map +1 -0
  115. package/dist/handlers/emu4-journey-math.d.ts +42 -0
  116. package/dist/handlers/emu4-journey-math.js +99 -0
  117. package/dist/handlers/emu4-journey-math.js.map +1 -0
  118. package/dist/handlers/emu4-messaging.d.ts +21 -0
  119. package/dist/handlers/emu4-messaging.js +595 -0
  120. package/dist/handlers/emu4-messaging.js.map +1 -0
  121. package/dist/handlers/emu4-minors.d.ts +7 -0
  122. package/dist/handlers/emu4-minors.js +408 -0
  123. package/dist/handlers/emu4-minors.js.map +1 -0
  124. package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
  125. package/dist/handlers/emu4-oauth-audit.js +17 -0
  126. package/dist/handlers/emu4-oauth-audit.js.map +1 -0
  127. package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
  128. package/dist/handlers/emu4-oauth-auth.js +363 -0
  129. package/dist/handlers/emu4-oauth-auth.js.map +1 -0
  130. package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
  131. package/dist/handlers/emu4-oauth-delivery.js +207 -0
  132. package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
  133. package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
  134. package/dist/handlers/emu4-oauth-keys.js +268 -0
  135. package/dist/handlers/emu4-oauth-keys.js.map +1 -0
  136. package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
  137. package/dist/handlers/emu4-oauth-pub.js +420 -0
  138. package/dist/handlers/emu4-oauth-pub.js.map +1 -0
  139. package/dist/handlers/emu4-oauth.d.ts +10 -0
  140. package/dist/handlers/emu4-oauth.js +23 -0
  141. package/dist/handlers/emu4-oauth.js.map +1 -0
  142. package/dist/handlers/emu4-policies.d.ts +2 -0
  143. package/dist/handlers/emu4-policies.js +408 -0
  144. package/dist/handlers/emu4-policies.js.map +1 -0
  145. package/dist/handlers/emu4-region.d.ts +2 -0
  146. package/dist/handlers/emu4-region.js +189 -0
  147. package/dist/handlers/emu4-region.js.map +1 -0
  148. package/dist/handlers/emu4-saml.d.ts +12 -0
  149. package/dist/handlers/emu4-saml.js +532 -0
  150. package/dist/handlers/emu4-saml.js.map +1 -0
  151. package/dist/handlers/emu4-shared.d.ts +44 -0
  152. package/dist/handlers/emu4-shared.js +90 -0
  153. package/dist/handlers/emu4-shared.js.map +1 -0
  154. package/dist/handlers/emu4-snapshots.d.ts +38 -0
  155. package/dist/handlers/emu4-snapshots.js +231 -0
  156. package/dist/handlers/emu4-snapshots.js.map +1 -0
  157. package/dist/handlers/emu4-sns.d.ts +9 -0
  158. package/dist/handlers/emu4-sns.js +21 -0
  159. package/dist/handlers/emu4-sns.js.map +1 -0
  160. package/dist/handlers/emu4-trust-binding.d.ts +27 -0
  161. package/dist/handlers/emu4-trust-binding.js +344 -0
  162. package/dist/handlers/emu4-trust-binding.js.map +1 -0
  163. package/dist/handlers/emu4-trust.d.ts +35 -0
  164. package/dist/handlers/emu4-trust.js +543 -0
  165. package/dist/handlers/emu4-trust.js.map +1 -0
  166. package/dist/handlers/federation.d.ts +2 -0
  167. package/dist/handlers/federation.js +481 -0
  168. package/dist/handlers/federation.js.map +1 -0
  169. package/dist/handlers/fga-engine.d.ts +78 -0
  170. package/dist/handlers/fga-engine.js +663 -0
  171. package/dist/handlers/fga-engine.js.map +1 -0
  172. package/dist/handlers/governance.d.ts +2 -0
  173. package/dist/handlers/governance.js +460 -0
  174. package/dist/handlers/governance.js.map +1 -0
  175. package/dist/handlers/hooks.js +17 -1
  176. package/dist/handlers/hooks.js.map +1 -1
  177. package/dist/handlers/index.d.ts +5 -1
  178. package/dist/handlers/index.js +45 -3
  179. package/dist/handlers/index.js.map +1 -1
  180. package/dist/handlers/keys.js +6 -1
  181. package/dist/handlers/keys.js.map +1 -1
  182. package/dist/handlers/machines.js +61 -8
  183. package/dist/handlers/machines.js.map +1 -1
  184. package/dist/handlers/messaging.d.ts +6 -0
  185. package/dist/handlers/messaging.js +893 -0
  186. package/dist/handlers/messaging.js.map +1 -0
  187. package/dist/handlers/oauth-adv.d.ts +191 -0
  188. package/dist/handlers/oauth-adv.js +1305 -0
  189. package/dist/handlers/oauth-adv.js.map +1 -0
  190. package/dist/handlers/oauth-flows.d.ts +52 -0
  191. package/dist/handlers/oauth-flows.js +480 -0
  192. package/dist/handlers/oauth-flows.js.map +1 -0
  193. package/dist/handlers/oauth.d.ts +96 -0
  194. package/dist/handlers/oauth.js +793 -0
  195. package/dist/handlers/oauth.js.map +1 -0
  196. package/dist/handlers/orgs.js +6 -0
  197. package/dist/handlers/orgs.js.map +1 -1
  198. package/dist/handlers/passkeys.d.ts +3 -0
  199. package/dist/handlers/passkeys.js +293 -0
  200. package/dist/handlers/passkeys.js.map +1 -0
  201. package/dist/handlers/platform.d.ts +20 -0
  202. package/dist/handlers/platform.js +472 -0
  203. package/dist/handlers/platform.js.map +1 -0
  204. package/dist/handlers/round2.d.ts +8 -0
  205. package/dist/handlers/round2.js +372 -0
  206. package/dist/handlers/round2.js.map +1 -0
  207. package/dist/handlers/scim.d.ts +4 -0
  208. package/dist/handlers/scim.js +595 -0
  209. package/dist/handlers/scim.js.map +1 -0
  210. package/dist/handlers/sessions.d.ts +9 -3
  211. package/dist/handlers/sessions.js +76 -38
  212. package/dist/handlers/sessions.js.map +1 -1
  213. package/dist/handlers/support.d.ts +20 -0
  214. package/dist/handlers/support.js +62 -0
  215. package/dist/handlers/support.js.map +1 -0
  216. package/dist/handlers/users.js +7 -0
  217. package/dist/handlers/users.js.map +1 -1
  218. package/dist/handlers/workflows.d.ts +2 -0
  219. package/dist/handlers/workflows.js +428 -0
  220. package/dist/handlers/workflows.js.map +1 -0
  221. package/dist/index.d.ts +8 -0
  222. package/dist/index.js +23 -1
  223. package/dist/index.js.map +1 -1
  224. package/dist/jwe.d.ts +18 -0
  225. package/dist/jwe.js +101 -0
  226. package/dist/jwe.js.map +1 -0
  227. package/dist/jws.d.ts +41 -0
  228. package/dist/jws.js +135 -0
  229. package/dist/jws.js.map +1 -0
  230. package/dist/messages.d.ts +7 -0
  231. package/dist/messages.js +8 -4
  232. package/dist/messages.js.map +1 -1
  233. package/dist/messaging-callbacks.d.ts +100 -0
  234. package/dist/messaging-callbacks.js +767 -0
  235. package/dist/messaging-callbacks.js.map +1 -0
  236. package/dist/openapi.js +41 -1
  237. package/dist/openapi.js.map +1 -1
  238. package/dist/parity-bin.js +3 -1
  239. package/dist/parity-bin.js.map +1 -1
  240. package/dist/parity-emu3-authz.d.ts +3 -0
  241. package/dist/parity-emu3-authz.js +61 -0
  242. package/dist/parity-emu3-authz.js.map +1 -0
  243. package/dist/parity-emu3-billing.d.ts +3 -0
  244. package/dist/parity-emu3-billing.js +25 -0
  245. package/dist/parity-emu3-billing.js.map +1 -0
  246. package/dist/parity-emu3-messaging.d.ts +3 -0
  247. package/dist/parity-emu3-messaging.js +27 -0
  248. package/dist/parity-emu3-messaging.js.map +1 -0
  249. package/dist/parity-emu3-misc.d.ts +2 -0
  250. package/dist/parity-emu3-misc.js +63 -0
  251. package/dist/parity-emu3-misc.js.map +1 -0
  252. package/dist/parity-emu3-oauth.d.ts +2 -0
  253. package/dist/parity-emu3-oauth.js +39 -0
  254. package/dist/parity-emu3-oauth.js.map +1 -0
  255. package/dist/parity-emu4-actions.d.ts +2 -0
  256. package/dist/parity-emu4-actions.js +38 -0
  257. package/dist/parity-emu4-actions.js.map +1 -0
  258. package/dist/parity-emu4-authz.d.ts +3 -0
  259. package/dist/parity-emu4-authz.js +68 -0
  260. package/dist/parity-emu4-authz.js.map +1 -0
  261. package/dist/parity-emu4-billing.d.ts +6 -0
  262. package/dist/parity-emu4-billing.js +44 -0
  263. package/dist/parity-emu4-billing.js.map +1 -0
  264. package/dist/parity-emu4-compliance.d.ts +2 -0
  265. package/dist/parity-emu4-compliance.js +92 -0
  266. package/dist/parity-emu4-compliance.js.map +1 -0
  267. package/dist/parity-emu4-federation.d.ts +2 -0
  268. package/dist/parity-emu4-federation.js +33 -0
  269. package/dist/parity-emu4-federation.js.map +1 -0
  270. package/dist/parity-emu4-messaging.d.ts +3 -0
  271. package/dist/parity-emu4-messaging.js +42 -0
  272. package/dist/parity-emu4-messaging.js.map +1 -0
  273. package/dist/parity-emu4-oauth.d.ts +2 -0
  274. package/dist/parity-emu4-oauth.js +55 -0
  275. package/dist/parity-emu4-oauth.js.map +1 -0
  276. package/dist/parity-emu4-trust.d.ts +2 -0
  277. package/dist/parity-emu4-trust.js +41 -0
  278. package/dist/parity-emu4-trust.js.map +1 -0
  279. package/dist/parity-routes.d.ts +14 -0
  280. package/dist/parity-routes.js +439 -0
  281. package/dist/parity-routes.js.map +1 -0
  282. package/dist/parity.d.ts +10 -3
  283. package/dist/parity.js +14 -5
  284. package/dist/parity.js.map +1 -1
  285. package/dist/sns-cert.d.ts +9 -0
  286. package/dist/sns-cert.js +101 -0
  287. package/dist/sns-cert.js.map +1 -0
  288. package/dist/tokens.d.ts +85 -3
  289. package/dist/tokens.js +196 -24
  290. package/dist/tokens.js.map +1 -1
  291. package/dist/webauthn-virtual.d.ts +70 -0
  292. package/dist/webauthn-virtual.js +186 -0
  293. package/dist/webauthn-virtual.js.map +1 -0
  294. package/dist/webhook-ext.d.ts +16 -0
  295. package/dist/webhook-ext.js +218 -0
  296. package/dist/webhook-ext.js.map +1 -0
  297. package/dist/webhooks.d.ts +3 -0
  298. package/dist/webhooks.js +37 -3
  299. package/dist/webhooks.js.map +1 -1
  300. package/package.json +2 -2
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authzHandlers = authzHandlers;
4
+ const errors_1 = require("../errors");
5
+ const access_signals_1 = require("./access-signals");
6
+ const cedar_1 = require("./cedar");
7
+ const authz_layers_1 = require("./authz-layers");
8
+ const authz_state_1 = require("./authz-state");
9
+ const support_1 = require("./support");
10
+ const util_1 = require("./util");
11
+ /**
12
+ * Authorization introspection on the engine's own state: `POST /v1/authz/explain` (why a user has or lacks a permission,
13
+ * asked of all seven layers: organization and app roles, groups, resource roles, ABAC, access policies and FGA tuples),
14
+ * `POST /v1/authz/rbac/check` (the role check, written to the decision log), `POST /v1/authz/what_if` (replay the logged
15
+ * role, ABAC and FGA decisions under a candidate change and see what flips), managed FGA sync (memberships, org roles and
16
+ * groups become tuples in one store, live on every change, with backfill, runs and purge) and the authorization event feed.
17
+ * The data the layers read is written by the routes in authz-data.
18
+ */
19
+ const MAX_WAIT_MS = 25_000;
20
+ const REPLAY_LIMIT_DEFAULT = 2000;
21
+ const REPLAY_LIMIT_MAX = 10_000;
22
+ const SAMPLE_CAP = 50;
23
+ const bad = (message, param) => new errors_1.EmulatorError('VALIDATION_FAILED', message, param);
24
+ const obj = (v, field) => {
25
+ if (v === undefined || v === null)
26
+ return {};
27
+ if (typeof v !== 'object' || Array.isArray(v))
28
+ throw bad(`${field} must be an object.`, field);
29
+ return v;
30
+ };
31
+ const strList = (v, field) => {
32
+ if (v === undefined)
33
+ return [];
34
+ if (!Array.isArray(v) || v.some((x) => typeof x !== 'string' || !x))
35
+ throw bad(`${field} must be a list of strings.`, field);
36
+ return v;
37
+ };
38
+ const tupleList = (v, field) => {
39
+ if (v === undefined)
40
+ return [];
41
+ if (!Array.isArray(v))
42
+ throw bad(`${field} must be a list of tuples.`, field);
43
+ return v.map((t, i) => {
44
+ const o = obj(t, `${field}[${i}]`);
45
+ if (typeof o.user !== 'string' || typeof o.relation !== 'string' || typeof (o.object ?? o.target) !== 'string')
46
+ throw bad(`${field}[${i}] requires user, relation and object.`, field);
47
+ if (!/^[^:#]+:[^#]+(#[^#]+)?$/.test(o.user))
48
+ throw bad(`${field}[${i}].user is malformed.`, field);
49
+ return { user: o.user, relation: o.relation, object: (o.object ?? o.target) };
50
+ });
51
+ };
52
+ const policySources = (v, field) => {
53
+ if (v === undefined)
54
+ return [];
55
+ if (!Array.isArray(v))
56
+ throw bad(`${field} must be a list.`, field);
57
+ return v.map((p, i) => {
58
+ const o = obj(p, `${field}[${i}]`);
59
+ if (typeof o.name !== 'string' || !o.name || typeof o.source !== 'string' || !o.source)
60
+ throw bad(`${field}[${i}] needs name and source.`, field);
61
+ try {
62
+ (0, cedar_1.parseCedar)(o.source);
63
+ }
64
+ catch (err) {
65
+ if (err instanceof cedar_1.CedarParseError)
66
+ throw bad(`${field}[${i}].source: ${err.message} (at character ${err.position})`, field);
67
+ throw err;
68
+ }
69
+ return { name: o.name, source: o.source };
70
+ });
71
+ };
72
+ const time = (v, field) => {
73
+ if (v === undefined || v === null)
74
+ return undefined;
75
+ const t = typeof v === 'number' ? v : typeof v === 'string' ? Date.parse(v) : NaN;
76
+ if (Number.isNaN(t))
77
+ throw bad(`${field} must be a millisecond timestamp or an ISO date.`, field);
78
+ return t;
79
+ };
80
+ function parseCandidate(cand) {
81
+ const out = {};
82
+ if (cand.abac !== undefined) {
83
+ const a = obj(cand.abac, 'candidate.abac');
84
+ out.abac = { add: policySources(a.add, 'candidate.abac.add'), replace: policySources(a.replace, 'candidate.abac.replace'), remove: strList(a.remove, 'candidate.abac.remove') };
85
+ }
86
+ if (cand.rbac !== undefined) {
87
+ const r = obj(cand.rbac, 'candidate.rbac');
88
+ if (!Array.isArray(r.roles) || r.roles.length === 0 || r.roles.length > 200)
89
+ throw bad('candidate.rbac.roles must list 1-200 role edits.', 'candidate.rbac.roles');
90
+ out.rbac = {
91
+ roles: r.roles.map((x, i) => {
92
+ const o = obj(x, `candidate.rbac.roles[${i}]`);
93
+ if (o.type !== 'org_role' && o.type !== 'app_role')
94
+ throw bad('type must be org_role or app_role.', `candidate.rbac.roles[${i}].type`);
95
+ if (typeof o.key !== 'string' || !o.key)
96
+ throw bad('key is required.', `candidate.rbac.roles[${i}].key`);
97
+ return { type: o.type, key: o.key, organizationId: typeof o.organization_id === 'string' ? o.organization_id : undefined, addPermissions: strList(o.add_permissions, 'add_permissions'), removePermissions: strList(o.remove_permissions, 'remove_permissions') };
98
+ }),
99
+ };
100
+ }
101
+ if (cand.fga !== undefined) {
102
+ const f = obj(cand.fga, 'candidate.fga');
103
+ if (typeof f.store_id !== 'string' || !f.store_id)
104
+ throw bad('candidate.fga.store_id is required.', 'candidate.fga.store_id');
105
+ out.fga = { storeId: f.store_id, writes: tupleList(f.writes, 'candidate.fga.writes'), deletes: tupleList(f.deletes, 'candidate.fga.deletes') };
106
+ }
107
+ if (cand.access_policy !== undefined)
108
+ out.accessPolicy = obj(obj(cand.access_policy, 'candidate.access_policy').draft ?? cand.access_policy, 'candidate.access_policy.draft');
109
+ if (!out.abac && !out.rbac && !out.fga && !out.accessPolicy)
110
+ throw bad('candidate needs at least one of abac, rbac, fga, access_policy.', 'candidate');
111
+ return out;
112
+ }
113
+ function runWhatIf(e, body) {
114
+ const c = parseCandidate(obj(body.candidate, 'candidate'));
115
+ const until = time(body.until, 'until') ?? e.clock.now();
116
+ let since = time(body.since, 'since');
117
+ if (since === undefined) {
118
+ const days = body.days === undefined ? 7 : body.days;
119
+ if (!Number.isInteger(days) || days < 1 || days > 30)
120
+ throw bad('days must be an integer from 1 to 30.', 'days');
121
+ since = until - days * 86_400_000;
122
+ }
123
+ if (since >= until)
124
+ throw bad('since must be before until.', 'since');
125
+ if (until - since > 31 * 86_400_000)
126
+ throw bad('The window can be at most 31 days.', 'since');
127
+ const limit = body.limit === undefined ? REPLAY_LIMIT_DEFAULT : body.limit;
128
+ if (!Number.isInteger(limit) || limit < 1 || limit > REPLAY_LIMIT_MAX)
129
+ throw bad(`limit must be an integer from 1 to ${REPLAY_LIMIT_MAX}.`, 'limit');
130
+ if (body.name !== undefined && (typeof body.name !== 'string' || body.name.length > 200))
131
+ throw bad('name must be a string of at most 200 characters.', 'name');
132
+ if (body.save !== undefined && typeof body.save !== 'boolean')
133
+ throw bad('save must be a boolean.', 'save');
134
+ if (c.fga && !(0, authz_state_1.storeExists)(e, c.fga.storeId))
135
+ throw bad('Unknown FGA store.', 'candidate.fga.store_id');
136
+ if (c.fga && !(0, authz_layers_1.latestModel)(e, c.fga.storeId))
137
+ throw bad('The FGA store has no authorization model.', 'candidate.fga.store_id');
138
+ const by = {};
139
+ const skippedBy = {};
140
+ const skip = (reason) => void (skippedBy[reason] = (skippedBy[reason] ?? 0) + 1);
141
+ const flips = [];
142
+ const principals = new Set();
143
+ let replayed = 0;
144
+ const note = (row, before, after, mismatch) => {
145
+ replayed++;
146
+ const s = (by[row.source] ??= { replayed: 0, unchanged: 0, allow_to_deny: 0, deny_to_allow: 0, baseline_mismatch: 0 });
147
+ s.replayed++;
148
+ if (mismatch)
149
+ s.baseline_mismatch++;
150
+ if (before === after)
151
+ return void s.unchanged++;
152
+ if (before === 'allow')
153
+ s.allow_to_deny++;
154
+ else
155
+ s.deny_to_allow++;
156
+ if (row.principal)
157
+ principals.add(row.principal);
158
+ if (flips.length < SAMPLE_CAP)
159
+ flips.push({ decision_id: row.id, source: row.source, principal: row.principal, action: row.action, resource: row.resource, before, after, at: row.at });
160
+ };
161
+ const pdp = c.abac ? (0, authz_layers_1.loadPdp)(e) : null;
162
+ const cpdp = c.abac && pdp ? (0, authz_layers_1.candidatePdp)(pdp, c.abac) : null;
163
+ const all = (0, authz_state_1.st)(e).decisions.all().filter((d) => d.at >= since && d.at <= until);
164
+ const rows = all.slice(0, limit);
165
+ for (const row of rows) {
166
+ try {
167
+ if (['abac', 'authzen', 'mcp_gateway', 'pdp'].includes(row.source) && pdp && cpdp) {
168
+ const req = row.input;
169
+ if (!req || typeof req !== 'object' || !req.principal || !req.resource) {
170
+ skip('no_input');
171
+ continue;
172
+ }
173
+ const now = (0, authz_layers_1.abacDecide)(pdp, req).decision;
174
+ note(row, now, (0, authz_layers_1.abacDecide)(cpdp, req).decision, now !== row.decision);
175
+ }
176
+ else if (row.source === 'rbac' && c.rbac) {
177
+ if (row.result?.kind !== 'role' || !row.action) {
178
+ skip('rbac_not_role_based');
179
+ continue;
180
+ }
181
+ note(row, row.decision, (0, authz_layers_1.replayRoleDecision)(row.result, c.rbac.roles, row.action) ? 'allow' : 'deny', false);
182
+ }
183
+ else if (row.source === 'fga' && c.fga) {
184
+ if (row.policyVersion?.store_id !== c.fga.storeId) {
185
+ skip('other_store');
186
+ continue;
187
+ }
188
+ const i = row.input ?? {};
189
+ if (!i.user || !i.relation || !i.object) {
190
+ skip('no_input');
191
+ continue;
192
+ }
193
+ const req = { user: i.user, relation: i.relation, object: i.object, contextual: i.contextual_tuples };
194
+ const now = (0, authz_layers_1.fgaCheck)(e, c.fga.storeId, req) ? 'allow' : 'deny';
195
+ note(row, now, (0, authz_layers_1.fgaCheck)(e, c.fga.storeId, req, { writes: c.fga.writes, deletes: c.fga.deletes }) ? 'allow' : 'deny', now !== row.decision);
196
+ }
197
+ else
198
+ skip(row.source === 'access_policy' ? 'access_policy_replayed_separately' : 'no_matching_candidate');
199
+ }
200
+ catch {
201
+ skip('replay_error');
202
+ }
203
+ }
204
+ // shortcut: the emulator keeps no sampled sign-ins, so an access-policy candidate has nothing to replay against.
205
+ if (c.accessPolicy)
206
+ skip('access_policy_no_sampled_sign_ins');
207
+ const totals = { unchanged: 0, allow_to_deny: 0, deny_to_allow: 0 };
208
+ for (const s of Object.values(by)) {
209
+ totals.unchanged += s.unchanged;
210
+ totals.allow_to_deny += s.allow_to_deny;
211
+ totals.deny_to_allow += s.deny_to_allow;
212
+ }
213
+ const result = { object: 'authz_what_if', name: body.name ?? null, window: { since, until }, evaluated: rows.length, replayed, truncated: all.length > rows.length, skipped: skippedBy, by_source: by, totals, affected_principals: principals.size, samples: flips };
214
+ if (body.save === false)
215
+ return { ...result, status: 200 };
216
+ const describe = {
217
+ ...(c.abac ? { abac: c.abac } : {}),
218
+ ...(c.rbac ? { rbac: { roles: c.rbac.roles.map((r) => ({ type: r.type, key: r.key, organization_id: r.organizationId ?? null, add_permissions: r.addPermissions, remove_permissions: r.removePermissions })) } } : {}),
219
+ ...(c.fga ? { fga: { store_id: c.fga.storeId, writes: c.fga.writes, deletes: c.fga.deletes } } : {}),
220
+ ...(c.accessPolicy ? { access_policy: { draft: c.accessPolicy } } : {}),
221
+ };
222
+ const saved = (0, authz_state_1.st)(e).whatIf.insert({ name: body.name ?? null, candidate: describe, window_start: since, window_end: until, summary: { evaluated: rows.length, replayed, truncated: result.truncated, totals, affected_principals: principals.size, by_source: by }, result, created_at: e.clock.now() });
223
+ return { ...result, id: saved.id, created_at: saved.created_at, status: 201 };
224
+ }
225
+ const whatIfView = (r, full) => ({ object: 'authz_what_if_run', id: r.id, name: r.name, candidate: r.candidate, window: { since: r.window_start, until: r.window_end }, summary: r.summary, ...(full ? { result: r.result } : {}), created_by: null, created_at: r.created_at });
226
+ /** One sync run: write what should exist; with `repair`, also delete managed tuples that no longer should. Only managed tuples are ever touched. */
227
+ function runSync(e, kind, repair) {
228
+ const s = (0, authz_state_1.st)(e);
229
+ const now = e.clock.now();
230
+ const { written, deleted } = (0, authz_state_1.reconcileManaged)(e, repair);
231
+ const run = s.runs.insert({ kind, status: 'completed', store_id: s.config.store_id, repair, written, deleted, managed: s.managed.size, error: null, created_at: now, completed_at: now });
232
+ (0, authz_state_1.pushEvent)(e, 'sync_run', s.config.store_id, 'sync', { run_id: run.id, written, deleted });
233
+ e.webhooks.emit('fga_sync.completed', { object: 'fga_sync_run', id: run.id, store_id: s.config.store_id, written, deleted });
234
+ return run;
235
+ }
236
+ const runView = (r) => ({ object: 'fga_sync_run', id: r.id, kind: r.kind, status: r.status, store_id: r.store_id, repair: r.repair, tuples_written: r.written, tuples_deleted: r.deleted, managed_tuples: r.managed, error: r.error, created_at: r.created_at, completed_at: r.completed_at });
237
+ const statusView = (e) => {
238
+ const s = (0, authz_state_1.st)(e);
239
+ const last = s.runs.all()[0];
240
+ return { object: 'fga_sync', enabled: s.config.enabled, store_id: s.config.store_id, memberships: s.config.memberships, org_roles: s.config.org_roles, groups: s.config.groups, managed_tuples: s.managed.size, last_run: last ? runView(last) : null, updated_at: s.config.updated_at };
241
+ };
242
+ function authzHandlers() {
243
+ return [
244
+ {
245
+ method: 'POST',
246
+ pattern: '/v1/authz/explain',
247
+ scope: 'authz_decisions:read',
248
+ handler: (c) => {
249
+ const input = (0, authz_layers_1.parseExplainBody)(c.body);
250
+ // Signals a caller proxies in headers (country, risk level, device trust) apply when the body does not say.
251
+ input.access = { ...input.access, signals: (0, access_signals_1.firstOf)(input.access?.signals, (0, access_signals_1.headerSignals)(c.request.headers)) };
252
+ return { body: (0, authz_layers_1.explainAccess)(c.engine, input) };
253
+ },
254
+ },
255
+ {
256
+ // The same role check, written to the decision log (the corpus what-if replays).
257
+ method: 'POST',
258
+ pattern: '/v1/authz/rbac/check',
259
+ scope: 'authz_decisions:read',
260
+ handler: (c) => {
261
+ const e = c.engine;
262
+ const subject = (c.body.subject ?? {});
263
+ if (typeof subject.id !== 'string' || !subject.id)
264
+ throw bad('subject.id is required.', 'subject.id');
265
+ if (typeof c.body.permission !== 'string' || !c.body.permission)
266
+ throw bad('permission is required.', 'permission');
267
+ if (c.body.organization_id !== undefined && typeof c.body.organization_id !== 'string')
268
+ throw bad('organization_id must be a string.', 'organization_id');
269
+ const input = { userId: subject.id, permission: c.body.permission, organizationId: c.body.organization_id };
270
+ const r = (0, authz_layers_1.rbacCheck)(e, input);
271
+ (0, authz_layers_1.recordRbacCheck)(e, input, r);
272
+ const rules = [...r.layers.rbac.contributions, ...r.layers.org_roles.contributions, ...r.layers.groups.contributions].filter((x) => x.matched);
273
+ return { body: { object: 'rbac_check', allowed: r.allowed, decision: r.allowed ? 'allow' : 'deny', grants: r.grants, rules } };
274
+ },
275
+ },
276
+ {
277
+ method: 'POST',
278
+ pattern: '/v1/authz/what_if',
279
+ scope: 'authz_decisions:read',
280
+ handler: (c) => {
281
+ const { status, ...body } = runWhatIf(c.engine, c.body);
282
+ return { status, body };
283
+ },
284
+ },
285
+ { method: 'GET', pattern: '/v1/authz/what_if', scope: 'authz_decisions:read', handler: (c) => (0, util_1.listReply)(c, (0, authz_state_1.st)(c.engine).whatIf.all(), (r) => whatIfView(r, false)) },
286
+ {
287
+ method: 'GET',
288
+ pattern: '/v1/authz/what_if/:id',
289
+ scope: 'authz_decisions:read',
290
+ handler: (c) => {
291
+ const r = (0, authz_state_1.st)(c.engine).whatIf.get(c.params.id);
292
+ if (!r)
293
+ throw (0, errors_1.notFound)('What-if run');
294
+ return { body: whatIfView(r, true) };
295
+ },
296
+ },
297
+ {
298
+ method: 'DELETE',
299
+ pattern: '/v1/authz/what_if/:id',
300
+ scope: 'authz_decisions:write',
301
+ handler: (c) => {
302
+ if (!(0, authz_state_1.st)(c.engine).whatIf.delete(c.params.id ?? ''))
303
+ throw (0, errors_1.notFound)('What-if run');
304
+ return { body: { object: 'authz_what_if_run', id: c.params.id, deleted: true } };
305
+ },
306
+ },
307
+ // ── managed FGA sync ──
308
+ { method: 'GET', pattern: '/v1/fga/sync', scope: 'fga:read', handler: (c) => ({ body: statusView(c.engine) }) },
309
+ {
310
+ method: 'PUT',
311
+ pattern: '/v1/fga/sync',
312
+ scope: 'fga:write',
313
+ handler: (c) => {
314
+ const e = c.engine;
315
+ const s = (0, authz_state_1.st)(e);
316
+ const b = c.body;
317
+ for (const k of ['enabled', 'memberships', 'org_roles', 'groups'])
318
+ if (b[k] !== undefined && typeof b[k] !== 'boolean')
319
+ throw bad(`${k} must be true or false.`, k);
320
+ const storeId = b.store_id === undefined ? s.config.store_id : b.store_id;
321
+ if (storeId !== null && (typeof storeId !== 'string' || !(0, authz_state_1.storeExists)(e, storeId)))
322
+ throw bad('store_id must be an existing FGA store.', 'store_id');
323
+ // Owned tuples live in one store: it cannot change under them.
324
+ if (storeId !== s.config.store_id && s.managed.size)
325
+ throw new errors_1.EmulatorError('CONFLICT', 'The sync owns tuples in the current store. Purge them before changing the store.', 'store_id');
326
+ const enabled = b.enabled ?? s.config.enabled;
327
+ if (enabled && !storeId)
328
+ throw bad('Enabling sync needs a store_id.', 'store_id');
329
+ const turningOn = enabled && !s.config.enabled;
330
+ Object.assign(s.config, { enabled, store_id: storeId, memberships: b.memberships ?? s.config.memberships, org_roles: b.org_roles ?? s.config.org_roles, groups: b.groups ?? s.config.groups, updated_at: e.clock.now() });
331
+ if (turningOn)
332
+ runSync(e, 'initial', false);
333
+ return { body: statusView(e) };
334
+ },
335
+ },
336
+ {
337
+ method: 'POST',
338
+ pattern: '/v1/fga/sync/backfill',
339
+ scope: 'fga:write',
340
+ handler: (c) => {
341
+ const e = c.engine;
342
+ if (c.body.repair !== undefined && typeof c.body.repair !== 'boolean')
343
+ throw bad('repair must be a boolean.', 'repair');
344
+ if (!(0, authz_state_1.st)(e).config.enabled || !(0, authz_state_1.st)(e).config.store_id)
345
+ throw bad('Enable sync with a store before running a backfill.', 'enabled');
346
+ return { status: 202, body: runView(runSync(e, 'backfill', c.body.repair === true)) };
347
+ },
348
+ },
349
+ { method: 'GET', pattern: '/v1/fga/sync/runs', scope: 'fga:read', handler: (c) => (0, util_1.listReply)(c, (0, authz_state_1.st)(c.engine).runs.all(), runView) },
350
+ {
351
+ method: 'GET',
352
+ pattern: '/v1/fga/sync/runs/:id',
353
+ scope: 'fga:read',
354
+ handler: (c) => {
355
+ const r = (0, authz_state_1.st)(c.engine).runs.get(c.params.id);
356
+ if (!r)
357
+ throw (0, errors_1.notFound)('Sync run');
358
+ return { body: runView(r) };
359
+ },
360
+ },
361
+ {
362
+ // Remove only the tuples the sync wrote, and forget them. Sync must be off.
363
+ method: 'POST',
364
+ pattern: '/v1/fga/sync/purge',
365
+ scope: 'fga:write',
366
+ handler: (c) => {
367
+ const e = c.engine;
368
+ const s = (0, authz_state_1.st)(e);
369
+ if (c.body.confirm !== true)
370
+ throw bad('Send confirm: true to remove the tuples the sync wrote.', 'confirm');
371
+ if (!s.config.store_id)
372
+ throw (0, errors_1.notFound)('Sync store');
373
+ if (s.config.enabled)
374
+ throw new errors_1.EmulatorError('CONFLICT', 'Disable sync before purging.');
375
+ const n = s.managed.size;
376
+ const owned = [...s.managed.values()];
377
+ s.managed.clear();
378
+ if (owned.length)
379
+ (0, authz_state_1.applyTuples)(e, s.config.store_id, [], owned, 'sync');
380
+ return { body: { object: 'fga.sync_purge', store_id: s.config.store_id, deleted: n, released: 0 } };
381
+ },
382
+ },
383
+ // ── the authorization event feed ──
384
+ {
385
+ method: 'GET',
386
+ pattern: '/v1/authz/events',
387
+ scope: 'fga:read',
388
+ handler: async (c) => {
389
+ const e = c.engine;
390
+ const s = (0, authz_state_1.st)(e);
391
+ const rawAfter = c.query.get('after');
392
+ const after = rawAfter === 'latest' ? s.seq : rawAfter === null ? 0 : Number(rawAfter);
393
+ if (!Number.isInteger(after) || after < 0)
394
+ throw bad('after must be a sequence number or "latest".', 'after');
395
+ const limit = (0, support_1.intIn)(c.query.get('limit') ?? undefined, 'limit', 1, 500, 100);
396
+ const waitMs = (0, support_1.intIn)(c.query.get('wait_ms') ?? undefined, 'wait_ms', 0, MAX_WAIT_MS, 0);
397
+ const kinds = c.query.get('kinds')?.split(',').filter(Boolean);
398
+ const store = c.query.get('store_id');
399
+ const pick = () => s.events.filter((x) => x.seq > after && (!kinds || kinds.includes(x.kind)) && (!store || x.store_id === store));
400
+ const deadline = Date.now() + waitMs;
401
+ while (!pick().length && Date.now() < deadline)
402
+ await new Promise((r) => setTimeout(r, 25));
403
+ const all = pick();
404
+ const page = all.slice(0, limit);
405
+ return { body: { object: 'list', data: page, has_more: all.length > limit, next_after: page.length ? page[page.length - 1].seq : after } };
406
+ },
407
+ },
408
+ ];
409
+ }
410
+ //# sourceMappingURL=authz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz.js","sourceRoot":"","sources":["../../src/handlers/authz.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import type { Engine, RouteDef } from '../engine';
2
+ import { EmulatorError } from '../errors';
3
+ import type { Obj } from '../openapi';
4
+ import { Table } from '../store';
5
+ interface Balance {
6
+ granted: number | null;
7
+ usage: number;
8
+ unlimited: boolean;
9
+ }
10
+ interface Bill {
11
+ subs: Table;
12
+ invoices: Table;
13
+ refunds: Table;
14
+ usage: Table;
15
+ extensions: Map<string, Obj>;
16
+ consumes: Map<string, Obj>;
17
+ balances: Map<string, Balance>;
18
+ catalogue: Map<string, {
19
+ features: string[];
20
+ limits: Obj;
21
+ }>;
22
+ /** What the provider owes the customer (credit left over from a downgrade), minor units per `type|id`; applied to the next invoice. */
23
+ customerBalance: Map<string, number>;
24
+ }
25
+ /** A body key outside `allowed` is refused (the real routes are strict). */
26
+ declare function known(body: Obj, allowed: string[]): void;
27
+ declare function subject(e: Engine, body: Obj): {
28
+ type: string;
29
+ id: string;
30
+ };
31
+ declare function emitSub(e: Engine, type: string, s: Obj, prev: Obj | null, reason?: string, extra?: Obj): void;
32
+ interface EntSnap {
33
+ planId: string;
34
+ plan: string | null;
35
+ status: string;
36
+ features: string[];
37
+ limits: Obj;
38
+ }
39
+ /** What a subject is entitled to now: its live (active or trialing) subscriptions merged; undefined when none. */
40
+ declare function entSnap(e: Engine, type: string, id: string): EntSnap | undefined;
41
+ /** entitlement.created / updated / deleted, only when the resolved entitlement moved. */
42
+ declare function emitEnt(e: Engine, type: string, id: string, before: EntSnap | undefined): void;
43
+ /** shortcut: a plan's `amount` is display text ("$9.00"); its digits read as major units, 0 when absent. */
44
+ declare function priceCents(plan: Obj | undefined, interval: string): number;
45
+ /** One invoice line: a renewal charge, or a proration (a credit for unused time is negative). */
46
+ interface Line {
47
+ description: string;
48
+ amount: number;
49
+ quantity: number;
50
+ proration: boolean;
51
+ plan_id: string | null;
52
+ period_start: number;
53
+ period_end: number;
54
+ }
55
+ /** The invoice the subscription's next billing would produce: renewal at the plan's price plus the proration items waiting, less customer balance. */
56
+ declare function draft(e: Engine, s: Obj, at: number): {
57
+ lines: Line[];
58
+ total: number;
59
+ applied: number;
60
+ due: number;
61
+ currency: string;
62
+ };
63
+ /**
64
+ * The period lifecycle, applied lazily on every billing read and write so advancing the clock does the work: a trial that
65
+ * has ended becomes active (past_due when the subscription's payment is set to fail), and each passed period end either
66
+ * ends a subscription set to cancel, applies a scheduled plan change, or renews for another period; each billable event
67
+ * gets an invoice.
68
+ */
69
+ declare function settle(e: Engine): void;
70
+ export declare function billingHandlers(): RouteDef[];
71
+ /** The state and helpers the provider-webhook, store-link, Connect and referral-reward routes (emu4-billing.ts) share with this module. */
72
+ export declare const billingInternals: {
73
+ st: (e: Engine) => Bill;
74
+ planOf: (e: Engine, id: string | undefined | null) => Obj | undefined;
75
+ subView: (e: Engine, s: Obj) => Obj;
76
+ emitSub: typeof emitSub;
77
+ emitEnt: typeof emitEnt;
78
+ entSnap: typeof entSnap;
79
+ settle: typeof settle;
80
+ liveSub: (e: Engine, type: string, id: string) => Obj | undefined;
81
+ invoiceView: (e: Engine, i: Obj) => Obj;
82
+ draft: typeof draft;
83
+ lineView: (currency: string, l: Line) => Obj;
84
+ balKey2: (s: Obj) => string;
85
+ day: (t: number) => string;
86
+ DAY: number;
87
+ MONTH: number;
88
+ periodLen: (interval: string | undefined) => number;
89
+ priceCents: typeof priceCents;
90
+ bad: (message: string, param: string) => EmulatorError;
91
+ conflict: (m: string, meta?: Obj) => EmulatorError;
92
+ unsupported: (m: string) => EmulatorError & {
93
+ status: number;
94
+ };
95
+ known: typeof known;
96
+ subject: typeof subject;
97
+ PROVIDERS: readonly ["stripe", "polar", "dodo", "creem", "chargebee", "autumn", "commet", "paddle", "lemonsqueezy", "revenuecat", "appstore", "googleplay"];
98
+ STORE_OWNED: Set<string>;
99
+ };
100
+ export type { Line as InvoiceLine };