@oneunit/auth 2.0.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 (75) hide show
  1. package/ARCHITECTURE.md +465 -0
  2. package/CHANGELOG.md +214 -0
  3. package/LICENSE +21 -0
  4. package/README.md +647 -0
  5. package/dist/adapters.d.ts +51 -0
  6. package/dist/adapters.d.ts.map +1 -0
  7. package/dist/adapters.js +301 -0
  8. package/dist/adapters.js.map +1 -0
  9. package/dist/auth.d.ts +59 -0
  10. package/dist/auth.d.ts.map +1 -0
  11. package/dist/auth.js +560 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/errors.d.ts +39 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +65 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/index.d.ts +11 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +10 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jwt.d.ts +11 -0
  22. package/dist/jwt.d.ts.map +1 -0
  23. package/dist/jwt.js +125 -0
  24. package/dist/jwt.js.map +1 -0
  25. package/dist/oauth.d.ts +31 -0
  26. package/dist/oauth.d.ts.map +1 -0
  27. package/dist/oauth.js +178 -0
  28. package/dist/oauth.js.map +1 -0
  29. package/dist/password.d.ts +5 -0
  30. package/dist/password.d.ts.map +1 -0
  31. package/dist/password.js +90 -0
  32. package/dist/password.js.map +1 -0
  33. package/dist/providers.d.ts +37 -0
  34. package/dist/providers.d.ts.map +1 -0
  35. package/dist/providers.js +471 -0
  36. package/dist/providers.js.map +1 -0
  37. package/dist/rbac.d.ts +40 -0
  38. package/dist/rbac.d.ts.map +1 -0
  39. package/dist/rbac.js +240 -0
  40. package/dist/rbac.js.map +1 -0
  41. package/dist/roles.d.ts +2 -0
  42. package/dist/roles.d.ts.map +1 -0
  43. package/dist/roles.js +2 -0
  44. package/dist/roles.js.map +1 -0
  45. package/dist/token.d.ts +2 -0
  46. package/dist/token.d.ts.map +1 -0
  47. package/dist/token.js +2 -0
  48. package/dist/token.js.map +1 -0
  49. package/dist/types.d.ts +383 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/dist/utils.d.ts +35 -0
  54. package/dist/utils.d.ts.map +1 -0
  55. package/dist/utils.js +192 -0
  56. package/dist/utils.js.map +1 -0
  57. package/examples/express.ts +111 -0
  58. package/examples/fastify.ts +59 -0
  59. package/examples/oauth-social.ts +83 -0
  60. package/examples/standalone.ts +67 -0
  61. package/examples/uwebsockets.ts +143 -0
  62. package/package.json +86 -0
  63. package/src/adapters.ts +333 -0
  64. package/src/auth.ts +684 -0
  65. package/src/errors.ts +76 -0
  66. package/src/index.ts +124 -0
  67. package/src/jwt.ts +159 -0
  68. package/src/oauth.ts +226 -0
  69. package/src/password.ts +111 -0
  70. package/src/providers.ts +551 -0
  71. package/src/rbac.ts +285 -0
  72. package/src/roles.ts +1 -0
  73. package/src/token.ts +1 -0
  74. package/src/types.ts +432 -0
  75. package/src/utils.ts +231 -0
