@zudojs/permissions 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +41 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/ability/ability.core.d.ts +29 -0
  4. package/dist/ability/ability.core.d.ts.map +1 -0
  5. package/dist/ability/ability.core.js +38 -0
  6. package/dist/ability/ability.core.js.map +1 -0
  7. package/dist/ability/index.d.ts +7 -0
  8. package/dist/ability/index.d.ts.map +1 -0
  9. package/dist/ability/index.js +7 -0
  10. package/dist/ability/index.js.map +1 -0
  11. package/dist/actor/actor.core.d.ts +28 -0
  12. package/dist/actor/actor.core.d.ts.map +1 -0
  13. package/dist/actor/actor.core.js +40 -0
  14. package/dist/actor/actor.core.js.map +1 -0
  15. package/dist/actor/index.d.ts +7 -0
  16. package/dist/actor/index.d.ts.map +1 -0
  17. package/dist/actor/index.js +7 -0
  18. package/dist/actor/index.js.map +1 -0
  19. package/dist/cache/cache.core.d.ts +17 -0
  20. package/dist/cache/cache.core.d.ts.map +1 -0
  21. package/dist/cache/cache.core.js +51 -0
  22. package/dist/cache/cache.core.js.map +1 -0
  23. package/dist/cache/index.d.ts +7 -0
  24. package/dist/cache/index.d.ts.map +1 -0
  25. package/dist/cache/index.js +7 -0
  26. package/dist/cache/index.js.map +1 -0
  27. package/dist/conditions/conditions.core.d.ts +40 -0
  28. package/dist/conditions/conditions.core.d.ts.map +1 -0
  29. package/dist/conditions/conditions.core.js +78 -0
  30. package/dist/conditions/conditions.core.js.map +1 -0
  31. package/dist/conditions/index.d.ts +7 -0
  32. package/dist/conditions/index.d.ts.map +1 -0
  33. package/dist/conditions/index.js +7 -0
  34. package/dist/conditions/index.js.map +1 -0
  35. package/dist/evaluator/authorizationEngine.d.ts +47 -0
  36. package/dist/evaluator/authorizationEngine.d.ts.map +1 -0
  37. package/dist/evaluator/authorizationEngine.js +49 -0
  38. package/dist/evaluator/authorizationEngine.js.map +1 -0
  39. package/dist/evaluator/evaluator.core.d.ts +11 -0
  40. package/dist/evaluator/evaluator.core.d.ts.map +1 -0
  41. package/dist/evaluator/evaluator.core.js +57 -0
  42. package/dist/evaluator/evaluator.core.js.map +1 -0
  43. package/dist/evaluator/evaluator.explain.d.ts +12 -0
  44. package/dist/evaluator/evaluator.explain.d.ts.map +1 -0
  45. package/dist/evaluator/evaluator.explain.js +79 -0
  46. package/dist/evaluator/evaluator.explain.js.map +1 -0
  47. package/dist/evaluator/evaluator.pipeline.d.ts +28 -0
  48. package/dist/evaluator/evaluator.pipeline.d.ts.map +1 -0
  49. package/dist/evaluator/evaluator.pipeline.js +83 -0
  50. package/dist/evaluator/evaluator.pipeline.js.map +1 -0
  51. package/dist/evaluator/index.d.ts +8 -0
  52. package/dist/evaluator/index.d.ts.map +1 -0
  53. package/dist/evaluator/index.js +7 -0
  54. package/dist/evaluator/index.js.map +1 -0
  55. package/dist/http/httpHelpers.d.ts +28 -0
  56. package/dist/http/httpHelpers.d.ts.map +1 -0
  57. package/dist/http/httpHelpers.js +29 -0
  58. package/dist/http/httpHelpers.js.map +1 -0
  59. package/dist/http/httpMiddleware.core.d.ts +48 -0
  60. package/dist/http/httpMiddleware.core.d.ts.map +1 -0
  61. package/dist/http/httpMiddleware.core.js +81 -0
  62. package/dist/http/httpMiddleware.core.js.map +1 -0
  63. package/dist/http/httpTypes.d.ts +40 -0
  64. package/dist/http/httpTypes.d.ts.map +1 -0
  65. package/dist/http/httpTypes.js +10 -0
  66. package/dist/http/httpTypes.js.map +1 -0
  67. package/dist/http/index.d.ts +11 -0
  68. package/dist/http/index.d.ts.map +1 -0
  69. package/dist/http/index.js +10 -0
  70. package/dist/http/index.js.map +1 -0
  71. package/dist/index.d.ts +27 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +27 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/observability/index.d.ts +7 -0
  76. package/dist/observability/index.d.ts.map +1 -0
  77. package/dist/observability/index.js +7 -0
  78. package/dist/observability/index.js.map +1 -0
  79. package/dist/observability/observability.core.d.ts +41 -0
  80. package/dist/observability/observability.core.d.ts.map +1 -0
  81. package/dist/observability/observability.core.js +54 -0
  82. package/dist/observability/observability.core.js.map +1 -0
  83. package/dist/permission/index.d.ts +8 -0
  84. package/dist/permission/index.d.ts.map +1 -0
  85. package/dist/permission/index.js +8 -0
  86. package/dist/permission/index.js.map +1 -0
  87. package/dist/permission/permission.core.d.ts +30 -0
  88. package/dist/permission/permission.core.d.ts.map +1 -0
  89. package/dist/permission/permission.core.js +72 -0
  90. package/dist/permission/permission.core.js.map +1 -0
  91. package/dist/permission/permissionRegistry.d.ts +63 -0
  92. package/dist/permission/permissionRegistry.d.ts.map +1 -0
  93. package/dist/permission/permissionRegistry.js +88 -0
  94. package/dist/permission/permissionRegistry.js.map +1 -0
  95. package/dist/permissionErrors/index.d.ts +8 -0
  96. package/dist/permissionErrors/index.d.ts.map +1 -0
  97. package/dist/permissionErrors/index.js +8 -0
  98. package/dist/permissionErrors/index.js.map +1 -0
  99. package/dist/permissionErrors/permissionError.access.d.ts +39 -0
  100. package/dist/permissionErrors/permissionError.access.d.ts.map +1 -0
  101. package/dist/permissionErrors/permissionError.access.js +65 -0
  102. package/dist/permissionErrors/permissionError.access.js.map +1 -0
  103. package/dist/permissionErrors/permissionError.base.d.ts +19 -0
  104. package/dist/permissionErrors/permissionError.base.d.ts.map +1 -0
  105. package/dist/permissionErrors/permissionError.base.js +21 -0
  106. package/dist/permissionErrors/permissionError.base.js.map +1 -0
  107. package/dist/permissionErrors/permissionError.types.d.ts +6 -0
  108. package/dist/permissionErrors/permissionError.types.d.ts.map +1 -0
  109. package/dist/permissionErrors/permissionError.types.js +6 -0
  110. package/dist/permissionErrors/permissionError.types.js.map +1 -0
  111. package/dist/permissionErrors/permissionError.validation.d.ts +47 -0
  112. package/dist/permissionErrors/permissionError.validation.d.ts.map +1 -0
  113. package/dist/permissionErrors/permissionError.validation.js +78 -0
  114. package/dist/permissionErrors/permissionError.validation.js.map +1 -0
  115. package/dist/permissionTypes/index.d.ts +9 -0
  116. package/dist/permissionTypes/index.d.ts.map +1 -0
  117. package/dist/permissionTypes/index.js +9 -0
  118. package/dist/permissionTypes/index.js.map +1 -0
  119. package/dist/permissionTypes/permissionActor.d.ts +28 -0
  120. package/dist/permissionTypes/permissionActor.d.ts.map +1 -0
  121. package/dist/permissionTypes/permissionActor.js +7 -0
  122. package/dist/permissionTypes/permissionActor.js.map +1 -0
  123. package/dist/permissionTypes/policyTypes.d.ts +62 -0
  124. package/dist/permissionTypes/policyTypes.d.ts.map +1 -0
  125. package/dist/permissionTypes/policyTypes.js +7 -0
  126. package/dist/permissionTypes/policyTypes.js.map +1 -0
  127. package/dist/permissionTypes/ruleTypes.d.ts +50 -0
  128. package/dist/permissionTypes/ruleTypes.d.ts.map +1 -0
  129. package/dist/permissionTypes/ruleTypes.js +7 -0
  130. package/dist/permissionTypes/ruleTypes.js.map +1 -0
  131. package/dist/policy/index.d.ts +7 -0
  132. package/dist/policy/index.d.ts.map +1 -0
  133. package/dist/policy/index.js +7 -0
  134. package/dist/policy/index.js.map +1 -0
  135. package/dist/policy/policyRegistry.d.ts +36 -0
  136. package/dist/policy/policyRegistry.d.ts.map +1 -0
  137. package/dist/policy/policyRegistry.js +57 -0
  138. package/dist/policy/policyRegistry.js.map +1 -0
  139. package/dist/resolvers/index.d.ts +7 -0
  140. package/dist/resolvers/index.d.ts.map +1 -0
  141. package/dist/resolvers/index.js +7 -0
  142. package/dist/resolvers/index.js.map +1 -0
  143. package/dist/resolvers/resolvers.core.d.ts +23 -0
  144. package/dist/resolvers/resolvers.core.d.ts.map +1 -0
  145. package/dist/resolvers/resolvers.core.js +46 -0
  146. package/dist/resolvers/resolvers.core.js.map +1 -0
  147. package/dist/role/index.d.ts +8 -0
  148. package/dist/role/index.d.ts.map +1 -0
  149. package/dist/role/index.js +8 -0
  150. package/dist/role/index.js.map +1 -0
  151. package/dist/role/roleHierarchy.d.ts +15 -0
  152. package/dist/role/roleHierarchy.d.ts.map +1 -0
  153. package/dist/role/roleHierarchy.js +48 -0
  154. package/dist/role/roleHierarchy.js.map +1 -0
  155. package/dist/role/roleRegistry.d.ts +45 -0
  156. package/dist/role/roleRegistry.d.ts.map +1 -0
  157. package/dist/role/roleRegistry.js +67 -0
  158. package/dist/role/roleRegistry.js.map +1 -0
  159. package/dist/rule/index.d.ts +8 -0
  160. package/dist/rule/index.d.ts.map +1 -0
  161. package/dist/rule/index.js +8 -0
  162. package/dist/rule/index.js.map +1 -0
  163. package/dist/rule/rule.core.d.ts +24 -0
  164. package/dist/rule/rule.core.d.ts.map +1 -0
  165. package/dist/rule/rule.core.js +79 -0
  166. package/dist/rule/rule.core.js.map +1 -0
  167. package/dist/rule/ruleCompiler.d.ts +27 -0
  168. package/dist/rule/ruleCompiler.d.ts.map +1 -0
  169. package/dist/rule/ruleCompiler.js +76 -0
  170. package/dist/rule/ruleCompiler.js.map +1 -0
  171. package/dist/utils/index.d.ts +7 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +7 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/utils.helper.d.ts +37 -0
  176. package/dist/utils/utils.helper.d.ts.map +1 -0
  177. package/dist/utils/utils.helper.js +50 -0
  178. package/dist/utils/utils.helper.js.map +1 -0
  179. package/package.json +61 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Permission resolution and policy evaluation pipeline.
