@contractspec/lib.identity-rbac 1.56.1 → 1.58.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 (82) hide show
  1. package/dist/browser/contracts/index.js +1045 -0
  2. package/dist/browser/contracts/organization.js +655 -0
  3. package/dist/browser/contracts/rbac.js +599 -0
  4. package/dist/browser/contracts/user.js +235 -0
  5. package/dist/browser/entities/index.js +464 -0
  6. package/dist/browser/entities/organization.js +150 -0
  7. package/dist/browser/entities/rbac.js +124 -0
  8. package/dist/browser/entities/user.js +168 -0
  9. package/dist/browser/events.js +374 -0
  10. package/dist/browser/identity-rbac.capability.js +28 -0
  11. package/dist/browser/identity-rbac.feature.js +67 -0
  12. package/dist/browser/index.js +2099 -0
  13. package/dist/browser/policies/engine.js +154 -0
  14. package/dist/browser/policies/index.js +154 -0
  15. package/dist/contracts/index.d.ts +4 -4
  16. package/dist/contracts/index.d.ts.map +1 -0
  17. package/dist/contracts/index.js +1045 -4
  18. package/dist/contracts/organization.d.ts +758 -764
  19. package/dist/contracts/organization.d.ts.map +1 -1
  20. package/dist/contracts/organization.js +653 -602
  21. package/dist/contracts/rbac.d.ts +517 -523
  22. package/dist/contracts/rbac.d.ts.map +1 -1
  23. package/dist/contracts/rbac.js +597 -481
  24. package/dist/contracts/user.d.ts +513 -519
  25. package/dist/contracts/user.d.ts.map +1 -1
  26. package/dist/contracts/user.js +222 -319
  27. package/dist/entities/index.d.ts +164 -169
  28. package/dist/entities/index.d.ts.map +1 -1
  29. package/dist/entities/index.js +462 -33
  30. package/dist/entities/organization.d.ts +58 -63
  31. package/dist/entities/organization.d.ts.map +1 -1
  32. package/dist/entities/organization.js +145 -145
  33. package/dist/entities/rbac.d.ts +62 -67
  34. package/dist/entities/rbac.d.ts.map +1 -1
  35. package/dist/entities/rbac.js +119 -132
  36. package/dist/entities/user.d.ts +66 -71
  37. package/dist/entities/user.d.ts.map +1 -1
  38. package/dist/entities/user.js +164 -189
  39. package/dist/events.d.ts +537 -543
  40. package/dist/events.d.ts.map +1 -1
  41. package/dist/events.js +343 -651
  42. package/dist/identity-rbac.capability.d.ts +2 -7
  43. package/dist/identity-rbac.capability.d.ts.map +1 -1
  44. package/dist/identity-rbac.capability.js +29 -29
  45. package/dist/identity-rbac.feature.d.ts +1 -7
  46. package/dist/identity-rbac.feature.d.ts.map +1 -1
  47. package/dist/identity-rbac.feature.js +66 -193
  48. package/dist/index.d.ts +6 -12
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +2100 -14
  51. package/dist/node/contracts/index.js +1045 -0
  52. package/dist/node/contracts/organization.js +655 -0
  53. package/dist/node/contracts/rbac.js +599 -0
  54. package/dist/node/contracts/user.js +235 -0
  55. package/dist/node/entities/index.js +464 -0
  56. package/dist/node/entities/organization.js +150 -0
  57. package/dist/node/entities/rbac.js +124 -0
  58. package/dist/node/entities/user.js +168 -0
  59. package/dist/node/events.js +374 -0
  60. package/dist/node/identity-rbac.capability.js +28 -0
  61. package/dist/node/identity-rbac.feature.js +67 -0
  62. package/dist/node/index.js +2099 -0
  63. package/dist/node/policies/engine.js +154 -0
  64. package/dist/node/policies/index.js +154 -0
  65. package/dist/policies/engine.d.ts +98 -101
  66. package/dist/policies/engine.d.ts.map +1 -1
  67. package/dist/policies/engine.js +151 -164
  68. package/dist/policies/index.d.ts +2 -2
  69. package/dist/policies/index.d.ts.map +1 -0
  70. package/dist/policies/index.js +154 -2
  71. package/package.json +149 -40
  72. package/dist/contracts/organization.js.map +0 -1
  73. package/dist/contracts/rbac.js.map +0 -1
  74. package/dist/contracts/user.js.map +0 -1
  75. package/dist/entities/index.js.map +0 -1
  76. package/dist/entities/organization.js.map +0 -1
  77. package/dist/entities/rbac.js.map +0 -1
  78. package/dist/entities/user.js.map +0 -1
  79. package/dist/events.js.map +0 -1
  80. package/dist/identity-rbac.capability.js.map +0 -1
  81. package/dist/identity-rbac.feature.js.map +0 -1
  82. package/dist/policies/engine.js.map +0 -1
