@workos-inc/node 7.61.0 → 7.62.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.
- package/lib/common/exceptions/parse-error.d.ts +7 -1
- package/lib/common/exceptions/parse-error.js +2 -1
- package/lib/common/net/fetch-client.js +20 -2
- package/lib/common/net/fetch-client.spec.js +67 -0
- package/lib/user-management/fixtures/list-sessions.json +22 -0
- package/lib/user-management/interfaces/index.d.ts +1 -0
- package/lib/user-management/interfaces/index.js +1 -0
- package/lib/user-management/interfaces/list-sessions-options.interface.d.ts +5 -0
- package/lib/user-management/interfaces/list-sessions-options.interface.js +2 -0
- package/lib/user-management/interfaces/session.interface.d.ts +14 -0
- package/lib/user-management/serializers/index.d.ts +2 -0
- package/lib/user-management/serializers/index.js +2 -0
- package/lib/user-management/serializers/list-sessions-options.serializer.d.ts +2 -0
- package/lib/user-management/serializers/list-sessions-options.serializer.js +5 -0
- package/lib/user-management/serializers/session.serializer.js +6 -0
- package/lib/user-management/session.d.ts +1 -1
- package/lib/user-management/session.js +3 -3
- package/lib/user-management/session.spec.js +1 -1
- package/lib/user-management/user-management.d.ts +4 -3
- package/lib/user-management/user-management.js +6 -1
- package/lib/user-management/user-management.spec.js +30 -0
- package/lib/workos.js +8 -2
- package/package.json +1 -1
|
@@ -3,6 +3,12 @@ export declare class ParseError extends Error implements RequestException {
|
|
|
3
3
|
readonly name = "ParseError";
|
|
4
4
|
readonly status = 500;
|
|
5
5
|
readonly rawBody: string;
|
|
6
|
+
readonly rawStatus: number;
|
|
6
7
|
readonly requestID: string;
|
|
7
|
-
constructor(message
|
|
8
|
+
constructor({ message, rawBody, rawStatus, requestID, }: {
|
|
9
|
+
message: string;
|
|
10
|
+
rawBody: string;
|
|
11
|
+
requestID: string;
|
|
12
|
+
rawStatus: number;
|
|
13
|
+
});
|
|
8
14
|
}
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ParseError = void 0;
|
|
4
4
|
class ParseError extends Error {
|
|
5
|
-
constructor(message, rawBody, requestID) {
|
|
5
|
+
constructor({ message, rawBody, rawStatus, requestID, }) {
|
|
6
6
|
super(message);
|
|
7
7
|
this.name = 'ParseError';
|
|
8
8
|
this.status = 500;
|
|
9
9
|
this.rawBody = rawBody;
|
|
10
|
+
this.rawStatus = rawStatus;
|
|
10
11
|
this.requestID = requestID;
|
|
11
12
|
}
|
|
12
13
|
}
|
|
@@ -11,6 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.FetchHttpClientResponse = exports.FetchHttpClient = void 0;
|
|
13
13
|
const http_client_1 = require("./http-client");
|
|
14
|
+
const parse_error_1 = require("../exceptions/parse-error");
|
|
14
15
|
class FetchHttpClient extends http_client_1.HttpClient {
|
|
15
16
|
constructor(baseURL, options, fetchFn) {
|
|
16
17
|
super(baseURL, options);
|
|
@@ -74,7 +75,7 @@ class FetchHttpClient extends http_client_1.HttpClient {
|
|
|
74
75
|
});
|
|
75
76
|
}
|
|
76
77
|
fetchRequest(url, method, body, headers) {
|
|
77
|
-
var _a, _b;
|
|
78
|
+
var _a, _b, _c;
|
|
78
79
|
return __awaiter(this, void 0, void 0, function* () {
|
|
79
80
|
// For methods which expect payloads, we should always pass a body value
|
|
80
81
|
// even when it is empty. Without this, some JS runtimes (eg. Deno) will
|
|
@@ -88,12 +89,29 @@ class FetchHttpClient extends http_client_1.HttpClient {
|
|
|
88
89
|
body: requestBody,
|
|
89
90
|
});
|
|
90
91
|
if (!res.ok) {
|
|
92
|
+
const requestID = (_c = res.headers.get('X-Request-ID')) !== null && _c !== void 0 ? _c : '';
|
|
93
|
+
const rawBody = yield res.text();
|
|
94
|
+
let responseJson;
|
|
95
|
+
try {
|
|
96
|
+
responseJson = JSON.parse(rawBody);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof SyntaxError) {
|
|
100
|
+
throw new parse_error_1.ParseError({
|
|
101
|
+
message: error.message,
|
|
102
|
+
rawBody,
|
|
103
|
+
requestID,
|
|
104
|
+
rawStatus: res.status,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
91
109
|
throw new http_client_1.HttpClientError({
|
|
92
110
|
message: res.statusText,
|
|
93
111
|
response: {
|
|
94
112
|
status: res.status,
|
|
95
113
|
headers: res.headers,
|
|
96
|
-
data:
|
|
114
|
+
data: responseJson,
|
|
97
115
|
},
|
|
98
116
|
});
|
|
99
117
|
}
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
const jest_fetch_mock_1 = __importDefault(require("jest-fetch-mock"));
|
|
16
16
|
const test_utils_1 = require("../../common/utils/test-utils");
|
|
17
17
|
const fetch_client_1 = require("./fetch-client");
|
|
18
|
+
const parse_error_1 = require("../exceptions/parse-error");
|
|
18
19
|
const fetchClient = new fetch_client_1.FetchHttpClient('https://test.workos.com', {
|
|
19
20
|
headers: {
|
|
20
21
|
Authorization: `Bearer sk_test`,
|
|
@@ -137,4 +138,70 @@ describe('Fetch client', () => {
|
|
|
137
138
|
expect(yield response.toJSON()).toEqual({ data: 'response' });
|
|
138
139
|
}));
|
|
139
140
|
});
|
|
141
|
+
describe('error handling', () => {
|
|
142
|
+
it('should throw ParseError when response body is not valid JSON on non-200 status', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
143
|
+
// Mock a 500 response with invalid JSON (like an HTML error page)
|
|
144
|
+
jest_fetch_mock_1.default.mockResponseOnce('<html><body>Internal Server Error</body></html>', {
|
|
145
|
+
status: 500,
|
|
146
|
+
statusText: 'Internal Server Error',
|
|
147
|
+
headers: {
|
|
148
|
+
'X-Request-ID': 'test-request-123',
|
|
149
|
+
'Content-Type': 'text/html',
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
yield expect(fetchClient.get('/users', {})).rejects.toThrow(parse_error_1.ParseError);
|
|
153
|
+
try {
|
|
154
|
+
yield fetchClient.get('/users', {});
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
expect(error).toBeInstanceOf(parse_error_1.ParseError);
|
|
158
|
+
const parseError = error;
|
|
159
|
+
expect(parseError.message).toContain('Unexpected token');
|
|
160
|
+
expect(parseError.rawBody).toBe('<html><body>Internal Server Error</body></html>');
|
|
161
|
+
expect(parseError.requestID).toBe('test-request-123');
|
|
162
|
+
expect(parseError.rawStatus).toBe(500);
|
|
163
|
+
}
|
|
164
|
+
}));
|
|
165
|
+
it('should throw ParseError for non-FGA endpoints with invalid JSON response', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
166
|
+
// Test with a non-FGA endpoint to ensure the error handling works for regular requests too
|
|
167
|
+
jest_fetch_mock_1.default.mockResponseOnce('Not JSON content', {
|
|
168
|
+
status: 400,
|
|
169
|
+
statusText: 'Bad Request',
|
|
170
|
+
headers: {
|
|
171
|
+
'X-Request-ID': 'bad-request-456',
|
|
172
|
+
'Content-Type': 'text/plain',
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
yield expect(fetchClient.post('/organizations', { name: 'Test' }, {})).rejects.toThrow(parse_error_1.ParseError);
|
|
176
|
+
try {
|
|
177
|
+
yield fetchClient.post('/organizations', { name: 'Test' }, {});
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
expect(error).toBeInstanceOf(parse_error_1.ParseError);
|
|
181
|
+
const parseError = error;
|
|
182
|
+
expect(parseError.rawBody).toBe('Not JSON content');
|
|
183
|
+
expect(parseError.requestID).toBe('bad-request-456');
|
|
184
|
+
expect(parseError.rawStatus).toBe(400);
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
it('should throw ParseError when X-Request-ID header is missing', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
188
|
+
jest_fetch_mock_1.default.mockResponseOnce('Invalid JSON Response', {
|
|
189
|
+
status: 422,
|
|
190
|
+
statusText: 'Unprocessable Entity',
|
|
191
|
+
headers: {
|
|
192
|
+
'Content-Type': 'application/json',
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
try {
|
|
196
|
+
yield fetchClient.put('/users/123', { name: 'Updated' }, {});
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
expect(error).toBeInstanceOf(parse_error_1.ParseError);
|
|
200
|
+
const parseError = error;
|
|
201
|
+
expect(parseError.rawBody).toBe('Invalid JSON Response');
|
|
202
|
+
expect(parseError.requestID).toBe(''); // Should default to empty string when header is missing
|
|
203
|
+
expect(parseError.rawStatus).toBe(422);
|
|
204
|
+
}
|
|
205
|
+
}));
|
|
206
|
+
});
|
|
140
207
|
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"object": "list",
|
|
3
|
+
"data": [
|
|
4
|
+
{
|
|
5
|
+
"object": "session",
|
|
6
|
+
"id": "session_01K0T5TNC755C7FGRQFJRS4QK5",
|
|
7
|
+
"user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36",
|
|
8
|
+
"ip_address": "192.168.65.1",
|
|
9
|
+
"user_id": "user_01K0T5T62NBSETXQD3NVGEA2RN",
|
|
10
|
+
"auth_method": "oauth",
|
|
11
|
+
"status": "active",
|
|
12
|
+
"expires_at": "2026-07-22T22:59:48.743Z",
|
|
13
|
+
"ended_at": null,
|
|
14
|
+
"created_at": "2025-07-23T04:59:48.738Z",
|
|
15
|
+
"updated_at": "2025-07-23T04:59:48.738Z"
|
|
16
|
+
}
|
|
17
|
+
],
|
|
18
|
+
"list_metadata": {
|
|
19
|
+
"before": null,
|
|
20
|
+
"after": null
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -25,6 +25,7 @@ export * from './invitation.interface';
|
|
|
25
25
|
export * from './list-auth-factors-options.interface';
|
|
26
26
|
export * from './list-invitations-options.interface';
|
|
27
27
|
export * from './list-organization-memberships-options.interface';
|
|
28
|
+
export * from './list-sessions-options.interface';
|
|
28
29
|
export * from './list-users-options.interface';
|
|
29
30
|
export * from './magic-auth.interface';
|
|
30
31
|
export * from './oauth-tokens.interface';
|
|
@@ -41,6 +41,7 @@ __exportStar(require("./invitation.interface"), exports);
|
|
|
41
41
|
__exportStar(require("./list-auth-factors-options.interface"), exports);
|
|
42
42
|
__exportStar(require("./list-invitations-options.interface"), exports);
|
|
43
43
|
__exportStar(require("./list-organization-memberships-options.interface"), exports);
|
|
44
|
+
__exportStar(require("./list-sessions-options.interface"), exports);
|
|
44
45
|
__exportStar(require("./list-users-options.interface"), exports);
|
|
45
46
|
__exportStar(require("./magic-auth.interface"), exports);
|
|
46
47
|
__exportStar(require("./oauth-tokens.interface"), exports);
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { Impersonator } from './impersonator.interface';
|
|
2
|
+
export type AuthMethod = 'external_auth' | 'impersonation' | 'magic_code' | 'migrated_session' | 'oauth' | 'passkey' | 'password' | 'sso' | 'unknown';
|
|
3
|
+
export type SessionStatus = 'active' | 'expired' | 'revoked';
|
|
2
4
|
export interface Session {
|
|
3
5
|
object: 'session';
|
|
4
6
|
id: string;
|
|
@@ -7,6 +9,12 @@ export interface Session {
|
|
|
7
9
|
userAgent: string | null;
|
|
8
10
|
organizationId?: string;
|
|
9
11
|
impersonator?: Impersonator;
|
|
12
|
+
authMethod: AuthMethod;
|
|
13
|
+
status: SessionStatus;
|
|
14
|
+
expiresAt: string;
|
|
15
|
+
endedAt: string | null;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
updatedAt: string;
|
|
10
18
|
}
|
|
11
19
|
export interface SessionResponse {
|
|
12
20
|
object: 'session';
|
|
@@ -16,4 +24,10 @@ export interface SessionResponse {
|
|
|
16
24
|
user_agent: string | null;
|
|
17
25
|
organization_id?: string;
|
|
18
26
|
impersonator?: Impersonator;
|
|
27
|
+
auth_method: AuthMethod;
|
|
28
|
+
status: SessionStatus;
|
|
29
|
+
expires_at: string;
|
|
30
|
+
ended_at: string | null;
|
|
31
|
+
created_at: string;
|
|
32
|
+
updated_at: string;
|
|
19
33
|
}
|
|
@@ -12,10 +12,12 @@ export * from './email-verification.serializer';
|
|
|
12
12
|
export * from './enroll-auth-factor-options.serializer';
|
|
13
13
|
export * from './factor.serializer';
|
|
14
14
|
export * from './invitation.serializer';
|
|
15
|
+
export * from './list-sessions-options.serializer';
|
|
15
16
|
export * from './magic-auth.serializer';
|
|
16
17
|
export * from './password-reset.serializer';
|
|
17
18
|
export * from './reset-password-options.serializer';
|
|
18
19
|
export * from './send-password-reset-email.serializer';
|
|
20
|
+
export * from './session.serializer';
|
|
19
21
|
export * from './create-user-options.serializer';
|
|
20
22
|
export * from './send-magic-auth-code-options.serializer';
|
|
21
23
|
export * from './update-user-options.serializer';
|
|
@@ -28,10 +28,12 @@ __exportStar(require("./email-verification.serializer"), exports);
|
|
|
28
28
|
__exportStar(require("./enroll-auth-factor-options.serializer"), exports);
|
|
29
29
|
__exportStar(require("./factor.serializer"), exports);
|
|
30
30
|
__exportStar(require("./invitation.serializer"), exports);
|
|
31
|
+
__exportStar(require("./list-sessions-options.serializer"), exports);
|
|
31
32
|
__exportStar(require("./magic-auth.serializer"), exports);
|
|
32
33
|
__exportStar(require("./password-reset.serializer"), exports);
|
|
33
34
|
__exportStar(require("./reset-password-options.serializer"), exports);
|
|
34
35
|
__exportStar(require("./send-password-reset-email.serializer"), exports);
|
|
36
|
+
__exportStar(require("./session.serializer"), exports);
|
|
35
37
|
__exportStar(require("./create-user-options.serializer"), exports);
|
|
36
38
|
__exportStar(require("./send-magic-auth-code-options.serializer"), exports);
|
|
37
39
|
__exportStar(require("./update-user-options.serializer"), exports);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serializeListSessionsOptions = void 0;
|
|
4
|
+
const serializeListSessionsOptions = (options) => (Object.assign({}, options));
|
|
5
|
+
exports.serializeListSessionsOptions = serializeListSessionsOptions;
|
|
@@ -9,5 +9,11 @@ const deserializeSession = (session) => ({
|
|
|
9
9
|
userAgent: session.user_agent,
|
|
10
10
|
organizationId: session.organization_id,
|
|
11
11
|
impersonator: session.impersonator,
|
|
12
|
+
authMethod: session.auth_method,
|
|
13
|
+
status: session.status,
|
|
14
|
+
expiresAt: session.expires_at,
|
|
15
|
+
endedAt: session.ended_at,
|
|
16
|
+
createdAt: session.created_at,
|
|
17
|
+
updatedAt: session.updated_at,
|
|
12
18
|
});
|
|
13
19
|
exports.deserializeSession = deserializeSession;
|
|
@@ -9,11 +9,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.CookieSession = void 0;
|
|
13
13
|
const jose_1 = require("jose");
|
|
14
14
|
const oauth_exception_1 = require("../common/exceptions/oauth.exception");
|
|
15
15
|
const interfaces_1 = require("./interfaces");
|
|
16
|
-
class
|
|
16
|
+
class CookieSession {
|
|
17
17
|
constructor(userManagement, sessionData, cookiePassword) {
|
|
18
18
|
if (!cookiePassword) {
|
|
19
19
|
throw new Error('cookiePassword is required');
|
|
@@ -180,4 +180,4 @@ class Session {
|
|
|
180
180
|
});
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
|
-
exports.
|
|
183
|
+
exports.CookieSession = CookieSession;
|
|
@@ -64,7 +64,7 @@ describe('Session', () => {
|
|
|
64
64
|
sessionData: 'sessionData',
|
|
65
65
|
cookiePassword: 'cookiePassword',
|
|
66
66
|
});
|
|
67
|
-
expect(session).toBeInstanceOf(session_1.
|
|
67
|
+
expect(session).toBeInstanceOf(session_1.CookieSession);
|
|
68
68
|
});
|
|
69
69
|
});
|
|
70
70
|
describe('authenticate', () => {
|
|
@@ -3,7 +3,7 @@ import { IronSessionProvider } from '../common/iron-session/iron-session-provide
|
|
|
3
3
|
import { AutoPaginatable } from '../common/utils/pagination';
|
|
4
4
|
import { Challenge } from '../mfa/interfaces';
|
|
5
5
|
import { WorkOS } from '../workos';
|
|
6
|
-
import { AuthenticateWithCodeOptions, AuthenticateWithCodeAndVerifierOptions, AuthenticateWithMagicAuthOptions, AuthenticateWithPasswordOptions, AuthenticateWithRefreshTokenOptions, AuthenticateWithTotpOptions, AuthenticationResponse, CreateMagicAuthOptions, CreatePasswordResetOptions, CreateUserOptions, EmailVerification, EnrollAuthFactorOptions, ListAuthFactorsOptions, ListUsersOptions, MagicAuth, PasswordReset, ResetPasswordOptions, SendMagicAuthCodeOptions, SendPasswordResetEmailOptions, SendVerificationEmailOptions, UpdateUserOptions, User, VerifyEmailOptions } from './interfaces';
|
|
6
|
+
import { AuthenticateWithCodeOptions, AuthenticateWithCodeAndVerifierOptions, AuthenticateWithMagicAuthOptions, AuthenticateWithPasswordOptions, AuthenticateWithRefreshTokenOptions, AuthenticateWithTotpOptions, AuthenticationResponse, CreateMagicAuthOptions, CreatePasswordResetOptions, CreateUserOptions, EmailVerification, EnrollAuthFactorOptions, ListAuthFactorsOptions, ListSessionsOptions, ListUsersOptions, MagicAuth, PasswordReset, ResetPasswordOptions, SendMagicAuthCodeOptions, SendPasswordResetEmailOptions, SendVerificationEmailOptions, Session, UpdateUserOptions, User, VerifyEmailOptions } from './interfaces';
|
|
7
7
|
import { AuthenticateWithEmailVerificationOptions } from './interfaces/authenticate-with-email-verification-options.interface';
|
|
8
8
|
import { AuthenticateWithOrganizationSelectionOptions } from './interfaces/authenticate-with-organization-selection.interface';
|
|
9
9
|
import { AuthenticateWithSessionCookieFailedResponse, AuthenticateWithSessionCookieOptions, AuthenticateWithSessionCookieSuccessResponse, SessionCookieData } from './interfaces/authenticate-with-session-cookie.interface';
|
|
@@ -20,7 +20,7 @@ import { RevokeSessionOptions } from './interfaces/revoke-session-options.interf
|
|
|
20
20
|
import { SendInvitationOptions } from './interfaces/send-invitation-options.interface';
|
|
21
21
|
import { SessionHandlerOptions } from './interfaces/session-handler-options.interface';
|
|
22
22
|
import { UpdateOrganizationMembershipOptions } from './interfaces/update-organization-membership-options.interface';
|
|
23
|
-
import {
|
|
23
|
+
import { CookieSession } from './session';
|
|
24
24
|
export declare class UserManagement {
|
|
25
25
|
private readonly workos;
|
|
26
26
|
private _jwks;
|
|
@@ -39,7 +39,7 @@ export declare class UserManagement {
|
|
|
39
39
|
loadSealedSession(options: {
|
|
40
40
|
sessionData: string;
|
|
41
41
|
cookiePassword: string;
|
|
42
|
-
}):
|
|
42
|
+
}): CookieSession;
|
|
43
43
|
getUser(userId: string): Promise<User>;
|
|
44
44
|
getUserByExternalId(externalId: string): Promise<User>;
|
|
45
45
|
listUsers(options?: ListUsersOptions): Promise<AutoPaginatable<User>>;
|
|
@@ -91,6 +91,7 @@ export declare class UserManagement {
|
|
|
91
91
|
authenticationChallenge: Challenge;
|
|
92
92
|
}>;
|
|
93
93
|
listAuthFactors(options: ListAuthFactorsOptions): Promise<AutoPaginatable<Factor>>;
|
|
94
|
+
listSessions(userId: string, options?: ListSessionsOptions): Promise<AutoPaginatable<Session>>;
|
|
94
95
|
deleteUser(userId: string): Promise<void>;
|
|
95
96
|
getUserIdentities(userId: string): Promise<Identity[]>;
|
|
96
97
|
getOrganizationMembership(organizationMembershipId: string): Promise<OrganizationMembership>;
|
|
@@ -83,7 +83,7 @@ class UserManagement {
|
|
|
83
83
|
* @returns The session class.
|
|
84
84
|
*/
|
|
85
85
|
loadSealedSession(options) {
|
|
86
|
-
return new session_1.
|
|
86
|
+
return new session_1.CookieSession(this, options.sessionData, options.cookiePassword);
|
|
87
87
|
}
|
|
88
88
|
getUser(userId) {
|
|
89
89
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -434,6 +434,11 @@ class UserManagement {
|
|
|
434
434
|
return new pagination_1.AutoPaginatable(yield (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, `/user_management/users/${userId}/auth_factors`, factor_serializer_1.deserializeFactor, restOfOptions), (params) => (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, `/user_management/users/${userId}/auth_factors`, factor_serializer_1.deserializeFactor, params), restOfOptions);
|
|
435
435
|
});
|
|
436
436
|
}
|
|
437
|
+
listSessions(userId, options) {
|
|
438
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
439
|
+
return new pagination_1.AutoPaginatable(yield (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, `/user_management/users/${userId}/sessions`, serializers_2.deserializeSession, options ? (0, serializers_2.serializeListSessionsOptions)(options) : undefined), (params) => (0, fetch_and_deserialize_1.fetchAndDeserialize)(this.workos, `/user_management/users/${userId}/sessions`, serializers_2.deserializeSession, params), options ? (0, serializers_2.serializeListSessionsOptions)(options) : undefined);
|
|
440
|
+
});
|
|
441
|
+
}
|
|
437
442
|
deleteUser(userId) {
|
|
438
443
|
return __awaiter(this, void 0, void 0, function* () {
|
|
439
444
|
yield this.workos.delete(`/user_management/users/${userId}`);
|
|
@@ -44,6 +44,7 @@ const invitation_json_1 = __importDefault(require("./fixtures/invitation.json"))
|
|
|
44
44
|
const list_factors_json_1 = __importDefault(require("./fixtures/list-factors.json"));
|
|
45
45
|
const list_invitations_json_1 = __importDefault(require("./fixtures/list-invitations.json"));
|
|
46
46
|
const list_organization_memberships_json_1 = __importDefault(require("./fixtures/list-organization-memberships.json"));
|
|
47
|
+
const list_sessions_json_1 = __importDefault(require("./fixtures/list-sessions.json"));
|
|
47
48
|
const list_users_json_1 = __importDefault(require("./fixtures/list-users.json"));
|
|
48
49
|
const magic_auth_json_1 = __importDefault(require("./fixtures/magic_auth.json"));
|
|
49
50
|
const organization_membership_json_1 = __importDefault(require("./fixtures/organization-membership.json"));
|
|
@@ -1297,6 +1298,35 @@ describe('UserManagement', () => {
|
|
|
1297
1298
|
});
|
|
1298
1299
|
}));
|
|
1299
1300
|
});
|
|
1301
|
+
describe('listSessions', () => {
|
|
1302
|
+
it('sends a listSessions request', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1303
|
+
(0, test_utils_1.fetchOnce)(list_sessions_json_1.default);
|
|
1304
|
+
const resp = yield workos.userManagement.listSessions(userId);
|
|
1305
|
+
expect((0, test_utils_1.fetchURL)()).toContain(`/user_management/users/${userId}/sessions`);
|
|
1306
|
+
expect(resp).toMatchObject({
|
|
1307
|
+
object: 'list',
|
|
1308
|
+
data: [
|
|
1309
|
+
{
|
|
1310
|
+
object: 'session',
|
|
1311
|
+
id: 'session_01K0T5TNC755C7FGRQFJRS4QK5',
|
|
1312
|
+
userId: 'user_01K0T5T62NBSETXQD3NVGEA2RN',
|
|
1313
|
+
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36',
|
|
1314
|
+
ipAddress: '192.168.65.1',
|
|
1315
|
+
authMethod: 'oauth',
|
|
1316
|
+
status: 'active',
|
|
1317
|
+
expiresAt: '2026-07-22T22:59:48.743Z',
|
|
1318
|
+
endedAt: null,
|
|
1319
|
+
createdAt: '2025-07-23T04:59:48.738Z',
|
|
1320
|
+
updatedAt: '2025-07-23T04:59:48.738Z',
|
|
1321
|
+
},
|
|
1322
|
+
],
|
|
1323
|
+
listMetadata: {
|
|
1324
|
+
before: null,
|
|
1325
|
+
after: null,
|
|
1326
|
+
},
|
|
1327
|
+
});
|
|
1328
|
+
}));
|
|
1329
|
+
});
|
|
1300
1330
|
describe('deleteUser', () => {
|
|
1301
1331
|
it('sends a deleteUser request', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
1302
1332
|
(0, test_utils_1.fetchOnce)();
|
package/lib/workos.js
CHANGED
|
@@ -32,7 +32,7 @@ const actions_1 = require("./actions/actions");
|
|
|
32
32
|
const vault_1 = require("./vault/vault");
|
|
33
33
|
const conflict_exception_1 = require("./common/exceptions/conflict.exception");
|
|
34
34
|
const parse_error_1 = require("./common/exceptions/parse-error");
|
|
35
|
-
const VERSION = '7.
|
|
35
|
+
const VERSION = '7.62.1';
|
|
36
36
|
const DEFAULT_HOSTNAME = 'api.workos.com';
|
|
37
37
|
const HEADER_AUTHORIZATION = 'Authorization';
|
|
38
38
|
const HEADER_IDEMPOTENCY_KEY = 'Idempotency-Key';
|
|
@@ -214,8 +214,14 @@ class WorkOS {
|
|
|
214
214
|
if (error instanceof SyntaxError) {
|
|
215
215
|
const rawResponse = res.getRawResponse();
|
|
216
216
|
const requestID = (_a = rawResponse.headers.get('X-Request-ID')) !== null && _a !== void 0 ? _a : '';
|
|
217
|
+
const rawStatus = rawResponse.status;
|
|
217
218
|
const rawBody = yield rawResponse.text();
|
|
218
|
-
throw new parse_error_1.ParseError(
|
|
219
|
+
throw new parse_error_1.ParseError({
|
|
220
|
+
message: error.message,
|
|
221
|
+
rawBody,
|
|
222
|
+
rawStatus,
|
|
223
|
+
requestID,
|
|
224
|
+
});
|
|
219
225
|
}
|
|
220
226
|
});
|
|
221
227
|
}
|
package/package.json
CHANGED