3
+ *
4
+ * @module evaluator/evaluator.pipeline
5
+ */
6
+ import type { PermissionActor, PermissionContext, PermissionDecision, PermissionPolicyDefinition, AuthorizationOptions } from "../permissionTypes/index.js";
7
+ /** Configuration for the evaluator. */
8
+ export interface EvaluatorOptions {
9
+ /** Function to look up a role definition by name. */
10
+ readonly getRole?: (name: string) => {
11
+ readonly name: string;
12
+ readonly permissions: readonly string[];
13
+ readonly inherits?: readonly string[];
14
+ } | undefined;
15
+ /** Registered policies. */
16
+ readonly policies?: readonly PermissionPolicyDefinition[];
17
+ /** Default timeout for async policy evaluation (ms). */
18
+ readonly policyTimeout?: number;
19
+ }
20
+ /**
21
+ * Resolve all permissions for an actor (direct + role-based).
22
+ */
23
+ export declare function resolveActorPermissions(actor: PermissionActor, options: EvaluatorOptions): readonly string[];
24
+ /**
25
+ * Evaluate policies for a context. Returns null if no policy matched.
26
+ */
27
+ export declare function evaluatePolicies(context: PermissionContext, policies: readonly PermissionPolicyDefinition[], authOptions?: AuthorizationOptions): Promise<PermissionDecision | null>;
28
+ //# sourceMappingURL=evaluator.pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.pipeline.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluator.pipeline.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AAIrC,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAC5B;QACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;QACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACvC,GACD,SAAS,CAAC;IACd,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC1D,wDAAwD;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,gBAAgB,GACxB,SAAS,MAAM,EAAE,CAenB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,SAAS,0BAA0B,EAAE,EAC/C,WAAW,CAAC,EAAE,oBAAoB,GACjC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAuCpC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Permission resolution and policy evaluation pipeline.
3
+ *
4
+ * @module evaluator/evaluator.pipeline
5
+ */
6
+ import { resolveRolePermissions } from "../role/roleHierarchy.js";
7
+ import { AuthorizationAbortedError } from "../permissionErrors/index.js";
8
+ /**
9
+ * Resolve all permissions for an actor (direct + role-based).
10
+ */
11
+ export function resolveActorPermissions(actor, options) {
12
+ const permissions = new Set();
13
+ // Direct permissions
14
+ if (actor.permissions) {
15
+ for (const p of actor.permissions)
16
+ permissions.add(p);
17
+ }
18
+ // Role-based permissions
19
+ if (actor.roles && options.getRole) {
20
+ const rolePerms = resolveRolePermissions(actor.roles, options.getRole);
21
+ for (const p of rolePerms)
22
+ permissions.add(p);
23
+ }
24
+ return Array.from(permissions);
25
+ }
26
+ /**
27
+ * Evaluate policies for a context. Returns null if no policy matched.
28
+ */
29
+ export async function evaluatePolicies(context, policies, authOptions) {
30
+ if (policies.length === 0)
31
+ return null;
32
+ const permissionStr = `${context.permission.resource}:${context.permission.action}`;
33
+ const applicable = policies.filter((p) => p.permissions.includes(permissionStr));
34
+ if (applicable.length === 0)
35
+ return null;
36
+ for (const policy of applicable) {
37
+ try {
38
+ const result = await withTimeout(Promise.resolve(policy.evaluate(context)), authOptions?.policyTimeout);
39
+ if (!result.allowed) {
40
+ return Object.freeze({
41
+ allowed: false,
42
+ reason: result.reason ?? `policy:${policy.name}`,
43
+ policy: policy.name,
44
+ });
45
+ }
46
+ }
47
+ catch (error) {
48
+ if (error instanceof AuthorizationAbortedError)
49
+ throw error;
50
+ // Policy error — fail closed
51
+ return Object.freeze({
52
+ allowed: false,
53
+ reason: `policy_error:${policy.name}`,
54
+ policy: policy.name,
55
+ });
56
+ }
57
+ }
58
+ return Object.freeze({
59
+ allowed: true,
60
+ reason: "policy_allow",
61
+ policy: applicable.map((p) => p.name).join(","),
62
+ });
63
+ }
64
+ /**
65
+ * Run a promise with an optional timeout.
66
+ */
67
+ async function withTimeout(promise, timeoutMs) {
68
+ if (!timeoutMs)
69
+ return promise;
70
+ return new Promise((resolve, reject) => {
71
+ const timer = setTimeout(() => {
72
+ reject(new Error("Policy timeout"));
73
+ }, timeoutMs);
74
+ promise.then((value) => {
75
+ clearTimeout(timer);
76
+ resolve(value);
77
+ }, (error) => {
78
+ clearTimeout(timer);
79
+ reject(error);
80
+ });
81
+ });
82
+ }
83
+ //# sourceMappingURL=evaluator.pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.pipeline.js","sourceRoot":"","sources":["../../src/evaluator/evaluator.pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core permission evaluator — the heart of the authorization engine.
3
+ *
4
+ * @module evaluator
5
+ */
6
+ export { evaluate, evaluateWithExplain } from "./evaluator.core.js";
7
+ export type { EvaluatorOptions } from "./evaluator.pipeline.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evaluator/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core permission evaluator — the heart of the authorization engine.
3
+ *
4
+ * @module evaluator
5
+ */
6
+ export { evaluate, evaluateWithExplain } from "./evaluator.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/evaluator/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * HTTP response helpers for permission middleware.
3
+ *
4
+ * @module http/httpHelpers
5
+ */
6
+ import type { PermissionDecision } from "../permissionTypes/index.js";
7
+ /** Options for creating denied responses. */
8
+ export interface DeniedResponseOptions {
9
+ /** Custom 403 response body function. */
10
+ readonly deniedResponse?: (decision: PermissionDecision) => unknown;
11
+ }
12
+ /**
13
+ * Create a 403 Forbidden JSON response.
14
+ */
15
+ export declare function createForbiddenResponse(reason: string, options?: DeniedResponseOptions): {
16
+ readonly status: 403;
17
+ readonly body: unknown;
18
+ readonly headers: Record<string, string>;
19
+ };
20
+ /**
21
+ * Create a JSON response.
22
+ */
23
+ export declare function createJsonResponse(status: number, body: unknown): {
24
+ readonly status: number;
25
+ readonly body: unknown;
26
+ readonly headers: Record<string, string>;
27
+ };
28
+ //# sourceMappingURL=httpHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpHelpers.d.ts","sourceRoot":"","sources":["../../src/http/httpHelpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,6CAA6C;AAC7C,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC;CACrE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B;IACD,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C,CAUA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,GACZ;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C,CAMA"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * HTTP response helpers for permission middleware.
3
+ *
4
+ * @module http/httpHelpers
5
+ */
6
+ /**
7
+ * Create a 403 Forbidden JSON response.
8
+ */
9
+ export function createForbiddenResponse(reason, options) {
10
+ const body = options?.deniedResponse
11
+ ? options.deniedResponse({ allowed: false, reason })
12
+ : { error: "Forbidden", message: reason };
13
+ return Object.freeze({
14
+ status: 403,
15
+ body,
16
+ headers: { "content-type": "application/json" },
17
+ });
18
+ }
19
+ /**
20
+ * Create a JSON response.
21
+ */
22
+ export function createJsonResponse(status, body) {
23
+ return Object.freeze({
24
+ status,
25
+ body,
26
+ headers: { "content-type": "application/json" },
27
+ });
28
+ }
29
+ //# sourceMappingURL=httpHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpHelpers.js","sourceRoot":"","sources":["../../src/http/httpHelpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,OAA+B;IAM/B,MAAM,IAAI,GAAG,OAAO,EAAE,cAAc;QAClC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACpD,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAE5C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,GAAY;QACpB,IAAI;QACJ,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,IAAa;IAMb,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM;QACN,IAAI;QACJ,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * HTTP middleware adapter for @zudojs/permissions.
3
+ *
4
+ * Provides middleware factories that integrate the authorization engine
5
+ * with @zudojs/http's middleware pipeline.
6
+ *
7
+ * @module http/httpMiddleware
8
+ */
9
+ import type { PermissionActor, PermissionDecision, AuthorizationOptions } from "../permissionTypes/index.js";
10
+ import type { PermissionEngine } from "../evaluator/authorizationEngine.js";
11
+ import type { HttpMiddleware, HttpMiddlewareContext } from "./httpTypes.js";
12
+ /** Options for the authorize middleware. */
13
+ export interface AuthorizeMiddlewareOptions {
14
+ /** Function to extract an actor from the request context. */
15
+ readonly extractActor: (context: HttpMiddlewareContext) => PermissionActor | Promise<PermissionActor> | undefined;
16
+ /** Authorization options (signal, policyTimeout). */
17
+ readonly authorization?: AuthorizationOptions;
18
+ /** Custom 403 response body. */
19
+ readonly deniedResponse?: (decision: PermissionDecision) => unknown;
20
+ }
21
+ /** Options for the requirePermission middleware. */
22
+ export interface RequirePermissionMiddlewareOptions extends AuthorizeMiddlewareOptions {
23
+ /** The permission to check (e.g. "post:update"). */
24
+ readonly permission: string;
25
+ /** Function to extract the resource from the request (optional). */
26
+ readonly extractResource?: (context: HttpMiddlewareContext) => unknown;
27
+ }
28
+ /** State key for the current actor. */
29
+ export declare const ACTOR_STATE_KEY = "permissions:actor";
30
+ /** State key for the authorization decision. */
31
+ export declare const DECISION_STATE_KEY = "permissions:decision";
32
+ /**
33
+ * Create middleware that extracts the actor from the request and stores it in state.
34
+ */
35
+ export declare function createActorMiddleware(options: AuthorizeMiddlewareOptions): HttpMiddleware;
36
+ /**
37
+ * Create middleware that checks a permission and returns 403 if denied.
38
+ */
39
+ export declare function createRequirePermissionMiddleware(engine: PermissionEngine, options: RequirePermissionMiddlewareOptions): HttpMiddleware;
40
+ /**
41
+ * Create middleware that checks a permission and short-circuits on denial.
42
+ */
43
+ export declare function authorize(engine: PermissionEngine, permission: string, options: Omit<RequirePermissionMiddlewareOptions, "permission">): HttpMiddleware;
44
+ /**
45
+ * Create middleware that checks multiple permissions in batch.
46
+ */
47
+ export declare function createRequirePermissionsMiddleware(engine: PermissionEngine, permissions: readonly string[], options: AuthorizeMiddlewareOptions): HttpMiddleware;
48
+ //# sourceMappingURL=httpMiddleware.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpMiddleware.core.d.ts","sourceRoot":"","sources":["../../src/http/httpMiddleware.core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAK5E,4CAA4C;AAC5C,MAAM,WAAW,0BAA0B;IACzC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,CACrB,OAAO,EAAE,qBAAqB,KAC3B,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC5D,qDAAqD;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,gCAAgC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC;CACrE;AAED,oDAAoD;AACpD,MAAM,WAAW,kCAAmC,SAAQ,0BAA0B;IACpF,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC;CACxE;AAID,uCAAuC;AACvC,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,yBAAyB,CAAC;AAIzD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,0BAA0B,GAClC,cAAc,CAQhB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,kCAAkC,GAC1C,cAAc,CAyBhB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,IAAI,CAAC,kCAAkC,EAAE,YAAY,CAAC,GAC9D,cAAc,CAQhB;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,OAAO,EAAE,0BAA0B,GAClC,cAAc,CA8BhB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * HTTP middleware adapter for @zudojs/permissions.
3
+ *
4
+ * Provides middleware factories that integrate the authorization engine
5
+ * with @zudojs/http's middleware pipeline.
6
+ *
7
+ * @module http/httpMiddleware
8
+ */
9
+ import { createForbiddenResponse, createJsonResponse } from "./httpHelpers.js";
10
+ // ─── State Keys ───────────────────────────────────────────────────────────
11
+ /** State key for the current actor. */
12
+ export const ACTOR_STATE_KEY = "permissions:actor";
13
+ /** State key for the authorization decision. */
14
+ export const DECISION_STATE_KEY = "permissions:decision";
15
+ // ─── Middleware Factories ──────────────────────────────────────────────────
16
+ /**
17
+ * Create middleware that extracts the actor from the request and stores it in state.
18
+ */
19
+ export function createActorMiddleware(options) {
20
+ return async (context, next) => {
21
+ const actor = await options.extractActor(context);
22
+ if (actor) {
23
+ context.state.set(ACTOR_STATE_KEY, actor);
24
+ }
25
+ return next();
26
+ };
27
+ }
28
+ /**
29
+ * Create middleware that checks a permission and returns 403 if denied.
30
+ */
31
+ export function createRequirePermissionMiddleware(engine, options) {
32
+ return async (context, next) => {
33
+ const actor = context.state.get(ACTOR_STATE_KEY);
34
+ if (!actor) {
35
+ return createForbiddenResponse("No actor found in request context", options);
36
+ }
37
+ const resource = options.extractResource?.(context);
38
+ const decision = await engine.check(actor, options.permission, resource, options.authorization);
39
+ context.state.set(DECISION_STATE_KEY, decision);
40
+ if (!decision.allowed) {
41
+ return createForbiddenResponse(decision.reason ?? "Access denied", options);
42
+ }
43
+ return next();
44
+ };
45
+ }
46
+ /**
47
+ * Create middleware that checks a permission and short-circuits on denial.
48
+ */
49
+ export function authorize(engine, permission, options) {
50
+ return createRequirePermissionMiddleware(engine, {
51
+ permission,
52
+ extractActor: options.extractActor,
53
+ authorization: options.authorization,
54
+ deniedResponse: options.deniedResponse,
55
+ extractResource: options.extractResource,
56
+ });
57
+ }
58
+ /**
59
+ * Create middleware that checks multiple permissions in batch.
60
+ */
61
+ export function createRequirePermissionsMiddleware(engine, permissions, options) {
62
+ return async (context, next) => {
63
+ const actor = context.state.get(ACTOR_STATE_KEY);
64
+ if (!actor) {
65
+ return createForbiddenResponse("No actor found in request context", options);
66
+ }
67
+ const results = new Map();
68
+ for (const perm of permissions) {
69
+ const decision = await engine.check(actor, perm, undefined, options.authorization);
70
+ results.set(perm, decision);
71
+ }
72
+ context.state.set("permissions:decisions", results);
73
+ for (const [perm, decision] of results) {
74
+ if (!decision.allowed) {
75
+ return createForbiddenResponse(decision.reason ?? `Missing permission: ${perm}`, options);
76
+ }
77
+ }
78
+ return next();
79
+ };
80
+ }
81
+ //# sourceMappingURL=httpMiddleware.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpMiddleware.core.js","sourceRoot":"","sources":["../../src/http/httpMiddleware.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Local HTTP type definitions for the middleware adapter.
3
+ *
4
+ * These mirror the types from @zudojs/http so the permissions package
5
+ * can reference them without a hard dependency on the HTTP package.
6
+ *
7
+ * @module http/httpTypes
8
+ */
9
+ /** HTTP middleware signature from @zudojs/http. */
10
+ export type HttpMiddleware = (context: HttpMiddlewareContext, next: () => Promise<HttpResponseContext>) => void | Response | HttpResponseContext | Promise<void | Response | HttpResponseContext>;
11
+ /** HTTP middleware context from @zudojs/http. */
12
+ export interface HttpMiddlewareContext {
13
+ readonly request: HttpRequestContext;
14
+ readonly response: HttpResponseContext;
15
+ readonly state: HttpMiddlewareState;
16
+ readonly signal: AbortSignal;
17
+ readonly metadata: Readonly<Record<string, unknown>>;
18
+ }
19
+ /** HTTP request context from @zudojs/http. */
20
+ export interface HttpRequestContext {
21
+ readonly id: string;
22
+ readonly method: string;
23
+ readonly url: string;
24
+ readonly path: string;
25
+ readonly headers: ReadonlyMap<string, string>;
26
+ readonly params: ReadonlyMap<string, string>;
27
+ readonly query: ReadonlyMap<string, string | readonly string[] | undefined>;
28
+ }
29
+ /** HTTP response context from @zudojs/http. */
30
+ export interface HttpResponseContext {
31
+ readonly status: number;
32
+ readonly headers: Headers | Record<string, string>;
33
+ readonly body?: unknown;
34
+ }
35
+ /** HTTP middleware state from @zudojs/http. */
36
+ export interface HttpMiddlewareState {
37
+ get<T = unknown>(key: string): T | undefined;
38
+ set<T = unknown>(key: string, value: T): void;
39
+ }
40
+ //# sourceMappingURL=httpTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpTypes.d.ts","sourceRoot":"","sources":["../../src/http/httpTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mDAAmD;AACnD,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,KAEtC,IAAI,GACJ,QAAQ,GACR,mBAAmB,GACnB,OAAO,CAAC,IAAI,GAAG,QAAQ,GAAG,mBAAmB,CAAC,CAAC;AAEnD,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAC7E;AAED,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAC7C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CAC/C"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Local HTTP type definitions for the middleware adapter.
3
+ *
4
+ * These mirror the types from @zudojs/http so the permissions package
5
+ * can reference them without a hard dependency on the HTTP package.
6
+ *
7
+ * @module http/httpTypes
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=httpTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpTypes.js","sourceRoot":"","sources":["../../src/http/httpTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * HTTP middleware adapter for @zudojs/permissions.
3
+ *
4
+ * Requires @zudojs/http as a peer dependency.
5
+ *
6
+ * @module http
7
+ */
8
+ export { createActorMiddleware, createRequirePermissionMiddleware, authorize, createRequirePermissionsMiddleware, ACTOR_STATE_KEY, DECISION_STATE_KEY, type AuthorizeMiddlewareOptions, type RequirePermissionMiddlewareOptions, } from "./httpMiddleware.core.js";
9
+ export { createForbiddenResponse, createJsonResponse, type DeniedResponseOptions, } from "./httpHelpers.js";
10
+ export type { HttpMiddleware, HttpMiddlewareContext, HttpRequestContext, HttpResponseContext, HttpMiddlewareState, } from "./httpTypes.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,SAAS,EACT,kCAAkC,EAClC,eAAe,EACf,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,KAAK,kCAAkC,GACxC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * HTTP middleware adapter for @zudojs/permissions.
3
+ *
4
+ * Requires @zudojs/http as a peer dependency.
5
+ *
6
+ * @module http
7
+ */
8
+ export { createActorMiddleware, createRequirePermissionMiddleware, authorize, createRequirePermissionsMiddleware, ACTOR_STATE_KEY, DECISION_STATE_KEY, } from "./httpMiddleware.core.js";
9
+ export { createForbiddenResponse, createJsonResponse, } from "./httpHelpers.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,qBAAqB,EACrB,iCAAiC,EACjC,SAAS,EACT,kCAAkC,EAClC,eAAe,EACf,kBAAkB,GAGnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,uBAAuB,EACvB,kBAAkB,GAEnB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @zudojs/permissions
3
+ *
4
+ * Authorization engine for the Zudojs framework.
5
+ *
6
+ * Supports RBAC, ABAC, resource policies, wildcards, role hierarchy,
7
+ * condition combinators, ability compilation, and explain mode.
8
+ *
9
+ * @module @zudojs/permissions
10
+ */
11
+ export * from "./permissionTypes/index.js";
12
+ export * from "./permissionErrors/index.js";
13
+ export * from "./permission/index.js";
14
+ export * from "./actor/index.js";
15
+ export * from "./role/index.js";
16
+ export * from "./rule/index.js";
17
+ export * from "./conditions/index.js";
18
+ export * from "./policy/index.js";
19
+ export * from "./ability/index.js";
20
+ export * from "./evaluator/index.js";
21
+ export * from "./resolvers/index.js";
22
+ export * from "./cache/index.js";
23
+ export * from "./observability/index.js";
24
+ export * from "./utils/index.js";
25
+ export * from "./http/index.js";
26
+ export { createPermissionEngine, type PermissionEngine, type PermissionEngineOptions, } from "./evaluator/authorizationEngine.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,oCAAoC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @zudojs/permissions
3
+ *
4
+ * Authorization engine for the Zudojs framework.
5
+ *
6
+ * Supports RBAC, ABAC, resource policies, wildcards, role hierarchy,
7
+ * condition combinators, ability compilation, and explain mode.
8
+ *
9
+ * @module @zudojs/permissions
10
+ */
11
+ export * from "./permissionTypes/index.js";
12
+ export * from "./permissionErrors/index.js";
13
+ export * from "./permission/index.js";
14
+ export * from "./actor/index.js";
15
+ export * from "./role/index.js";
16
+ export * from "./rule/index.js";
17
+ export * from "./conditions/index.js";
18
+ export * from "./policy/index.js";
19
+ export * from "./ability/index.js";
20
+ export * from "./evaluator/index.js";
21
+ export * from "./resolvers/index.js";
22
+ export * from "./cache/index.js";
23
+ export * from "./observability/index.js";
24
+ export * from "./utils/index.js";
25
+ export * from "./http/index.js";
26
+ export { createPermissionEngine, } from "./evaluator/authorizationEngine.js";
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EACL,sBAAsB,GAGvB,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Authorization observability — events, metrics, and tracing.
3
+ *
4
+ * @module observability
5
+ */
6
+ export { createPermissionEventEmitter, withObservability, type PermissionCheckEvent, type PermissionEventHandler, } from "./observability.core.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Authorization observability — events, metrics, and tracing.
3
+ *
4
+ * @module observability
5
+ */
6
+ export { createPermissionEventEmitter, withObservability, } from "./observability.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/observability/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Observability helpers for authorization events and metrics.
3
+ *
4
+ * @module observability/observability
5
+ */
6
+ import type { PermissionDecision } from "../permissionTypes/index.js";
7
+ /** Event emitted when a permission check completes. */
8
+ export interface PermissionCheckEvent {
9
+ /** Actor ID. */
10
+ readonly actorId: string;
11
+ /** Permission checked. */
12
+ readonly permission: string;
13
+ /** Resource type (if available). */
14
+ readonly resourceType?: string;
15
+ /** Whether allowed. */
16
+ readonly allowed: boolean;
17
+ /** Decision reason. */
18
+ readonly reason?: string;
19
+ /** Evaluation duration in ms. */
20
+ readonly durationMs: number;
21
+ }
22
+ /** Handler for permission events. */
23
+ export type PermissionEventHandler = (event: PermissionCheckEvent) => void;
24
+ /**
25
+ * Create a permission event emitter.
26
+ */
27
+ export declare function createPermissionEventEmitter(): {
28
+ /** Register an event handler. */
29
+ on(handler: PermissionEventHandler): () => void;
30
+ /** Emit a permission check event. */
31
+ emit(event: PermissionCheckEvent): void;
32
+ };
33
+ /**
34
+ * Wrap a permission check with observability.
35
+ *
36
+ * @param emitter - The event emitter.
37
+ * @param fn - The permission check function.
38
+ * @returns Wrapped function that emits events.
39
+ */
40
+ export declare function withObservability<T extends (...args: readonly unknown[]) => Promise<PermissionDecision>>(emitter: ReturnType<typeof createPermissionEventEmitter>, fn: T): T;
41
+ //# sourceMappingURL=observability.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability.core.d.ts","sourceRoot":"","sources":["../../src/observability/observability.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,uDAAuD;AACvD,MAAM,WAAW,oBAAoB;IACnC,gBAAgB;IAChB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,qCAAqC;AACrC,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;AAE3E;;GAEG;AACH,wBAAgB,4BAA4B;IAIxC,iCAAiC;IACjC,EAAE,UAAU,sBAAsB,GAAG,MAAM,IAAI;IAO/C,qCAAqC;IACrC,IAAI,QAAQ,oBAAoB,GAAG,IAAI;EAU1C;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,EACtE,OAAO,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAgBpE"}