@@ -1,168 +1,155 @@
1
- //#region src/policies/engine.ts
2
- /**
3
- * Standard permissions for identity-rbac module.
4
- */
5
- const Permission = {
6
- USER_CREATE: "user.create",
7
- USER_READ: "user.read",
8
- USER_UPDATE: "user.update",
9
- USER_DELETE: "user.delete",
10
- USER_LIST: "user.list",
11
- USER_MANAGE: "user.manage",
12
- ORG_CREATE: "org.create",
13
- ORG_READ: "org.read",
14
- ORG_UPDATE: "org.update",
15
- ORG_DELETE: "org.delete",
16
- ORG_LIST: "org.list",
17
- MEMBER_INVITE: "member.invite",
18
- MEMBER_REMOVE: "member.remove",
19
- MEMBER_UPDATE_ROLE: "member.update_role",
20
- MEMBER_LIST: "member.list",
21
- MANAGE_MEMBERS: "org.manage_members",
22
- TEAM_CREATE: "team.create",
23
- TEAM_UPDATE: "team.update",
24
- TEAM_DELETE: "team.delete",
25
- TEAM_MANAGE: "team.manage",
26
- ROLE_CREATE: "role.create",
27
- ROLE_UPDATE: "role.update",
28
- ROLE_DELETE: "role.delete",
29
- ROLE_ASSIGN: "role.assign",
30
- ROLE_REVOKE: "role.revoke",
31
- BILLING_VIEW: "billing.view",
32
- BILLING_MANAGE: "billing.manage",
33
- PROJECT_CREATE: "project.create",
34
- PROJECT_READ: "project.read",
35
- PROJECT_UPDATE: "project.update",
36
- PROJECT_DELETE: "project.delete",
37
- PROJECT_MANAGE: "project.manage",
38
- ADMIN_ACCESS: "admin.access",
39
- ADMIN_IMPERSONATE: "admin.impersonate"
1
+ // @bun
2
+ // src/policies/engine.ts
3
+ var Permission = {
4
+ USER_CREATE: "user.create",
5
+ USER_READ: "user.read",
6
+ USER_UPDATE: "user.update",
7
+ USER_DELETE: "user.delete",
8
+ USER_LIST: "user.list",
9
+ USER_MANAGE: "user.manage",
10
+ ORG_CREATE: "org.create",
11
+ ORG_READ: "org.read",
12
+ ORG_UPDATE: "org.update",
13
+ ORG_DELETE: "org.delete",
14
+ ORG_LIST: "org.list",
15
+ MEMBER_INVITE: "member.invite",
16
+ MEMBER_REMOVE: "member.remove",
17
+ MEMBER_UPDATE_ROLE: "member.update_role",
18
+ MEMBER_LIST: "member.list",
19
+ MANAGE_MEMBERS: "org.manage_members",
20
+ TEAM_CREATE: "team.create",
21
+ TEAM_UPDATE: "team.update",
22
+ TEAM_DELETE: "team.delete",
23
+ TEAM_MANAGE: "team.manage",
24
+ ROLE_CREATE: "role.create",
25
+ ROLE_UPDATE: "role.update",
26
+ ROLE_DELETE: "role.delete",
27
+ ROLE_ASSIGN: "role.assign",
28
+ ROLE_REVOKE: "role.revoke",
29
+ BILLING_VIEW: "billing.view",
30
+ BILLING_MANAGE: "billing.manage",
31
+ PROJECT_CREATE: "project.create",
32
+ PROJECT_READ: "project.read",
33
+ PROJECT_UPDATE: "project.update",
34
+ PROJECT_DELETE: "project.delete",
35
+ PROJECT_MANAGE: "project.manage",
36
+ ADMIN_ACCESS: "admin.access",
37
+ ADMIN_IMPERSONATE: "admin.impersonate"
40
38
  };
41
- /**
42
- * Standard role definitions.
43
- */
44
- const StandardRole = {
45
- OWNER: {
46
- name: "owner",
47
- description: "Organization owner with full access",
48
- permissions: Object.values(Permission)
49
- },
50
- ADMIN: {
51
- name: "admin",
52
- description: "Administrator with most permissions",
53
- permissions: [
54
- Permission.USER_READ,
55
- Permission.USER_LIST,
56
- Permission.ORG_READ,
57
- Permission.ORG_UPDATE,
58
- Permission.MEMBER_INVITE,
59
- Permission.MEMBER_REMOVE,
60
- Permission.MEMBER_UPDATE_ROLE,
61
- Permission.MEMBER_LIST,
62
- Permission.MANAGE_MEMBERS,
63
- Permission.TEAM_CREATE,
64
- Permission.TEAM_UPDATE,
65
- Permission.TEAM_DELETE,
66
- Permission.TEAM_MANAGE,
67
- Permission.PROJECT_CREATE,
68
- Permission.PROJECT_READ,
69
- Permission.PROJECT_UPDATE,
70
- Permission.PROJECT_DELETE,
71
- Permission.PROJECT_MANAGE,
72
- Permission.BILLING_VIEW
73
- ]
74
- },
75
- MEMBER: {
76
- name: "member",
77
- description: "Regular organization member",
78
- permissions: [
79
- Permission.USER_READ,
80
- Permission.ORG_READ,
81
- Permission.MEMBER_LIST,
82
- Permission.PROJECT_READ,
83
- Permission.PROJECT_CREATE
84
- ]
85
- },
86
- VIEWER: {
87
- name: "viewer",
88
- description: "Read-only access",
89
- permissions: [
90
- Permission.USER_READ,
91
- Permission.ORG_READ,
92
- Permission.MEMBER_LIST,
93
- Permission.PROJECT_READ
94
- ]
95
- }
39
+ var StandardRole = {
40
+ OWNER: {
41
+ name: "owner",
42
+ description: "Organization owner with full access",
43
+ permissions: Object.values(Permission)
44
+ },
45
+ ADMIN: {
46
+ name: "admin",
47
+ description: "Administrator with most permissions",
48
+ permissions: [
49
+ Permission.USER_READ,
50
+ Permission.USER_LIST,
51
+ Permission.ORG_READ,
52
+ Permission.ORG_UPDATE,
53
+ Permission.MEMBER_INVITE,
54
+ Permission.MEMBER_REMOVE,
55
+ Permission.MEMBER_UPDATE_ROLE,
56
+ Permission.MEMBER_LIST,
57
+ Permission.MANAGE_MEMBERS,
58
+ Permission.TEAM_CREATE,
59
+ Permission.TEAM_UPDATE,
60
+ Permission.TEAM_DELETE,
61
+ Permission.TEAM_MANAGE,
62
+ Permission.PROJECT_CREATE,
63
+ Permission.PROJECT_READ,
64
+ Permission.PROJECT_UPDATE,
65
+ Permission.PROJECT_DELETE,
66
+ Permission.PROJECT_MANAGE,
67
+ Permission.BILLING_VIEW
68
+ ]
69
+ },
70
+ MEMBER: {
71
+ name: "member",
72
+ description: "Regular organization member",
73
+ permissions: [
74
+ Permission.USER_READ,
75
+ Permission.ORG_READ,
76
+ Permission.MEMBER_LIST,
77
+ Permission.PROJECT_READ,
78
+ Permission.PROJECT_CREATE
79
+ ]
80
+ },
81
+ VIEWER: {
82
+ name: "viewer",
83
+ description: "Read-only access",
84
+ permissions: [
85
+ Permission.USER_READ,
86
+ Permission.ORG_READ,
87
+ Permission.MEMBER_LIST,
88
+ Permission.PROJECT_READ
89
+ ]
90
+ }
96
91
  };
97
- /**
98
- * RBAC Policy Engine for permission checks.
99
- */
100
- var RBACPolicyEngine = class {
101
- roleCache = /* @__PURE__ */ new Map();
102
- bindingCache = /* @__PURE__ */ new Map();
103
- /**
104
- * Check if a user has a specific permission.
105
- */
106
- async checkPermission(input, bindings) {
107
- const { userId, orgId, permission } = input;
108
- const now = /* @__PURE__ */ new Date();
109
- const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
110
- const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
111
- const activeBindings = [...userBindings, ...orgBindings].filter((b) => !b.expiresAt || b.expiresAt > now);
112
- if (activeBindings.length === 0) return {
113
- allowed: false,
114
- reason: "No active role bindings found"
115
- };
116
- for (const binding of activeBindings) if (binding.role.permissions.includes(permission)) return {
117
- allowed: true,
118
- matchedRole: binding.role.name
119
- };
120
- return {
121
- allowed: false,
122
- reason: `No role grants the "${permission}" permission`
123
- };
124
- }
125
- /**
126
- * Get all permissions for a user in a context.
127
- */
128
- async getPermissions(userId, orgId, bindings) {
129
- const now = /* @__PURE__ */ new Date();
130
- const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
131
- const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
132
- const activeBindings = [...userBindings, ...orgBindings].filter((b) => !b.expiresAt || b.expiresAt > now);
133
- const permissions = /* @__PURE__ */ new Set();
134
- const roles = [];
135
- for (const binding of activeBindings) {
136
- roles.push(binding.role);
137
- for (const perm of binding.role.permissions) permissions.add(perm);
138
- }
139
- return {
140
- permissions,
141
- roles
142
- };
143
- }
144
- /**
145
- * Check if user has any of the specified permissions.
146
- */
147
- async hasAnyPermission(userId, orgId, permissions, bindings) {
148
- const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
149
- return permissions.some((p) => userPerms.has(p));
150
- }
151
- /**
152
- * Check if user has all of the specified permissions.
153
- */
154
- async hasAllPermissions(userId, orgId, permissions, bindings) {
155
- const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
156
- return permissions.every((p) => userPerms.has(p));
157
- }
158
- };
159
- /**
160
- * Create a new RBAC policy engine instance.
161
- */
92
+
93
+ class RBACPolicyEngine {
94
+ roleCache = new Map;
95
+ bindingCache = new Map;
96
+ async checkPermission(input, bindings) {
97
+ const { userId, orgId, permission } = input;
98
+ const now = new Date;
99
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
100
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
101
+ const allBindings = [...userBindings, ...orgBindings];
102
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
103
+ if (activeBindings.length === 0) {
104
+ return {
105
+ allowed: false,
106
+ reason: "No active role bindings found"
107
+ };
108
+ }
109
+ for (const binding of activeBindings) {
110
+ if (binding.role.permissions.includes(permission)) {
111
+ return {
112
+ allowed: true,
113
+ matchedRole: binding.role.name
114
+ };
115
+ }
116
+ }
117
+ return {
118
+ allowed: false,
119
+ reason: `No role grants the "${permission}" permission`
120
+ };
121
+ }
122
+ async getPermissions(userId, orgId, bindings) {
123
+ const now = new Date;
124
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
125
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
126
+ const allBindings = [...userBindings, ...orgBindings];
127
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
128
+ const permissions = new Set;
129
+ const roles = [];
130
+ for (const binding of activeBindings) {
131
+ roles.push(binding.role);
132
+ for (const perm of binding.role.permissions) {
133
+ permissions.add(perm);
134
+ }
135
+ }
136
+ return { permissions, roles };
137
+ }
138
+ async hasAnyPermission(userId, orgId, permissions, bindings) {
139
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
140
+ return permissions.some((p) => userPerms.has(p));
141
+ }
142
+ async hasAllPermissions(userId, orgId, permissions, bindings) {
143
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
144
+ return permissions.every((p) => userPerms.has(p));
145
+ }
146
+ }
162
147
  function createRBACEngine() {
163
- return new RBACPolicyEngine();
148
+ return new RBACPolicyEngine;
164
149
  }
165
-
166
- //#endregion
167
- export { Permission, RBACPolicyEngine, StandardRole, createRBACEngine };
168
- //# sourceMappingURL=engine.js.map
150
+ export {
151
+ createRBACEngine,
152
+ StandardRole,
153
+ RBACPolicyEngine,
154
+ Permission
155
+ };
@@ -1,2 +1,2 @@
1
- import { Permission, PermissionCheckInput, PermissionCheckResult, PermissionKey, PolicyBindingForEval, RBACPolicyEngine, RoleWithPermissions, StandardRole, createRBACEngine } from "./engine.js";
2
- export { Permission, type PermissionCheckInput, type PermissionCheckResult, type PermissionKey, type PolicyBindingForEval, RBACPolicyEngine, type RoleWithPermissions, StandardRole, createRBACEngine };
1
+ export { Permission, StandardRole, RBACPolicyEngine, createRBACEngine, type PermissionKey, type PermissionCheckInput, type PermissionCheckResult, type RoleWithPermissions, type PolicyBindingForEval, } from './engine';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policies/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,UAAU,CAAC"}
@@ -1,3 +1,155 @@
1
- import { Permission, RBACPolicyEngine, StandardRole, createRBACEngine } from "./engine.js";
1
+ // @bun
2
+ // src/policies/engine.ts
3
+ var Permission = {
4
+ USER_CREATE: "user.create",
5
+ USER_READ: "user.read",
6
+ USER_UPDATE: "user.update",
7
+ USER_DELETE: "user.delete",
8
+ USER_LIST: "user.list",
9
+ USER_MANAGE: "user.manage",
10
+ ORG_CREATE: "org.create",
11
+ ORG_READ: "org.read",
12
+ ORG_UPDATE: "org.update",
13
+ ORG_DELETE: "org.delete",
14
+ ORG_LIST: "org.list",
15
+ MEMBER_INVITE: "member.invite",
16
+ MEMBER_REMOVE: "member.remove",
17
+ MEMBER_UPDATE_ROLE: "member.update_role",
18
+ MEMBER_LIST: "member.list",
19
+ MANAGE_MEMBERS: "org.manage_members",
20
+ TEAM_CREATE: "team.create",
21
+ TEAM_UPDATE: "team.update",
22
+ TEAM_DELETE: "team.delete",
23
+ TEAM_MANAGE: "team.manage",
24
+ ROLE_CREATE: "role.create",
25
+ ROLE_UPDATE: "role.update",
26
+ ROLE_DELETE: "role.delete",
27
+ ROLE_ASSIGN: "role.assign",
28
+ ROLE_REVOKE: "role.revoke",
29
+ BILLING_VIEW: "billing.view",
30
+ BILLING_MANAGE: "billing.manage",
31
+ PROJECT_CREATE: "project.create",
32
+ PROJECT_READ: "project.read",
33
+ PROJECT_UPDATE: "project.update",
34
+ PROJECT_DELETE: "project.delete",
35
+ PROJECT_MANAGE: "project.manage",
36
+ ADMIN_ACCESS: "admin.access",
37
+ ADMIN_IMPERSONATE: "admin.impersonate"
38
+ };
39
+ var StandardRole = {
40
+ OWNER: {
41
+ name: "owner",
42
+ description: "Organization owner with full access",
43
+ permissions: Object.values(Permission)
44
+ },
45
+ ADMIN: {
46
+ name: "admin",
47
+ description: "Administrator with most permissions",
48
+ permissions: [
49
+ Permission.USER_READ,
50
+ Permission.USER_LIST,
51
+ Permission.ORG_READ,
52
+ Permission.ORG_UPDATE,
53
+ Permission.MEMBER_INVITE,
54
+ Permission.MEMBER_REMOVE,
55
+ Permission.MEMBER_UPDATE_ROLE,
56
+ Permission.MEMBER_LIST,
57
+ Permission.MANAGE_MEMBERS,
58
+ Permission.TEAM_CREATE,
59
+ Permission.TEAM_UPDATE,
60
+ Permission.TEAM_DELETE,
61
+ Permission.TEAM_MANAGE,
62
+ Permission.PROJECT_CREATE,
63
+ Permission.PROJECT_READ,
64
+ Permission.PROJECT_UPDATE,
65
+ Permission.PROJECT_DELETE,
66
+ Permission.PROJECT_MANAGE,
67
+ Permission.BILLING_VIEW
68
+ ]
69
+ },
70
+ MEMBER: {
71
+ name: "member",
72
+ description: "Regular organization member",
73
+ permissions: [
74
+ Permission.USER_READ,
75
+ Permission.ORG_READ,
76
+ Permission.MEMBER_LIST,
77
+ Permission.PROJECT_READ,
78
+ Permission.PROJECT_CREATE
79
+ ]
80
+ },
81
+ VIEWER: {
82
+ name: "viewer",
83
+ description: "Read-only access",
84
+ permissions: [
85
+ Permission.USER_READ,
86
+ Permission.ORG_READ,
87
+ Permission.MEMBER_LIST,
88
+ Permission.PROJECT_READ
89
+ ]
90
+ }
91
+ };
2
92
 
3
- export { Permission, RBACPolicyEngine, StandardRole, createRBACEngine };
93
+ class RBACPolicyEngine {
94
+ roleCache = new Map;
95
+ bindingCache = new Map;
96
+ async checkPermission(input, bindings) {
97
+ const { userId, orgId, permission } = input;
98
+ const now = new Date;
99
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
100
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
101
+ const allBindings = [...userBindings, ...orgBindings];
102
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
103
+ if (activeBindings.length === 0) {
104
+ return {
105
+ allowed: false,
106
+ reason: "No active role bindings found"
107
+ };
108
+ }
109
+ for (const binding of activeBindings) {
110
+ if (binding.role.permissions.includes(permission)) {
111
+ return {
112
+ allowed: true,
113
+ matchedRole: binding.role.name
114
+ };
115
+ }
116
+ }
117
+ return {
118
+ allowed: false,
119
+ reason: `No role grants the "${permission}" permission`
120
+ };
121
+ }
122
+ async getPermissions(userId, orgId, bindings) {
123
+ const now = new Date;
124
+ const userBindings = bindings.filter((b) => b.targetType === "user" && b.targetId === userId);
125
+ const orgBindings = orgId ? bindings.filter((b) => b.targetType === "organization" && b.targetId === orgId) : [];
126
+ const allBindings = [...userBindings, ...orgBindings];
127
+ const activeBindings = allBindings.filter((b) => !b.expiresAt || b.expiresAt > now);
128
+ const permissions = new Set;
129
+ const roles = [];
130
+ for (const binding of activeBindings) {
131
+ roles.push(binding.role);
132
+ for (const perm of binding.role.permissions) {
133
+ permissions.add(perm);
134
+ }
135
+ }
136
+ return { permissions, roles };
137
+ }
138
+ async hasAnyPermission(userId, orgId, permissions, bindings) {
139
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
140
+ return permissions.some((p) => userPerms.has(p));
141
+ }
142
+ async hasAllPermissions(userId, orgId, permissions, bindings) {
143
+ const { permissions: userPerms } = await this.getPermissions(userId, orgId, bindings);
144
+ return permissions.every((p) => userPerms.has(p));
145
+ }
146
+ }
147
+ function createRBACEngine() {
148
+ return new RBACPolicyEngine;
149
+ }
150
+ export {
151
+ createRBACEngine,
152
+ StandardRole,
153
+ RBACPolicyEngine,
154
+ Permission
155
+ };