@hearth-auth/node 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 (85) hide show
  1. package/dist/admin.d.ts +83 -0
  2. package/dist/admin.d.ts.map +1 -0
  3. package/dist/admin.js +184 -0
  4. package/dist/admin.js.map +1 -0
  5. package/dist/admin.test.d.ts +2 -0
  6. package/dist/admin.test.d.ts.map +1 -0
  7. package/dist/admin.test.js +239 -0
  8. package/dist/admin.test.js.map +1 -0
  9. package/dist/authorize.d.ts +35 -0
  10. package/dist/authorize.d.ts.map +1 -0
  11. package/dist/authorize.js +68 -0
  12. package/dist/authorize.js.map +1 -0
  13. package/dist/authorize.test.d.ts +2 -0
  14. package/dist/authorize.test.d.ts.map +1 -0
  15. package/dist/authorize.test.js +93 -0
  16. package/dist/authorize.test.js.map +1 -0
  17. package/dist/client.d.ts +36 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +51 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/config.d.ts +47 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +33 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/config.test.d.ts +2 -0
  26. package/dist/config.test.d.ts.map +1 -0
  27. package/dist/config.test.js +36 -0
  28. package/dist/config.test.js.map +1 -0
  29. package/dist/discovery.d.ts +22 -0
  30. package/dist/discovery.d.ts.map +1 -0
  31. package/dist/discovery.js +60 -0
  32. package/dist/discovery.js.map +1 -0
  33. package/dist/discovery.test.d.ts +2 -0
  34. package/dist/discovery.test.d.ts.map +1 -0
  35. package/dist/discovery.test.js +77 -0
  36. package/dist/discovery.test.js.map +1 -0
  37. package/dist/errors.d.ts +120 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +172 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/errors.test.d.ts +2 -0
  42. package/dist/errors.test.d.ts.map +1 -0
  43. package/dist/errors.test.js +89 -0
  44. package/dist/errors.test.js.map +1 -0
  45. package/dist/index.d.ts +16 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +18 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/introspect.d.ts +37 -0
  50. package/dist/introspect.d.ts.map +1 -0
  51. package/dist/introspect.js +72 -0
  52. package/dist/introspect.js.map +1 -0
  53. package/dist/introspect.test.d.ts +2 -0
  54. package/dist/introspect.test.d.ts.map +1 -0
  55. package/dist/introspect.test.js +109 -0
  56. package/dist/introspect.test.js.map +1 -0
  57. package/dist/jwks.d.ts +26 -0
  58. package/dist/jwks.d.ts.map +1 -0
  59. package/dist/jwks.js +106 -0
  60. package/dist/jwks.js.map +1 -0
  61. package/dist/jwks.test.d.ts +7 -0
  62. package/dist/jwks.test.d.ts.map +1 -0
  63. package/dist/jwks.test.js +154 -0
  64. package/dist/jwks.test.js.map +1 -0
  65. package/dist/middleware.d.ts +61 -0
  66. package/dist/middleware.d.ts.map +1 -0
  67. package/dist/middleware.js +228 -0
  68. package/dist/middleware.js.map +1 -0
  69. package/dist/middleware.mode.test.d.ts +2 -0
  70. package/dist/middleware.mode.test.d.ts.map +1 -0
  71. package/dist/middleware.mode.test.js +203 -0
  72. package/dist/middleware.mode.test.js.map +1 -0
  73. package/dist/middleware.test.d.ts +2 -0
  74. package/dist/middleware.test.d.ts.map +1 -0
  75. package/dist/middleware.test.js +144 -0
  76. package/dist/middleware.test.js.map +1 -0
  77. package/dist/token.d.ts +68 -0
  78. package/dist/token.d.ts.map +1 -0
  79. package/dist/token.js +111 -0
  80. package/dist/token.js.map +1 -0
  81. package/dist/token.test.d.ts +2 -0
  82. package/dist/token.test.d.ts.map +1 -0
  83. package/dist/token.test.js +135 -0
  84. package/dist/token.test.js.map +1 -0
  85. package/package.json +40 -0