package/dist/rbac.js ADDED
@@ -0,0 +1,240 @@
1
+ import { ForbiddenError, ValidationError } from "./errors.js";
2
+ import { isPlainObject, toArray, unique } from "./utils.js";
3
+ function normalizeName(value) {
4
+ return String(value).trim();
5
+ }
6
+ function asSet(values) {
7
+ return new Set(unique(toArray(values).map((item) => normalizeName(item)).filter(Boolean)));
8
+ }
9
+ export class RBAC {
10
+ roles = new Map();
11
+ permissions = new Set();
12
+ rolePermissions = new Map();
13
+ roleParents = new Map();
14
+ defaultRole;
15
+ constructor(options = {}) {
16
+ this.defaultRole = options.defaultRole ?? null;
17
+ if (Array.isArray(options.permissions)) {
18
+ for (const permission of options.permissions) {
19
+ this.addPermission(permission);
20
+ }
21
+ }
22
+ if (isPlainObject(options.roles)) {
23
+ for (const [role, config] of Object.entries(options.roles)) {
24
+ this.addRole(role, config);
25
+ }
26
+ }
27
+ else if (Array.isArray(options.roles)) {
28
+ for (const role of options.roles) {
29
+ this.addRole(role);
30
+ }
31
+ }
32
+ }
33
+ addPermission(permission) {
34
+ const name = normalizeName(permission);
35
+ if (!name) {
36
+ throw new ValidationError("Permission name is required");
37
+ }
38
+ this.permissions.add(name);
39
+ return this;
40
+ }
41
+ addRole(role, config = {}) {
42
+ const name = normalizeName(typeof role === "string" ? role : role?.name);
43
+ if (!name) {
44
+ throw new ValidationError("Role name is required");
45
+ }
46
+ const definition = isPlainObject(config) ? config : {};
47
+ const permissions = asSet(definition.permissions ?? definition.perms);
48
+ const inherits = unique(toArray(definition.inherits ?? definition.parents ?? definition.parent).map(normalizeName).filter(Boolean));
49
+ for (const permission of permissions) {
50
+ this.permissions.add(permission);
51
+ }
52
+ this.roles.set(name, {
53
+ name,
54
+ description: typeof definition.description === "string" ? definition.description : "",
55
+ });
56
+ this.rolePermissions.set(name, new Set([
57
+ ...(this.rolePermissions.get(name) ?? []),
58
+ ...permissions,
59
+ ]));
60
+ this.roleParents.set(name, unique([
61
+ ...(this.roleParents.get(name) ?? []),
62
+ ...inherits,
63
+ ]));
64
+ return this;
65
+ }
66
+ grant(role, permissions) {
67
+ const name = this.requireRole(role);
68
+ const granted = asSet(permissions);
69
+ const current = this.rolePermissions.get(name) ?? new Set();
70
+ for (const permission of granted) {
71
+ this.permissions.add(permission);
72
+ current.add(permission);
73
+ }
74
+ this.rolePermissions.set(name, current);
75
+ return this;
76
+ }
77
+ revoke(role, permissions) {
78
+ const name = this.requireRole(role);
79
+ const current = this.rolePermissions.get(name) ?? new Set();
80
+ for (const permission of asSet(permissions)) {
81
+ current.delete(permission);
82
+ }
83
+ this.rolePermissions.set(name, current);
84
+ return this;
85
+ }
86
+ inherit(role, parents) {
87
+ const name = this.requireRole(role);
88
+ const next = unique([
89
+ ...(this.roleParents.get(name) ?? []),
90
+ ...toArray(parents).map(normalizeName).filter(Boolean),
91
+ ]);
92
+ this.roleParents.set(name, next);
93
+ return this;
94
+ }
95
+ hasRole(role) {
96
+ return this.roles.has(normalizeName(role));
97
+ }
98
+ requireRole(role) {
99
+ const name = normalizeName(role);
100
+ if (!this.roles.has(name)) {
101
+ throw new ValidationError(`Unknown role: ${role}`);
102
+ }
103
+ return name;
104
+ }
105
+ getRoles() {
106
+ return [...this.roles.keys()];
107
+ }
108
+ getPermissions(role) {
109
+ if (role === undefined) {
110
+ return [...this.permissions];
111
+ }
112
+ return [...this.resolvePermissions(role)];
113
+ }
114
+ resolveParents(role, seen = new Set()) {
115
+ const name = normalizeName(role);
116
+ if (!this.roles.has(name) || seen.has(name)) {
117
+ return [];
118
+ }
119
+ seen.add(name);
120
+ const parents = [];
121
+ for (const parent of this.roleParents.get(name) ?? []) {
122
+ parents.push(parent, ...this.resolveParents(parent, seen));
123
+ }
124
+ return unique(parents);
125
+ }
126
+ resolvePermissions(role) {
127
+ const name = normalizeName(role);
128
+ const resolved = new Set(this.rolePermissions.get(name) ?? []);
129
+ for (const parent of this.resolveParents(name)) {
130
+ for (const permission of this.rolePermissions.get(parent) ?? []) {
131
+ resolved.add(permission);
132
+ }
133
+ }
134
+ return resolved;
135
+ }
136
+ subjectRoles(subject) {
137
+ if (!subject) {
138
+ return this.defaultRole ? [this.defaultRole] : [];
139
+ }
140
+ if (typeof subject === "string") {
141
+ return [normalizeName(subject)];
142
+ }
143
+ const roles = unique([
144
+ ...toArray(subject.roles),
145
+ ...toArray(subject.role),
146
+ ].map(normalizeName).filter(Boolean));
147
+ if (roles.length === 0 && this.defaultRole) {
148
+ return [this.defaultRole];
149
+ }
150
+ return roles;
151
+ }
152
+ subjectPermissions(subject) {
153
+ const record = typeof subject === "object" && subject ? subject : undefined;
154
+ const direct = asSet(record?.permissions);
155
+ const resolved = new Set(direct);
156
+ for (const role of this.subjectRoles(subject)) {
157
+ for (const permission of this.resolvePermissions(role)) {
158
+ resolved.add(permission);
159
+ }
160
+ }
161
+ return resolved;
162
+ }
163
+ can(subject, permission) {
164
+ if (!permission) {
165
+ return false;
166
+ }
167
+ const needed = asSet(permission);
168
+ const owned = this.subjectPermissions(subject);
169
+ for (const item of needed) {
170
+ if (owned.has(item) || owned.has("*")) {
171
+ continue;
172
+ }
173
+ if (![...owned].some((granted) => matchPermission(granted, item))) {
174
+ return false;
175
+ }
176
+ }
177
+ return needed.size > 0;
178
+ }
179
+ cannot(subject, permission) {
180
+ return !this.can(subject, permission);
181
+ }
182
+ authorize(subject, permission) {
183
+ if (!this.can(subject, permission)) {
184
+ throw new ForbiddenError(`Missing permission: ${toArray(permission).join(", ")}`);
185
+ }
186
+ return true;
187
+ }
188
+ hasAnyRole(subject, roles) {
189
+ const owned = new Set(this.subjectRoles(subject));
190
+ return toArray(roles).some((role) => owned.has(normalizeName(role)));
191
+ }
192
+ hasAllRoles(subject, roles) {
193
+ const owned = new Set(this.subjectRoles(subject));
194
+ const needed = toArray(roles).map(normalizeName).filter(Boolean);
195
+ return needed.length > 0 && needed.every((role) => owned.has(role));
196
+ }
197
+ snapshot() {
198
+ const roles = {};
199
+ for (const name of this.roles.keys()) {
200
+ roles[name] = {
201
+ description: this.roles.get(name)?.description ?? "",
202
+ permissions: [...(this.rolePermissions.get(name) ?? [])],
203
+ inherits: [...(this.roleParents.get(name) ?? [])],
204
+ };
205
+ }
206
+ return {
207
+ defaultRole: this.defaultRole,
208
+ permissions: [...this.permissions],
209
+ roles,
210
+ };
211
+ }
212
+ }
213
+ export function matchPermission(granted, needed) {
214
+ if (granted === needed || granted === "*") {
215
+ return true;
216
+ }
217
+ if (!granted.includes("*")) {
218
+ return false;
219
+ }
220
+ // A `**` segment spans any depth ("posts.**" matches "posts.a.b"), while a `*`
221
+ // segment stays within one level ("posts.*" matches "posts.create" only).
222
+ const pattern = granted
223
+ .split(".")
224
+ .map((part) => {
225
+ if (part === "**")
226
+ return ".*";
227
+ if (part === "*")
228
+ return "[^.]+";
229
+ return part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
230
+ })
231
+ .join("\\.");
232
+ return new RegExp(`^${pattern}$`).test(needed);
233
+ }
234
+ export function createRBAC(options = {}) {
235
+ return new RBAC(options);
236
+ }
237
+ export function defineRoles(roles) {
238
+ return createRBAC({ roles });
239
+ }
240
+ //# sourceMappingURL=rbac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac.js","sourceRoot":"","sources":["../src/rbac.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { RBAC, createRBAC, defineRoles, matchPermission } from "./rbac.js";
2
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
package/dist/roles.js ADDED
@@ -0,0 +1,2 @@
1
+ export { RBAC, createRBAC, defineRoles, matchPermission } from "./rbac.js";
2
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { encode, decode, decodeUnsafe, encodeAccessToken, encodeRefreshToken } from "./jwt.js";
2
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
package/dist/token.js ADDED
@@ -0,0 +1,2 @@
1
+ export { encode, decode, decodeUnsafe, encodeAccessToken, encodeRefreshToken } from "./jwt.js";
2
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../src/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,383 @@
1
+ export interface AuthErrorOptions {
2
+ code?: string;
3
+ status?: number;
4
+ cause?: unknown;
5
+ }
6
+ export interface JwtSignOptions {
7
+ expiresIn?: string | number;
8
+ expiresInSeconds?: number;
9
+ subject?: string | number;
10
+ audience?: string | string[];
11
+ issuer?: string;
12
+ jwtid?: string;
13
+ notBefore?: string | number;
14
+ header?: Record<string, unknown>;
15
+ algorithm?: string;
16
+ keyid?: string;
17
+ }
18
+ export interface JwtVerifyOptions {
19
+ algorithms?: string[];
20
+ audience?: string | string[];
21
+ issuer?: string;
22
+ subject?: string;
23
+ clockTolerance?: number;
24
+ ignoreExpiration?: boolean;
25
+ complete?: boolean;
26
+ /**
27
+ * Token `typ` to accept. Access tokens are rejected when set to "refresh" so a
28
+ * long-lived refresh token cannot be replayed as a bearer credential.
29
+ */
30
+ acceptTokenType?: "access" | "refresh";
31
+ }
32
+ export type JwtPayload = Record<string, unknown> & {
33
+ sub?: string;
34
+ iat?: number;
35
+ exp?: number;
36
+ nbf?: number;
37
+ aud?: string | string[];
38
+ iss?: string;
39
+ jti?: string;
40
+ typ?: string;
41
+ userId?: string | number;
42
+ email?: string;
43
+ username?: string;
44
+ name?: string;
45
+ roles?: string[];
46
+ permissions?: string[];
47
+ };
48
+ export type Secret = string | Buffer;
49
+ export interface RoleDefinition {
50
+ name?: string;
51
+ description?: string;
52
+ permissions?: string | string[];
53
+ perms?: string | string[];
54
+ inherits?: string | string[];
55
+ parents?: string | string[];
56
+ parent?: string | string[];
57
+ }
58
+ export interface StoredRole {
59
+ name: string;
60
+ description: string;
61
+ }
62
+ export interface RBACOptions {
63
+ defaultRole?: string | null;
64
+ permissions?: string[];
65
+ roles?: Record<string, RoleDefinition> | Array<string | RoleDefinition>;
66
+ }
67
+ export interface AuthSubject {
68
+ id?: string | number;
69
+ role?: string;
70
+ roles?: string | string[];
71
+ permissions?: string | string[];
72
+ [key: string]: unknown;
73
+ }
74
+ export interface PasswordOptions {
75
+ saltBytes?: number;
76
+ keyLength?: number;
77
+ cost?: number;
78
+ blockSize?: number;
79
+ parallelism?: number;
80
+ salt?: string | Buffer;
81
+ }
82
+ export interface OAuthProfile {
83
+ provider?: string;
84
+ id?: string | number;
85
+ email?: string;
86
+ emailVerified?: boolean;
87
+ username?: string;
88
+ name?: string;
89
+ firstName?: string;
90
+ lastName?: string;
91
+ avatar?: string;
92
+ profileUrl?: string;
93
+ locale?: string;
94
+ raw?: unknown;
95
+ [key: string]: unknown;
96
+ }
97
+ export interface OAuthTokens {
98
+ access_token?: string;
99
+ refresh_token?: string;
100
+ id_token?: string;
101
+ token_type?: string;
102
+ expires_in?: number;
103
+ scope?: string;
104
+ [key: string]: unknown;
105
+ }
106
+ export type TokenAuthMethod = "body" | "basic";
107
+ export interface OAuthProviderConfig {
108
+ clientId?: string;
109
+ clientSecret?: string;
110
+ redirectUri?: string;
111
+ scopes?: string[];
112
+ pkce?: boolean;
113
+ extraAuthParams?: Record<string, unknown>;
114
+ extraTokenParams?: Record<string, unknown>;
115
+ userInfoHeaders?: Record<string, string>;
116
+ tokenAuthMethod?: TokenAuthMethod;
117
+ provider?: OAuthProvider | (Pick<OAuthProvider, "id"> & Partial<OAuthProvider>);
118
+ [key: string]: unknown;
119
+ }
120
+ export interface AuthorizationUrlOptions {
121
+ state?: string;
122
+ redirectUri?: string;
123
+ codeVerifier?: string;
124
+ extraParams?: Record<string, unknown>;
125
+ }
126
+ export interface AuthorizationUrlResult {
127
+ url: string;
128
+ state?: string;
129
+ codeVerifier?: string;
130
+ }
131
+ export interface ExchangeCodeOptions {
132
+ code?: string;
133
+ redirectUri?: string;
134
+ codeVerifier?: string;
135
+ }
136
+ export interface OAuthProvider {
137
+ id: string;
138
+ name: string;
139
+ authorizationUrl: string;
140
+ tokenUrl: string;
141
+ userInfoUrl?: string;
142
+ scopes: string[];
143
+ pkce: boolean;
144
+ tokenAuthMethod: string;
145
+ createAuthorizationUrl(config: OAuthProviderConfig, options?: AuthorizationUrlOptions): AuthorizationUrlResult;
146
+ exchangeCode(config: OAuthProviderConfig, options?: ExchangeCodeOptions): Promise<OAuthTokens>;
147
+ fetchProfile(config: OAuthProviderConfig, tokens: OAuthTokens): Promise<OAuthProfile>;
148
+ }
149
+ export type ProfileMapValue = string | ((source: Record<string, unknown>) => unknown);
150
+ export interface ProviderDefinition {
151
+ id: string;
152
+ name?: string;
153
+ authorizationUrl: string;
154
+ tokenUrl: string;
155
+ userInfoUrl?: string;
156
+ scopes?: string[];
157
+ profileMap?: Record<string, ProfileMapValue>;
158
+ tokenAuthMethod?: TokenAuthMethod;
159
+ pkce?: boolean;
160
+ extraAuthParams?: Record<string, unknown>;
161
+ extraTokenParams?: Record<string, unknown>;
162
+ userInfoHeaders?: Record<string, string>;
163
+ parseProfile?: (tokens: OAuthTokens, config: OAuthProviderConfig) => OAuthProfile | Promise<OAuthProfile>;
164
+ }
165
+ export interface StateStore {
166
+ set(key: string, value: unknown, ttlSeconds?: number): Promise<void> | void;
167
+ get(key: string): Promise<unknown> | unknown;
168
+ delete(key: string): Promise<void> | void;
169
+ }
170
+ export interface OAuthOptions {
171
+ redirectUri?: string;
172
+ stateStore?: StateStore;
173
+ providers?: Record<string, OAuthProviderConfig>;
174
+ }
175
+ export interface OAuthAuthorizeOptions {
176
+ state?: string;
177
+ redirectUri?: string;
178
+ codeVerifier?: string;
179
+ extraParams?: Record<string, unknown>;
180
+ metadata?: unknown;
181
+ ttlSeconds?: number;
182
+ }
183
+ export interface OAuthStateRecord {
184
+ provider: string;
185
+ redirectUri?: string;
186
+ codeVerifier?: string;
187
+ createdAt: number;
188
+ metadata?: unknown;
189
+ }
190
+ export interface UserRecord {
191
+ id: string | number;
192
+ email?: string;
193
+ username?: string;
194
+ name?: string;
195
+ avatar?: string;
196
+ roles?: string[];
197
+ role?: string;
198
+ permissions?: string[];
199
+ passwordHash?: string;
200
+ provider?: string;
201
+ providerId?: string | number;
202
+ [key: string]: unknown;
203
+ }
204
+ export interface UserStore {
205
+ findById?(id: string | number): Promise<UserRecord | null | undefined> | UserRecord | null | undefined;
206
+ findByEmail?(email: string): Promise<UserRecord | null | undefined> | UserRecord | null | undefined;
207
+ findByUsername?(username: string): Promise<UserRecord | null | undefined> | UserRecord | null | undefined;
208
+ findByCredentials?(identifier: string): Promise<UserRecord | null | undefined> | UserRecord | null | undefined;
209
+ findByProvider?(provider: string, providerId: string | number): Promise<UserRecord | null | undefined> | UserRecord | null | undefined;
210
+ create?(input: Record<string, unknown>): Promise<UserRecord> | UserRecord;
211
+ createFromProvider?(provider: string, profile: OAuthProfile, tokens: OAuthTokens): Promise<UserRecord> | UserRecord;
212
+ linkProvider?(userId: string | number, provider: string, profile: OAuthProfile): Promise<unknown> | unknown;
213
+ updatePassword?(userId: string | number, passwordHash: string): Promise<unknown> | unknown;
214
+ }
215
+ export interface RefreshRecord {
216
+ id: string;
217
+ userId: string | number;
218
+ tokenHash: string;
219
+ expiresAt: number;
220
+ }
221
+ export interface RefreshStore {
222
+ save(record: RefreshRecord): Promise<void> | void;
223
+ get(id: string): Promise<RefreshRecord | null | undefined> | RefreshRecord | null | undefined;
224
+ /**
225
+ * Atomically look up and remove a record. Preferred over get()+revoke(), which
226
+ * lets one refresh token be redeemed twice concurrently. When omitted, Auth
227
+ * falls back to get() followed by revoke() and requires revoke() to exist.
228
+ */
229
+ consume?(id: string): Promise<RefreshRecord | null | undefined> | RefreshRecord | null | undefined;
230
+ revoke?(id: string): Promise<void> | void;
231
+ }
232
+ export interface LoginOptions {
233
+ extractors?: string[];
234
+ additionalClaims?: Record<string, unknown>;
235
+ accessTokenTtl?: string | number;
236
+ refreshTokenTtl?: string | number;
237
+ refresh?: boolean;
238
+ roles?: string[];
239
+ }
240
+ export interface LoginResult {
241
+ token: string;
242
+ accessToken: string;
243
+ refreshToken: string | null;
244
+ payload: JwtPayload;
245
+ user: {
246
+ id: string | number;
247
+ email?: string;
248
+ username?: string;
249
+ name?: string;
250
+ roles: string[];
251
+ permissions: string[];
252
+ };
253
+ oauth?: {
254
+ provider: string;
255
+ tokens: OAuthTokens;
256
+ profile: OAuthProfile;
257
+ state: unknown;
258
+ };
259
+ }
260
+ export interface AuthOptions {
261
+ secret: Secret;
262
+ refreshSecret?: Secret;
263
+ issuer?: string;
264
+ audience?: string | string[];
265
+ algorithm?: string;
266
+ expiresIn?: string | number;
267
+ accessTokenTtl?: string | number;
268
+ refreshTokenTtl?: string | number;
269
+ clockTolerance?: number;
270
+ /**
271
+ * Copy a `permissions` array from the user record into the access token.
272
+ * Off by default: permissions should come from RBAC roles, otherwise one
273
+ * attacker-writable database field grants arbitrary access.
274
+ */
275
+ trustUserPermissions?: boolean;
276
+ userStore?: UserStore;
277
+ refreshStore?: RefreshStore;
278
+ rbac?: import("./rbac.js").RBAC | RBACOptions;
279
+ roles?: RBACOptions | Record<string, RoleDefinition> | Array<string | RoleDefinition>;
280
+ oauth?: import("./oauth.js").OAuth | OAuthOptions;
281
+ providers?: Record<string, OAuthProviderConfig>;
282
+ redirectUri?: string;
283
+ onLogin?: (result: LoginResult) => unknown;
284
+ onLink?: (event: {
285
+ user: UserRecord;
286
+ provider: string;
287
+ profile: OAuthProfile;
288
+ }) => unknown;
289
+ }
290
+ export type AuthHookName = "beforeLogin" | "afterLogin" | "afterVerify";
291
+ export type AuthHookHandler = (payload: unknown, auth: unknown) => unknown;
292
+ export interface RequestLike {
293
+ headers?: Record<string, string | string[] | undefined> | {
294
+ get?(name: string): string | null;
295
+ };
296
+ cookies?: Record<string, string>;
297
+ query?: string | Record<string, string | string[] | undefined>;
298
+ getHeader?(name: string): string;
299
+ getQuery?(): string;
300
+ forEach?(cb: (key: string, value: string) => void): void;
301
+ [key: string]: unknown;
302
+ }
303
+ export interface ExtractTokenOptions {
304
+ cookie?: string;
305
+ optional?: boolean;
306
+ passthrough?: boolean;
307
+ audience?: string | string[];
308
+ issuer?: string;
309
+ clockTolerance?: number;
310
+ acceptTokenType?: "access" | "refresh";
311
+ }
312
+ export interface UwsHttpResponse {
313
+ cork?(cb: () => void): void;
314
+ writeStatus?(status: string): this | void;
315
+ writeHeader?(key: string, value: string): this | void;
316
+ end?(body?: string | ArrayBuffer | Uint8Array): void;
317
+ onAborted?(cb: () => void): void;
318
+ [key: string]: unknown;
319
+ }
320
+ export interface UwsHttpRequest {
321
+ getHeader?(name: string): string;
322
+ getMethod?(): string;
323
+ getUrl?(): string;
324
+ getQuery?(): string;
325
+ forEach?(cb: (key: string, value: string) => void): void;
326
+ [key: string]: unknown;
327
+ }
328
+ export interface UwsRequestSnapshot {
329
+ method?: string;
330
+ url?: string;
331
+ query?: string | Record<string, string>;
332
+ headers: Record<string, string>;
333
+ cookies?: Record<string, string>;
334
+ res?: UwsHttpResponse;
335
+ user?: JwtPayload | null;
336
+ token?: string | null;
337
+ }
338
+ export type UwsHandler = (res: UwsHttpResponse, req: UwsHttpRequest, request?: UwsRequestSnapshot) => unknown;
339
+ export interface ExpressRequestLike {
340
+ auth?: unknown;
341
+ user?: JwtPayload | null;
342
+ token?: string | null;
343
+ headers?: Record<string, string | undefined>;
344
+ cookies?: Record<string, string>;
345
+ query?: Record<string, string | undefined>;
346
+ [key: string]: unknown;
347
+ }
348
+ export interface ExpressResponseLike {
349
+ status?(code: number): ExpressResponseLike;
350
+ send?(body: unknown): unknown;
351
+ code?(code: number): ExpressResponseLike;
352
+ body?: unknown;
353
+ [key: string]: unknown;
354
+ }
355
+ export type ExpressNext = (error?: unknown) => void;
356
+ export type ExpressHandler = (req: ExpressRequestLike, res: ExpressResponseLike, next?: ExpressNext) => unknown;
357
+ export interface KoaContextLike {
358
+ request?: RequestLike;
359
+ state: {
360
+ user?: JwtPayload | null;
361
+ token?: string | null;
362
+ [key: string]: unknown;
363
+ };
364
+ status: number;
365
+ body: unknown;
366
+ }
367
+ export interface FastifyLike {
368
+ decorate(name: string, value: unknown): void;
369
+ decorateRequest(name: string, value: unknown): void;
370
+ [key: string]: unknown;
371
+ }
372
+ export interface FastifyRequestLike {
373
+ user?: JwtPayload | null;
374
+ headers?: Record<string, string | undefined>;
375
+ cookies?: Record<string, string>;
376
+ query?: Record<string, string | undefined>;
377
+ [key: string]: unknown;
378
+ }
379
+ export interface FastifyReplyLike {
380
+ code(status: number): FastifyReplyLike;
381
+ send(body: unknown): unknown;
382
+ }
383
+ //# sourceMappingURL=types.d.ts.map