@@ -0,0 +1,83 @@
1
+ /** §12 — AdminClient: management operations against the Hearth admin API. */
2
+ export interface AdminClientConfig {
3
+ /** Root URL of the Hearth instance (no trailing slash). */
4
+ base_url: string;
5
+ /** ID of the realm to administer. */
6
+ realm_id: string;
7
+ /** A valid access token whose subject holds the `admin` role in the target realm. */
8
+ access_token: string;
9
+ }
10
+ export interface PageOptions {
11
+ limit?: number;
12
+ cursor?: string;
13
+ }
14
+ export interface PageResponse<T> {
15
+ items: T[];
16
+ next_cursor: string | null;
17
+ }
18
+ export declare class AdminClient {
19
+ private readonly baseUrl;
20
+ private readonly realmId;
21
+ private readonly accessToken;
22
+ constructor(config: AdminClientConfig);
23
+ private get authHeaders();
24
+ private buildUrl;
25
+ private request;
26
+ /** Create a new user in the realm. */
27
+ createUser(params: Record<string, unknown>): Promise<Record<string, unknown>>;
28
+ /** Get a user by ID. */
29
+ getUser(id: string): Promise<Record<string, unknown>>;
30
+ /** Update a user by ID. */
31
+ updateUser(id: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
32
+ /** Delete a user by ID. */
33
+ deleteUser(id: string): Promise<void>;
34
+ /** List users with optional pagination. */
35
+ listUsers(options?: PageOptions): Promise<PageResponse<Record<string, unknown>>>;
36
+ /** Create a new realm. */
37
+ createRealm(params: Record<string, unknown>): Promise<Record<string, unknown>>;
38
+ /** Get a realm by ID. */
39
+ getRealm(id: string): Promise<Record<string, unknown>>;
40
+ /** Update a realm by ID. */
41
+ updateRealm(id: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
42
+ /** Delete a realm by ID. */
43
+ deleteRealm(id: string): Promise<void>;
44
+ /** List realms with optional pagination. */
45
+ listRealms(options?: PageOptions): Promise<PageResponse<Record<string, unknown>>>;
46
+ /** Create an OAuth 2.0 client registration. */
47
+ createClient(params: Record<string, unknown>): Promise<Record<string, unknown>>;
48
+ /** Get an OAuth client by ID. */
49
+ getClient(id: string): Promise<Record<string, unknown>>;
50
+ /** Update an OAuth client by ID. */
51
+ updateClient(id: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
52
+ /** Delete an OAuth client by ID. */
53
+ deleteClient(id: string): Promise<void>;
54
+ /** List OAuth clients with optional pagination. */
55
+ listClients(options?: PageOptions): Promise<PageResponse<Record<string, unknown>>>;
56
+ /** Create a role in the realm. */
57
+ createRole(params: Record<string, unknown>): Promise<Record<string, unknown>>;
58
+ /** Get a role by ID. */
59
+ getRole(id: string): Promise<Record<string, unknown>>;
60
+ /** Update a role by ID. */
61
+ updateRole(id: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
62
+ /** Delete a role by ID. */
63
+ deleteRole(id: string): Promise<void>;
64
+ /** List roles with optional pagination. */
65
+ listRoles(options?: PageOptions): Promise<PageResponse<Record<string, unknown>>>;
66
+ /** Create a group in the realm. */
67
+ createGroup(params: Record<string, unknown>): Promise<Record<string, unknown>>;
68
+ /** Get a group by ID. */
69
+ getGroup(id: string): Promise<Record<string, unknown>>;
70
+ /** Update a group by ID. */
71
+ updateGroup(id: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
72
+ /** Delete a group by ID. */
73
+ deleteGroup(id: string): Promise<void>;
74
+ /** List groups with optional pagination. */
75
+ listGroups(options?: PageOptions): Promise<PageResponse<Record<string, unknown>>>;
76
+ /** Add a member to an organization. */
77
+ addOrgMember(orgId: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
78
+ /** List members of an organization. */
79
+ listOrgMembers(orgId: string, options?: PageOptions): Promise<PageResponse<Record<string, unknown>>>;
80
+ /** Remove a member from an organization. */
81
+ removeOrgMember(orgId: string, userId: string): Promise<void>;
82
+ }
83
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"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"}
package/dist/admin.js ADDED
@@ -0,0 +1,184 @@
1
+ /** §12 — AdminClient: management operations against the Hearth admin API. */
2
+ import { ConfigurationError, AdminHttpError } from "./errors.js";
3
+ export class AdminClient {
4
+ baseUrl;
5
+ realmId;
6
+ accessToken;
7
+ constructor(config) {
8
+ if (!config.base_url)
9
+ throw new ConfigurationError("AdminClient: base_url is required");
10
+ if (!config.realm_id)
11
+ throw new ConfigurationError("AdminClient: realm_id is required");
12
+ if (!config.access_token)
13
+ throw new ConfigurationError("AdminClient: access_token is required");
14
+ this.baseUrl = config.base_url.replace(/\/$/, "");
15
+ this.realmId = config.realm_id;
16
+ this.accessToken = config.access_token;
17
+ }
18
+ get authHeaders() {
19
+ return {
20
+ "Authorization": `Bearer ${this.accessToken}`,
21
+ "X-Realm-ID": this.realmId,
22
+ "Content-Type": "application/json",
23
+ };
24
+ }
25
+ buildUrl(path, params) {
26
+ const url = new URL(`${this.baseUrl}${path}`);
27
+ if (params?.limit !== undefined)
28
+ url.searchParams.set("limit", String(params.limit));
29
+ if (params?.cursor !== undefined)
30
+ url.searchParams.set("cursor", params.cursor);
31
+ return url.toString();
32
+ }
33
+ async request(method, url, body) {
34
+ const init = {
35
+ method,
36
+ headers: this.authHeaders,
37
+ };
38
+ if (body !== undefined) {
39
+ init.body = JSON.stringify(body);
40
+ }
41
+ const res = await fetch(url, init);
42
+ if (!res.ok) {
43
+ let message = `Admin API error: HTTP ${res.status}`;
44
+ try {
45
+ const json = (await res.json());
46
+ if (json.error && typeof json.error === "string")
47
+ message = json.error;
48
+ }
49
+ catch {
50
+ // ignore parse failure
51
+ }
52
+ throw new AdminHttpError(res.status, message);
53
+ }
54
+ if (res.status === 204)
55
+ return {};
56
+ return res.json();
57
+ }
58
+ // ── Users ──────────────────────────────────────────────────────────────────
59
+ /** Create a new user in the realm. */
60
+ async createUser(params) {
61
+ return this.request("POST", this.buildUrl("/admin/users"), params);
62
+ }
63
+ /** Get a user by ID. */
64
+ async getUser(id) {
65
+ return this.request("GET", this.buildUrl(`/admin/users/${id}`));
66
+ }
67
+ /** Update a user by ID. */
68
+ async updateUser(id, params) {
69
+ return this.request("PATCH", this.buildUrl(`/admin/users/${id}`), params);
70
+ }
71
+ /** Delete a user by ID. */
72
+ async deleteUser(id) {
73
+ await this.request("DELETE", this.buildUrl(`/admin/users/${id}`));
74
+ }
75
+ /** List users with optional pagination. */
76
+ async listUsers(options) {
77
+ const url = options ? this.buildUrl("/admin/users", options) : `${this.baseUrl}/admin/users`;
78
+ return this.request("GET", url);
79
+ }
80
+ // ── Realms ─────────────────────────────────────────────────────────────────
81
+ /** Create a new realm. */
82
+ async createRealm(params) {
83
+ return this.request("POST", this.buildUrl("/admin/realms"), params);
84
+ }
85
+ /** Get a realm by ID. */
86
+ async getRealm(id) {
87
+ return this.request("GET", this.buildUrl(`/admin/realms/${id}`));
88
+ }
89
+ /** Update a realm by ID. */
90
+ async updateRealm(id, params) {
91
+ return this.request("PATCH", this.buildUrl(`/admin/realms/${id}`), params);
92
+ }
93
+ /** Delete a realm by ID. */
94
+ async deleteRealm(id) {
95
+ await this.request("DELETE", this.buildUrl(`/admin/realms/${id}`));
96
+ }
97
+ /** List realms with optional pagination. */
98
+ async listRealms(options) {
99
+ const url = options ? this.buildUrl("/admin/realms", options) : `${this.baseUrl}/admin/realms`;
100
+ return this.request("GET", url);
101
+ }
102
+ // ── OAuth Clients ──────────────────────────────────────────────────────────
103
+ /** Create an OAuth 2.0 client registration. */
104
+ async createClient(params) {
105
+ return this.request("POST", this.buildUrl("/admin/clients"), params);
106
+ }
107
+ /** Get an OAuth client by ID. */
108
+ async getClient(id) {
109
+ return this.request("GET", this.buildUrl(`/admin/clients/${id}`));
110
+ }
111
+ /** Update an OAuth client by ID. */
112
+ async updateClient(id, params) {
113
+ return this.request("PATCH", this.buildUrl(`/admin/clients/${id}`), params);
114
+ }
115
+ /** Delete an OAuth client by ID. */
116
+ async deleteClient(id) {
117
+ await this.request("DELETE", this.buildUrl(`/admin/clients/${id}`));
118
+ }
119
+ /** List OAuth clients with optional pagination. */
120
+ async listClients(options) {
121
+ const url = options ? this.buildUrl("/admin/clients", options) : `${this.baseUrl}/admin/clients`;
122
+ return this.request("GET", url);
123
+ }
124
+ // ── Roles ──────────────────────────────────────────────────────────────────
125
+ /** Create a role in the realm. */
126
+ async createRole(params) {
127
+ return this.request("POST", this.buildUrl("/admin/roles"), params);
128
+ }
129
+ /** Get a role by ID. */
130
+ async getRole(id) {
131
+ return this.request("GET", this.buildUrl(`/admin/roles/${id}`));
132
+ }
133
+ /** Update a role by ID. */
134
+ async updateRole(id, params) {
135
+ return this.request("PATCH", this.buildUrl(`/admin/roles/${id}`), params);
136
+ }
137
+ /** Delete a role by ID. */
138
+ async deleteRole(id) {
139
+ await this.request("DELETE", this.buildUrl(`/admin/roles/${id}`));
140
+ }
141
+ /** List roles with optional pagination. */
142
+ async listRoles(options) {
143
+ const url = options ? this.buildUrl("/admin/roles", options) : `${this.baseUrl}/admin/roles`;
144
+ return this.request("GET", url);
145
+ }
146
+ // ── Groups ─────────────────────────────────────────────────────────────────
147
+ /** Create a group in the realm. */
148
+ async createGroup(params) {
149
+ return this.request("POST", this.buildUrl("/admin/groups"), params);
150
+ }
151
+ /** Get a group by ID. */
152
+ async getGroup(id) {
153
+ return this.request("GET", this.buildUrl(`/admin/groups/${id}`));
154
+ }
155
+ /** Update a group by ID. */
156
+ async updateGroup(id, params) {
157
+ return this.request("PATCH", this.buildUrl(`/admin/groups/${id}`), params);
158
+ }
159
+ /** Delete a group by ID. */
160
+ async deleteGroup(id) {
161
+ await this.request("DELETE", this.buildUrl(`/admin/groups/${id}`));
162
+ }
163
+ /** List groups with optional pagination. */
164
+ async listGroups(options) {
165
+ const url = options ? this.buildUrl("/admin/groups", options) : `${this.baseUrl}/admin/groups`;
166
+ return this.request("GET", url);
167
+ }
168
+ // ── Organization Memberships ───────────────────────────────────────────────
169
+ /** Add a member to an organization. */
170
+ async addOrgMember(orgId, params) {
171
+ return this.request("POST", this.buildUrl(`/admin/orgs/${orgId}/members`), params);
172
+ }
173
+ /** List members of an organization. */
174
+ async listOrgMembers(orgId, options) {
175
+ const path = `/admin/orgs/${orgId}/members`;
176
+ const url = options ? this.buildUrl(path, options) : `${this.baseUrl}${path}`;
177
+ return this.request("GET", url);
178
+ }
179
+ /** Remove a member from an organization. */
180
+ async removeOrgMember(orgId, userId) {
181
+ await this.request("DELETE", this.buildUrl(`/admin/orgs/${orgId}/members/${userId}`));
182
+ }
183
+ }
184
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../src/admin.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAqBjE,MAAM,OAAO,WAAW;IACL,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,WAAW,CAAS;IAErC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,kBAAkB,CAAC,mCAAmC,CAAC,CAAC;QACxF,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,kBAAkB,CAAC,mCAAmC,CAAC,CAAC;QACxF,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,MAAM,IAAI,kBAAkB,CAAC,uCAAuC,CAAC,CAAC;QAChG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;IACzC,CAAC;IAED,IAAY,WAAW;QACrB,OAAO;YACL,eAAe,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;YAC7C,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,MAAoB;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,GAAW,EAAE,IAAc;QAClE,MAAM,IAAI,GAAgB;YACxB,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,WAAW;SAC1B,CAAC;QACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,OAAO,GAAG,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;gBAC3D,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;oBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;YACzE,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;YACD,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAO,CAAC;QACvC,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,sCAAsC;IACtC,KAAK,CAAC,UAAU,CAAC,MAA+B;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAA+B;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,CAAC;QAC7F,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,0BAA0B;IAC1B,KAAK,CAAC,WAAW,CAAC,MAA+B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,MAA+B;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,UAAU,CAAC,OAAqB;QACpC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,eAAe,CAAC;QAC/F,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,+CAA+C;IAC/C,KAAK,CAAC,YAAY,CAAC,MAA+B;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,MAA+B;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,WAAW,CAAC,OAAqB;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,gBAAgB,CAAC;QACjG,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,kCAAkC;IAClC,KAAK,CAAC,UAAU,CAAC,MAA+B;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,MAA+B;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,CAAC;QAC7F,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,mCAAmC;IACnC,KAAK,CAAC,WAAW,CAAC,MAA+B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,MAA+B;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,UAAU,CAAC,OAAqB;QACpC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,eAAe,CAAC;QAC/F,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,uCAAuC;IACvC,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,MAA+B;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IACrF,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,OAAqB;QACvD,MAAM,IAAI,GAAG,eAAe,KAAK,UAAU,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,MAAc;QACjD,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=admin.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.test.d.ts","sourceRoot":"","sources":["../src/admin.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,239 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { AdminClient } from "./admin.js";
3
+ const BASE_ADMIN_CONFIG = {
4
+ base_url: "https://auth.example.com",
5
+ realm_id: "realm_abc123",
6
+ access_token: "admin-token-xyz",
7
+ };
8
+ function mockFetch(response, status = 200) {
9
+ return vi.fn().mockResolvedValue({
10
+ ok: status >= 200 && status < 300,
11
+ status,
12
+ json: async () => response,
13
+ text: async () => JSON.stringify(response),
14
+ });
15
+ }
16
+ describe("AdminClient — construction", () => {
17
+ it("can be instantiated with required params", () => {
18
+ const client = new AdminClient(BASE_ADMIN_CONFIG);
19
+ expect(client).toBeInstanceOf(AdminClient);
20
+ });
21
+ it("throws ConfigurationError when base_url is missing", () => {
22
+ expect(() => new AdminClient({ ...BASE_ADMIN_CONFIG, base_url: "" })).toThrow();
23
+ });
24
+ it("throws ConfigurationError when realm_id is missing", () => {
25
+ expect(() => new AdminClient({ ...BASE_ADMIN_CONFIG, realm_id: "" })).toThrow();
26
+ });
27
+ it("throws ConfigurationError when access_token is missing", () => {
28
+ expect(() => new AdminClient({ ...BASE_ADMIN_CONFIG, access_token: "" })).toThrow();
29
+ });
30
+ });
31
+ describe("AdminClient — Users CRUD", () => {
32
+ let client;
33
+ let fetchSpy;
34
+ beforeEach(() => {
35
+ client = new AdminClient(BASE_ADMIN_CONFIG);
36
+ fetchSpy = vi.fn();
37
+ vi.stubGlobal("fetch", fetchSpy);
38
+ });
39
+ afterEach(() => {
40
+ vi.unstubAllGlobals();
41
+ });
42
+ it("createUser sends POST /admin/users with correct headers", async () => {
43
+ fetchSpy.mockResolvedValue({ ok: true, status: 201, json: async () => ({ id: "usr_1", email: "alice@example.com" }) });
44
+ const result = await client.createUser({ email: "alice@example.com", password: "secret" });
45
+ expect(fetchSpy).toHaveBeenCalledOnce();
46
+ const [url, init] = fetchSpy.mock.calls[0];
47
+ expect(url).toBe("https://auth.example.com/admin/users");
48
+ expect(init.method).toBe("POST");
49
+ const headers = init.headers;
50
+ expect(headers["Authorization"]).toBe("Bearer admin-token-xyz");
51
+ expect(headers["X-Realm-ID"]).toBe("realm_abc123");
52
+ expect(result).toMatchObject({ id: "usr_1" });
53
+ });
54
+ it("getUser sends GET /admin/users/{id}", async () => {
55
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ id: "usr_1", email: "alice@example.com" }) });
56
+ const result = await client.getUser("usr_1");
57
+ const [url, init] = fetchSpy.mock.calls[0];
58
+ expect(url).toBe("https://auth.example.com/admin/users/usr_1");
59
+ expect(init.method).toBe("GET");
60
+ expect(result).toMatchObject({ id: "usr_1" });
61
+ });
62
+ it("updateUser sends PATCH /admin/users/{id}", async () => {
63
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ id: "usr_1", email: "newemail@example.com" }) });
64
+ await client.updateUser("usr_1", { email: "newemail@example.com" });
65
+ const [url, init] = fetchSpy.mock.calls[0];
66
+ expect(url).toBe("https://auth.example.com/admin/users/usr_1");
67
+ expect(init.method).toBe("PATCH");
68
+ });
69
+ it("deleteUser sends DELETE /admin/users/{id}", async () => {
70
+ fetchSpy.mockResolvedValue({ ok: true, status: 204, json: async () => ({}) });
71
+ await client.deleteUser("usr_1");
72
+ const [url, init] = fetchSpy.mock.calls[0];
73
+ expect(url).toBe("https://auth.example.com/admin/users/usr_1");
74
+ expect(init.method).toBe("DELETE");
75
+ });
76
+ it("listUsers sends GET /admin/users with pagination params", async () => {
77
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
78
+ const result = await client.listUsers({ limit: 10, cursor: "next-page-token" });
79
+ const [url] = fetchSpy.mock.calls[0];
80
+ expect(url).toContain("/admin/users");
81
+ expect(url).toContain("limit=10");
82
+ expect(url).toContain("cursor=next-page-token");
83
+ expect(result).toMatchObject({ items: [] });
84
+ });
85
+ it("listUsers without options omits pagination params", async () => {
86
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
87
+ await client.listUsers();
88
+ const [url] = fetchSpy.mock.calls[0];
89
+ expect(url).toBe("https://auth.example.com/admin/users");
90
+ });
91
+ });
92
+ describe("AdminClient — Realms CRUD", () => {
93
+ let client;
94
+ let fetchSpy;
95
+ beforeEach(() => {
96
+ client = new AdminClient(BASE_ADMIN_CONFIG);
97
+ fetchSpy = vi.fn();
98
+ vi.stubGlobal("fetch", fetchSpy);
99
+ });
100
+ afterEach(() => {
101
+ vi.unstubAllGlobals();
102
+ });
103
+ it("createRealm sends POST /admin/realms", async () => {
104
+ fetchSpy.mockResolvedValue({ ok: true, status: 201, json: async () => ({ id: "realm_new", name: "Test Realm" }) });
105
+ const result = await client.createRealm({ name: "Test Realm" });
106
+ const [url, init] = fetchSpy.mock.calls[0];
107
+ expect(url).toBe("https://auth.example.com/admin/realms");
108
+ expect(init.method).toBe("POST");
109
+ expect(result).toMatchObject({ id: "realm_new" });
110
+ });
111
+ it("getRealm sends GET /admin/realms/{id}", async () => {
112
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ id: "realm_1" }) });
113
+ await client.getRealm("realm_1");
114
+ const [url] = fetchSpy.mock.calls[0];
115
+ expect(url).toBe("https://auth.example.com/admin/realms/realm_1");
116
+ });
117
+ it("updateRealm sends PATCH /admin/realms/{id}", async () => {
118
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ id: "realm_1" }) });
119
+ await client.updateRealm("realm_1", { name: "Updated" });
120
+ const [url, init] = fetchSpy.mock.calls[0];
121
+ expect(url).toBe("https://auth.example.com/admin/realms/realm_1");
122
+ expect(init.method).toBe("PATCH");
123
+ });
124
+ it("deleteRealm sends DELETE /admin/realms/{id}", async () => {
125
+ fetchSpy.mockResolvedValue({ ok: true, status: 204, json: async () => ({}) });
126
+ await client.deleteRealm("realm_1");
127
+ const [url, init] = fetchSpy.mock.calls[0];
128
+ expect(url).toBe("https://auth.example.com/admin/realms/realm_1");
129
+ expect(init.method).toBe("DELETE");
130
+ });
131
+ it("listRealms sends GET /admin/realms", async () => {
132
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
133
+ const result = await client.listRealms();
134
+ const [url] = fetchSpy.mock.calls[0];
135
+ expect(url).toBe("https://auth.example.com/admin/realms");
136
+ expect(result).toMatchObject({ items: [] });
137
+ });
138
+ });
139
+ describe("AdminClient — Clients, Roles, Groups, OrgMembers", () => {
140
+ let client;
141
+ let fetchSpy;
142
+ beforeEach(() => {
143
+ client = new AdminClient(BASE_ADMIN_CONFIG);
144
+ fetchSpy = vi.fn();
145
+ vi.stubGlobal("fetch", fetchSpy);
146
+ });
147
+ afterEach(() => {
148
+ vi.unstubAllGlobals();
149
+ });
150
+ it("createClient sends POST /admin/clients", async () => {
151
+ fetchSpy.mockResolvedValue({ ok: true, status: 201, json: async () => ({ client_id: "cli_1" }) });
152
+ await client.createClient({ client_id: "my-app", client_name: "My App" });
153
+ const [url, init] = fetchSpy.mock.calls[0];
154
+ expect(url).toBe("https://auth.example.com/admin/clients");
155
+ expect(init.method).toBe("POST");
156
+ });
157
+ it("listClients sends GET /admin/clients", async () => {
158
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
159
+ await client.listClients();
160
+ const [url] = fetchSpy.mock.calls[0];
161
+ expect(url).toBe("https://auth.example.com/admin/clients");
162
+ });
163
+ it("createRole sends POST /admin/roles", async () => {
164
+ fetchSpy.mockResolvedValue({ ok: true, status: 201, json: async () => ({ id: "role_1", name: "editor" }) });
165
+ await client.createRole({ name: "editor" });
166
+ const [url, init] = fetchSpy.mock.calls[0];
167
+ expect(url).toBe("https://auth.example.com/admin/roles");
168
+ expect(init.method).toBe("POST");
169
+ });
170
+ it("listRoles sends GET /admin/roles", async () => {
171
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
172
+ await client.listRoles();
173
+ const [url] = fetchSpy.mock.calls[0];
174
+ expect(url).toBe("https://auth.example.com/admin/roles");
175
+ });
176
+ it("createGroup sends POST /admin/groups", async () => {
177
+ fetchSpy.mockResolvedValue({ ok: true, status: 201, json: async () => ({ id: "grp_1", name: "engineers" }) });
178
+ await client.createGroup({ name: "engineers" });
179
+ const [url, init] = fetchSpy.mock.calls[0];
180
+ expect(url).toBe("https://auth.example.com/admin/groups");
181
+ expect(init.method).toBe("POST");
182
+ });
183
+ it("listGroups sends GET /admin/groups", async () => {
184
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
185
+ await client.listGroups();
186
+ const [url] = fetchSpy.mock.calls[0];
187
+ expect(url).toBe("https://auth.example.com/admin/groups");
188
+ });
189
+ it("addOrgMember sends POST /admin/orgs/{orgId}/members", async () => {
190
+ fetchSpy.mockResolvedValue({ ok: true, status: 201, json: async () => ({}) });
191
+ await client.addOrgMember("org_1", { user_id: "usr_1", role: "member" });
192
+ const [url, init] = fetchSpy.mock.calls[0];
193
+ expect(url).toBe("https://auth.example.com/admin/orgs/org_1/members");
194
+ expect(init.method).toBe("POST");
195
+ });
196
+ it("listOrgMembers sends GET /admin/orgs/{orgId}/members", async () => {
197
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
198
+ await client.listOrgMembers("org_1");
199
+ const [url] = fetchSpy.mock.calls[0];
200
+ expect(url).toBe("https://auth.example.com/admin/orgs/org_1/members");
201
+ });
202
+ it("removeOrgMember sends DELETE /admin/orgs/{orgId}/members/{userId}", async () => {
203
+ fetchSpy.mockResolvedValue({ ok: true, status: 204, json: async () => ({}) });
204
+ await client.removeOrgMember("org_1", "usr_1");
205
+ const [url, init] = fetchSpy.mock.calls[0];
206
+ expect(url).toBe("https://auth.example.com/admin/orgs/org_1/members/usr_1");
207
+ expect(init.method).toBe("DELETE");
208
+ });
209
+ });
210
+ describe("AdminClient — error handling", () => {
211
+ let client;
212
+ let fetchSpy;
213
+ beforeEach(() => {
214
+ client = new AdminClient(BASE_ADMIN_CONFIG);
215
+ fetchSpy = vi.fn();
216
+ vi.stubGlobal("fetch", fetchSpy);
217
+ });
218
+ afterEach(() => {
219
+ vi.unstubAllGlobals();
220
+ });
221
+ it("throws an error with status code on 403 Forbidden", async () => {
222
+ fetchSpy.mockResolvedValue({ ok: false, status: 403, json: async () => ({ error: "forbidden" }) });
223
+ await expect(client.getUser("usr_1")).rejects.toThrow();
224
+ await expect(client.getUser("usr_1")).rejects.toMatchObject({ status: 403 });
225
+ });
226
+ it("throws an error with status code on 404 Not Found", async () => {
227
+ fetchSpy.mockResolvedValue({ ok: false, status: 404, json: async () => ({ error: "not_found" }) });
228
+ await expect(client.getUser("nonexistent")).rejects.toMatchObject({ status: 404 });
229
+ });
230
+ it("always sends Authorization and X-Realm-ID headers", async () => {
231
+ fetchSpy.mockResolvedValue({ ok: true, status: 200, json: async () => ({ items: [], next_cursor: null }) });
232
+ await client.listUsers();
233
+ const [, init] = fetchSpy.mock.calls[0];
234
+ const headers = init.headers;
235
+ expect(headers["Authorization"]).toBe("Bearer admin-token-xyz");
236
+ expect(headers["X-Realm-ID"]).toBe("realm_abc123");
237
+ });
238
+ });
239
+ //# sourceMappingURL=admin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.test.js","sourceRoot":"","sources":["../src/admin.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /** §7 — AuthorizeClient: per-request permission decisions via POST /oauth/authorize. */
2
+ import type { ResolvedConfig } from "./config.js";
3
+ export interface AuthorizeOptions {
4
+ /** Optional org-scoped permission check. */
5
+ organization_id?: string;
6
+ /** Optional RFC 8707 resource URI for audience-scoped checks. */
7
+ resource?: string;
8
+ }
9
+ export interface AuthorizeResult {
10
+ /** Whether the token holder has the requested permission. */
11
+ allowed: boolean;
12
+ }
13
+ /**
14
+ * Calls `POST /oauth/authorize` to make a per-request permission decision.
15
+ *
16
+ * This client is fail-closed: network errors and non-OK responses return
17
+ * `{ allowed: false }` rather than throwing, so middleware cannot accidentally
18
+ * grant access on infrastructure failures.
19
+ *
20
+ * Misconfiguration (no endpoint) throws `AuthorizeError` before any network call.
21
+ */
22
+ export declare class AuthorizeClient {
23
+ private readonly endpoint;
24
+ private readonly realmId;
25
+ private readonly timeout;
26
+ constructor(config: ResolvedConfig);
27
+ /**
28
+ * Check whether the bearer token holder has `permission`.
29
+ *
30
+ * Fail-closed: returns `{ allowed: false }` on any network or server error.
31
+ * Throws `AuthorizeError` only when the endpoint is not configured.
32
+ */
33
+ decide(token: string, permission: string, opts?: AuthorizeOptions): Promise<AuthorizeResult>;
34
+ }
35
+ //# sourceMappingURL=authorize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorize.d.ts","sourceRoot":"","sources":["../src/authorize.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAGxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,cAAc;IAWlC;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAqCnG"}