@wazo/sdk 0.43.4 → 0.43.5
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/dist/wazo-sdk.js +2 -2
- package/esm/api/auth.js +1 -1
- package/esm/simple/Auth.js +4 -10
- package/esm/simple/__tests__/Auth.test.js +7 -63
- package/esm/types/simple/Auth.d.ts.map +1 -1
- package/esm/types/utils/api-requester.d.ts.map +1 -1
- package/esm/utils/__tests__/api-requester.test.js +17 -0
- package/esm/utils/api-requester.js +9 -1
- package/lib/api/auth.js +1 -1
- package/lib/simple/Auth.js +4 -10
- package/lib/simple/__tests__/Auth.test.js +10 -63
- package/lib/types/simple/Auth.d.ts.map +1 -1
- package/lib/types/utils/api-requester.d.ts.map +1 -1
- package/lib/utils/__tests__/api-requester.test.js +17 -0
- package/lib/utils/api-requester.js +9 -1
- package/package.json +1 -1
- package/src/api/auth.ts +1 -1
- package/src/simple/Auth.ts +4 -11
- package/src/simple/__tests__/Auth.test.ts +8 -86
- package/src/utils/__tests__/api-requester.test.ts +20 -0
- package/src/utils/api-requester.ts +9 -1
package/esm/api/auth.js
CHANGED
|
@@ -51,7 +51,7 @@ export default ((client, baseUrl) => ({
|
|
|
51
51
|
Accept: 'application/json',
|
|
52
52
|
'Content-Type': 'application/json',
|
|
53
53
|
};
|
|
54
|
-
return client.post(`${baseUrl}/saml/sso`, body, headers
|
|
54
|
+
return client.post(`${baseUrl}/saml/sso`, body, headers);
|
|
55
55
|
},
|
|
56
56
|
refreshToken: (refreshToken, backend, expiration, isMobile, tenantId, domainName) => {
|
|
57
57
|
const body = {
|
package/esm/simple/Auth.js
CHANGED
|
@@ -122,25 +122,19 @@ export class Auth {
|
|
|
122
122
|
return this._onAuthenticated(rawSession);
|
|
123
123
|
}
|
|
124
124
|
async initiateIdpAuthentication(domain, redirectUrl) {
|
|
125
|
-
let response;
|
|
126
125
|
try {
|
|
127
|
-
|
|
126
|
+
return await getApiClient().auth.initiateIdpAuthentication(domain, redirectUrl);
|
|
128
127
|
}
|
|
129
128
|
catch (e) {
|
|
130
129
|
logger.error('Error during IdP authentication initialization:', e.message);
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
if (!response.ok) {
|
|
134
|
-
if (response.status === 404) {
|
|
130
|
+
if (e.status === 404) {
|
|
135
131
|
throw new NoSamlRouteError('No route found for SAML SSO');
|
|
136
132
|
}
|
|
137
|
-
if (
|
|
133
|
+
if (e.status === 500) {
|
|
138
134
|
throw new SamlConfigError('SAML/server configuration error');
|
|
139
135
|
}
|
|
140
|
-
|
|
141
|
-
throw new Error(error.message || error.reason);
|
|
136
|
+
throw e;
|
|
142
137
|
}
|
|
143
|
-
return response.json();
|
|
144
138
|
}
|
|
145
139
|
async logInViaRefreshToken(refreshToken) {
|
|
146
140
|
const rawSession = await getApiClient().auth.refreshToken(refreshToken, '', this.expiration, this.mobile);
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import BadResponse from '../../domain/BadResponse';
|
|
2
|
+
import ServerError from '../../domain/ServerError';
|
|
1
3
|
import getApiClient, { setRefreshToken } from '../../service/getApiClient';
|
|
2
4
|
import { Auth as AuthClass } from '../Auth';
|
|
3
5
|
const Auth = new AuthClass();
|
|
@@ -110,12 +112,8 @@ describe('simple/Auth', () => {
|
|
|
110
112
|
});
|
|
111
113
|
describe('initiateIdpAuthentication', () => {
|
|
112
114
|
const validResponse = { location: 'idp.com/auth', saml_session_id: 'a1b2C3d4' };
|
|
113
|
-
it('should return a `location` and `saml_session_id` if the response is
|
|
114
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
115
|
-
ok: true,
|
|
116
|
-
status: 303,
|
|
117
|
-
json: () => Promise.resolve(validResponse),
|
|
118
|
-
}));
|
|
115
|
+
it('should return a `location` and `saml_session_id` if the response is valid', async () => {
|
|
116
|
+
const initiateIdpAuthentication = jest.fn(() => validResponse);
|
|
119
117
|
getApiClient.mockImplementation(() => ({
|
|
120
118
|
auth: {
|
|
121
119
|
initiateIdpAuthentication,
|
|
@@ -125,58 +123,7 @@ describe('simple/Auth', () => {
|
|
|
125
123
|
expect(response).toBe(validResponse);
|
|
126
124
|
});
|
|
127
125
|
it('should return a `NoSamlRouteError` if the response is a 404', async () => {
|
|
128
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
129
|
-
ok: false,
|
|
130
|
-
status: 404,
|
|
131
|
-
}));
|
|
132
|
-
getApiClient.mockImplementation(() => ({
|
|
133
|
-
auth: {
|
|
134
|
-
initiateIdpAuthentication,
|
|
135
|
-
},
|
|
136
|
-
}));
|
|
137
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('No route found for SAML SSO');
|
|
138
|
-
});
|
|
139
|
-
it('should return an error `message` if the response is NOT ok', async () => {
|
|
140
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
141
|
-
ok: false,
|
|
142
|
-
json: () => Promise.resolve({ message: 'an error message', reason: 'an error reason' }),
|
|
143
|
-
}));
|
|
144
|
-
getApiClient.mockImplementation(() => ({
|
|
145
|
-
auth: {
|
|
146
|
-
initiateIdpAuthentication,
|
|
147
|
-
},
|
|
148
|
-
}));
|
|
149
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('an error message');
|
|
150
|
-
});
|
|
151
|
-
it('should return an error `reason` if there is no `message` and the response is NOT ok', async () => {
|
|
152
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
153
|
-
ok: false,
|
|
154
|
-
json: () => Promise.resolve({ reason: 'an error reason' }),
|
|
155
|
-
}));
|
|
156
|
-
getApiClient.mockImplementation(() => ({
|
|
157
|
-
auth: {
|
|
158
|
-
initiateIdpAuthentication,
|
|
159
|
-
},
|
|
160
|
-
}));
|
|
161
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('an error reason');
|
|
162
|
-
});
|
|
163
|
-
it('should return an error with a null message if there is no `message` and `reason`', async () => {
|
|
164
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
165
|
-
ok: false,
|
|
166
|
-
json: () => Promise.resolve({}),
|
|
167
|
-
}));
|
|
168
|
-
getApiClient.mockImplementation(() => ({
|
|
169
|
-
auth: {
|
|
170
|
-
initiateIdpAuthentication,
|
|
171
|
-
},
|
|
172
|
-
}));
|
|
173
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('');
|
|
174
|
-
});
|
|
175
|
-
it('should return a NoSAMLRouteError if the response is a 404', async () => {
|
|
176
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
177
|
-
ok: false,
|
|
178
|
-
status: 404,
|
|
179
|
-
}));
|
|
126
|
+
const initiateIdpAuthentication = jest.fn(() => { throw BadResponse.fromText('an error message', 404); });
|
|
180
127
|
getApiClient.mockImplementation(() => ({
|
|
181
128
|
auth: {
|
|
182
129
|
initiateIdpAuthentication,
|
|
@@ -184,11 +131,8 @@ describe('simple/Auth', () => {
|
|
|
184
131
|
}));
|
|
185
132
|
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('No route found for SAML SSO');
|
|
186
133
|
});
|
|
187
|
-
it('should return a SamlConfigError if the response is a 500', async () => {
|
|
188
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
189
|
-
ok: false,
|
|
190
|
-
status: 500,
|
|
191
|
-
}));
|
|
134
|
+
it('should return a `SamlConfigError` if the response is a 500', async () => {
|
|
135
|
+
const initiateIdpAuthentication = jest.fn(() => { throw ServerError.fromText('an error message', 500); });
|
|
192
136
|
getApiClient.mockImplementation(() => ({
|
|
193
137
|
auth: {
|
|
194
138
|
initiateIdpAuthentication,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Auth.d.ts","sourceRoot":"","sources":["../../../src/simple/Auth.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAqBxC,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AACjD,qBAAa,oBAAqB,SAAQ,KAAK;CAAG;AAClD,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAC7C,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAC/C,qBAAa,gBAAiB,SAAQ,KAAK;CAAG;AAC9C,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAI7C,qBAAa,IAAI;IACf,QAAQ,EAAE,MAAM,CAAC;IAEjB,UAAU,EAAE,MAAM,CAAC;IAEnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAExB,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnE,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAEnD,yBAAyB,CAAC,EAAE,CAAC,oBAAoB,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnE,aAAa,EAAE,OAAO,CAAC;IAEvB,MAAM,EAAE,OAAO,CAAC;IAEhB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;IAErB,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;IAErC,oBAAoB,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,KAAK,IAAI,CAAC;;IAU1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IA6BnJ,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAItC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA6D1H,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAKzD,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Auth.d.ts","sourceRoot":"","sources":["../../../src/simple/Auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-requester.d.ts","sourceRoot":"","sources":["../../../src/utils/api-requester.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,oBAAoB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAKF,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAE9C,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAEpC,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAElC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAElC,oBAAoB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEnD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAErD,eAAe,EAAE,OAAO,CAAC;IAEzB,cAAc,EAAE,MAAM,CAAC;IAEvB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEnC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAElC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEnC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAElC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAErC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEtC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAIpE,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIlD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAIvD,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"api-requester.d.ts","sourceRoot":"","sources":["../../../src/utils/api-requester.ts"],"names":[],"mappings":"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"}
|
|
@@ -147,3 +147,20 @@ describe('With a refresh token', () => {
|
|
|
147
147
|
});
|
|
148
148
|
});
|
|
149
149
|
});
|
|
150
|
+
describe('base64Encode', () => {
|
|
151
|
+
it('should encode a string using base64', () => {
|
|
152
|
+
const input = 'Hello World!';
|
|
153
|
+
const expectedOutput = 'SGVsbG8gV29ybGQh';
|
|
154
|
+
expect(ApiRequester.base64Encode(input)).toBe(expectedOutput);
|
|
155
|
+
});
|
|
156
|
+
it('should handle special characters', () => {
|
|
157
|
+
const input = 'éà$@€';
|
|
158
|
+
const expectedOutput = 'w6nDoCRA4oKs';
|
|
159
|
+
expect(ApiRequester.base64Encode(input)).toBe(expectedOutput);
|
|
160
|
+
});
|
|
161
|
+
it('should handle empty string', () => {
|
|
162
|
+
const input = '';
|
|
163
|
+
const expectedOutput = '';
|
|
164
|
+
expect(ApiRequester.base64Encode(input)).toBe(expectedOutput);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
@@ -32,7 +32,15 @@ export default class ApiRequester {
|
|
|
32
32
|
return Object.keys(obj).filter(key => obj[key]).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
|
|
33
33
|
}
|
|
34
34
|
static base64Encode(str) {
|
|
35
|
-
|
|
35
|
+
if (typeof btoa !== 'undefined') {
|
|
36
|
+
try {
|
|
37
|
+
return btoa(str);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
// fall back to Base64.encode if btoa fails
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return Base64.encode(str);
|
|
36
44
|
}
|
|
37
45
|
// @see https://github.com/facebook/flow/issues/183#issuecomment-358607052
|
|
38
46
|
constructor({ server, refreshTokenCallback, clientId, agent = null, token = null, fetchOptions, requestTimeout = REQUEST_TIMEOUT_MS, }) {
|
package/lib/api/auth.js
CHANGED
|
@@ -66,7 +66,7 @@ exports.default = ((client, baseUrl) => ({
|
|
|
66
66
|
Accept: 'application/json',
|
|
67
67
|
'Content-Type': 'application/json',
|
|
68
68
|
};
|
|
69
|
-
return client.post(`${baseUrl}/saml/sso`, body, headers
|
|
69
|
+
return client.post(`${baseUrl}/saml/sso`, body, headers);
|
|
70
70
|
}),
|
|
71
71
|
refreshToken: (refreshToken, backend, expiration, isMobile, tenantId, domainName) => {
|
|
72
72
|
const body = {
|
package/lib/simple/Auth.js
CHANGED
|
@@ -156,25 +156,19 @@ class Auth {
|
|
|
156
156
|
}
|
|
157
157
|
initiateIdpAuthentication(domain, redirectUrl) {
|
|
158
158
|
return __awaiter(this, void 0, void 0, function* () {
|
|
159
|
-
let response;
|
|
160
159
|
try {
|
|
161
|
-
|
|
160
|
+
return yield (0, getApiClient_1.default)().auth.initiateIdpAuthentication(domain, redirectUrl);
|
|
162
161
|
}
|
|
163
162
|
catch (e) {
|
|
164
163
|
logger.error('Error during IdP authentication initialization:', e.message);
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
if (!response.ok) {
|
|
168
|
-
if (response.status === 404) {
|
|
164
|
+
if (e.status === 404) {
|
|
169
165
|
throw new NoSamlRouteError('No route found for SAML SSO');
|
|
170
166
|
}
|
|
171
|
-
if (
|
|
167
|
+
if (e.status === 500) {
|
|
172
168
|
throw new SamlConfigError('SAML/server configuration error');
|
|
173
169
|
}
|
|
174
|
-
|
|
175
|
-
throw new Error(error.message || error.reason);
|
|
170
|
+
throw e;
|
|
176
171
|
}
|
|
177
|
-
return response.json();
|
|
178
172
|
});
|
|
179
173
|
}
|
|
180
174
|
logInViaRefreshToken(refreshToken) {
|
|
@@ -31,7 +31,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
31
31
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
34
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
const BadResponse_1 = __importDefault(require("../../domain/BadResponse"));
|
|
39
|
+
const ServerError_1 = __importDefault(require("../../domain/ServerError"));
|
|
35
40
|
const getApiClient_1 = __importStar(require("../../service/getApiClient"));
|
|
36
41
|
const Auth_1 = require("../Auth");
|
|
37
42
|
const Auth = new Auth_1.Auth();
|
|
@@ -144,12 +149,8 @@ describe('simple/Auth', () => {
|
|
|
144
149
|
});
|
|
145
150
|
describe('initiateIdpAuthentication', () => {
|
|
146
151
|
const validResponse = { location: 'idp.com/auth', saml_session_id: 'a1b2C3d4' };
|
|
147
|
-
it('should return a `location` and `saml_session_id` if the response is
|
|
148
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
149
|
-
ok: true,
|
|
150
|
-
status: 303,
|
|
151
|
-
json: () => Promise.resolve(validResponse),
|
|
152
|
-
}));
|
|
152
|
+
it('should return a `location` and `saml_session_id` if the response is valid', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
153
|
+
const initiateIdpAuthentication = jest.fn(() => validResponse);
|
|
153
154
|
getApiClient_1.default.mockImplementation(() => ({
|
|
154
155
|
auth: {
|
|
155
156
|
initiateIdpAuthentication,
|
|
@@ -159,10 +160,7 @@ describe('simple/Auth', () => {
|
|
|
159
160
|
expect(response).toBe(validResponse);
|
|
160
161
|
}));
|
|
161
162
|
it('should return a `NoSamlRouteError` if the response is a 404', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
162
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
163
|
-
ok: false,
|
|
164
|
-
status: 404,
|
|
165
|
-
}));
|
|
163
|
+
const initiateIdpAuthentication = jest.fn(() => { throw BadResponse_1.default.fromText('an error message', 404); });
|
|
166
164
|
getApiClient_1.default.mockImplementation(() => ({
|
|
167
165
|
auth: {
|
|
168
166
|
initiateIdpAuthentication,
|
|
@@ -170,59 +168,8 @@ describe('simple/Auth', () => {
|
|
|
170
168
|
}));
|
|
171
169
|
yield expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('No route found for SAML SSO');
|
|
172
170
|
}));
|
|
173
|
-
it('should return
|
|
174
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
175
|
-
ok: false,
|
|
176
|
-
json: () => Promise.resolve({ message: 'an error message', reason: 'an error reason' }),
|
|
177
|
-
}));
|
|
178
|
-
getApiClient_1.default.mockImplementation(() => ({
|
|
179
|
-
auth: {
|
|
180
|
-
initiateIdpAuthentication,
|
|
181
|
-
},
|
|
182
|
-
}));
|
|
183
|
-
yield expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('an error message');
|
|
184
|
-
}));
|
|
185
|
-
it('should return an error `reason` if there is no `message` and the response is NOT ok', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
186
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
187
|
-
ok: false,
|
|
188
|
-
json: () => Promise.resolve({ reason: 'an error reason' }),
|
|
189
|
-
}));
|
|
190
|
-
getApiClient_1.default.mockImplementation(() => ({
|
|
191
|
-
auth: {
|
|
192
|
-
initiateIdpAuthentication,
|
|
193
|
-
},
|
|
194
|
-
}));
|
|
195
|
-
yield expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('an error reason');
|
|
196
|
-
}));
|
|
197
|
-
it('should return an error with a null message if there is no `message` and `reason`', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
198
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
199
|
-
ok: false,
|
|
200
|
-
json: () => Promise.resolve({}),
|
|
201
|
-
}));
|
|
202
|
-
getApiClient_1.default.mockImplementation(() => ({
|
|
203
|
-
auth: {
|
|
204
|
-
initiateIdpAuthentication,
|
|
205
|
-
},
|
|
206
|
-
}));
|
|
207
|
-
yield expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('');
|
|
208
|
-
}));
|
|
209
|
-
it('should return a NoSAMLRouteError if the response is a 404', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
210
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
211
|
-
ok: false,
|
|
212
|
-
status: 404,
|
|
213
|
-
}));
|
|
214
|
-
getApiClient_1.default.mockImplementation(() => ({
|
|
215
|
-
auth: {
|
|
216
|
-
initiateIdpAuthentication,
|
|
217
|
-
},
|
|
218
|
-
}));
|
|
219
|
-
yield expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('No route found for SAML SSO');
|
|
220
|
-
}));
|
|
221
|
-
it('should return a SamlConfigError if the response is a 500', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
222
|
-
const initiateIdpAuthentication = jest.fn(() => Promise.resolve({
|
|
223
|
-
ok: false,
|
|
224
|
-
status: 500,
|
|
225
|
-
}));
|
|
171
|
+
it('should return a `SamlConfigError` if the response is a 500', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
172
|
+
const initiateIdpAuthentication = jest.fn(() => { throw ServerError_1.default.fromText('an error message', 500); });
|
|
226
173
|
getApiClient_1.default.mockImplementation(() => ({
|
|
227
174
|
auth: {
|
|
228
175
|
initiateIdpAuthentication,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Auth.d.ts","sourceRoot":"","sources":["../../../src/simple/Auth.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAqBxC,qBAAa,mBAAoB,SAAQ,KAAK;CAAG;AACjD,qBAAa,oBAAqB,SAAQ,KAAK;CAAG;AAClD,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAC7C,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAC/C,qBAAa,gBAAiB,SAAQ,KAAK;CAAG;AAC9C,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAI7C,qBAAa,IAAI;IACf,QAAQ,EAAE,MAAM,CAAC;IAEjB,UAAU,EAAE,MAAM,CAAC;IAEnB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAExB,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnE,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAEnD,yBAAyB,CAAC,EAAE,CAAC,oBAAoB,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnE,aAAa,EAAE,OAAO,CAAC;IAEvB,MAAM,EAAE,OAAO,CAAC;IAEhB,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;IAErB,eAAe,EAAE,OAAO,GAAG,SAAS,CAAC;IAErC,oBAAoB,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,KAAK,IAAI,CAAC;;IAU1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IA6BnJ,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAItC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA6D1H,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAKzD,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Auth.d.ts","sourceRoot":"","sources":["../../../src/simple/Auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-requester.d.ts","sourceRoot":"","sources":["../../../src/utils/api-requester.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9C,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,oBAAoB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAKF,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAE9C,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAEpC,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAElC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAElC,oBAAoB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEnD,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IAErD,eAAe,EAAE,OAAO,CAAC;IAEzB,cAAc,EAAE,MAAM,CAAC;IAEvB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEnC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAElC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEnC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAElC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAErC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IAEtC,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAIpE,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAIlD,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;IAIvD,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"api-requester.d.ts","sourceRoot":"","sources":["../../../src/utils/api-requester.ts"],"names":[],"mappings":"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"}
|
|
@@ -161,3 +161,20 @@ describe('With a refresh token', () => {
|
|
|
161
161
|
});
|
|
162
162
|
}));
|
|
163
163
|
});
|
|
164
|
+
describe('base64Encode', () => {
|
|
165
|
+
it('should encode a string using base64', () => {
|
|
166
|
+
const input = 'Hello World!';
|
|
167
|
+
const expectedOutput = 'SGVsbG8gV29ybGQh';
|
|
168
|
+
expect(api_requester_1.default.base64Encode(input)).toBe(expectedOutput);
|
|
169
|
+
});
|
|
170
|
+
it('should handle special characters', () => {
|
|
171
|
+
const input = 'éà$@€';
|
|
172
|
+
const expectedOutput = 'w6nDoCRA4oKs';
|
|
173
|
+
expect(api_requester_1.default.base64Encode(input)).toBe(expectedOutput);
|
|
174
|
+
});
|
|
175
|
+
it('should handle empty string', () => {
|
|
176
|
+
const input = '';
|
|
177
|
+
const expectedOutput = '';
|
|
178
|
+
expect(api_requester_1.default.base64Encode(input)).toBe(expectedOutput);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
@@ -30,7 +30,15 @@ class ApiRequester {
|
|
|
30
30
|
return Object.keys(obj).filter(key => obj[key]).map(key => `${key}=${encodeURIComponent(obj[key])}`).join('&');
|
|
31
31
|
}
|
|
32
32
|
static base64Encode(str) {
|
|
33
|
-
|
|
33
|
+
if (typeof btoa !== 'undefined') {
|
|
34
|
+
try {
|
|
35
|
+
return btoa(str);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
// fall back to Base64.encode if btoa fails
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return js_base64_1.Base64.encode(str);
|
|
34
42
|
}
|
|
35
43
|
// @see https://github.com/facebook/flow/issues/183#issuecomment-358607052
|
|
36
44
|
constructor({ server, refreshTokenCallback, clientId, agent = null, token = null, fetchOptions, requestTimeout = REQUEST_TIMEOUT_MS, }) {
|
package/package.json
CHANGED
package/src/api/auth.ts
CHANGED
|
@@ -139,7 +139,7 @@ export default ((client: ApiRequester, baseUrl: string): AuthD => ({
|
|
|
139
139
|
'Content-Type': 'application/json',
|
|
140
140
|
};
|
|
141
141
|
|
|
142
|
-
return client.post(`${baseUrl}/saml/sso`, body, headers
|
|
142
|
+
return client.post(`${baseUrl}/saml/sso`, body, headers);
|
|
143
143
|
},
|
|
144
144
|
refreshToken: (refreshToken: string, backend: string, expiration: number, isMobile?: boolean, tenantId?: string, domainName?: string): Promise<Session | null | undefined> => {
|
|
145
145
|
const body: Record<string, any> = {
|
package/src/simple/Auth.ts
CHANGED
|
@@ -168,28 +168,21 @@ export class Auth {
|
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
async initiateIdpAuthentication(domain: string, redirectUrl: string): Promise<{ location: string, saml_session_id: string } | undefined> {
|
|
171
|
-
let response;
|
|
172
171
|
try {
|
|
173
|
-
|
|
172
|
+
return await getApiClient().auth.initiateIdpAuthentication(domain, redirectUrl);
|
|
174
173
|
} catch (e: any) {
|
|
175
174
|
logger.error('Error during IdP authentication initialization:', e.message);
|
|
176
|
-
throw e;
|
|
177
|
-
}
|
|
178
175
|
|
|
179
|
-
|
|
180
|
-
if (response.status === 404) {
|
|
176
|
+
if (e.status === 404) {
|
|
181
177
|
throw new NoSamlRouteError('No route found for SAML SSO');
|
|
182
178
|
}
|
|
183
179
|
|
|
184
|
-
if (
|
|
180
|
+
if (e.status === 500) {
|
|
185
181
|
throw new SamlConfigError('SAML/server configuration error');
|
|
186
182
|
}
|
|
187
183
|
|
|
188
|
-
|
|
189
|
-
throw new Error(error.message || error.reason);
|
|
184
|
+
throw e;
|
|
190
185
|
}
|
|
191
|
-
|
|
192
|
-
return response.json();
|
|
193
186
|
}
|
|
194
187
|
|
|
195
188
|
async logInViaRefreshToken(refreshToken: string): Promise<Session | null> {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import BadResponse from '../../domain/BadResponse';
|
|
2
|
+
import ServerError from '../../domain/ServerError';
|
|
1
3
|
import getApiClient, { setRefreshToken } from '../../service/getApiClient';
|
|
2
4
|
import { Auth as AuthClass } from '../Auth';
|
|
3
5
|
|
|
@@ -124,13 +126,8 @@ describe('simple/Auth', () => {
|
|
|
124
126
|
describe('initiateIdpAuthentication', () => {
|
|
125
127
|
const validResponse = { location: 'idp.com/auth', saml_session_id: 'a1b2C3d4' };
|
|
126
128
|
|
|
127
|
-
it('should return a `location` and `saml_session_id` if the response is
|
|
128
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
129
|
-
Promise.resolve({
|
|
130
|
-
ok: true,
|
|
131
|
-
status: 303,
|
|
132
|
-
json: () => Promise.resolve(validResponse),
|
|
133
|
-
}));
|
|
129
|
+
it('should return a `location` and `saml_session_id` if the response is valid', async () => {
|
|
130
|
+
const initiateIdpAuthentication = jest.fn(() => validResponse);
|
|
134
131
|
|
|
135
132
|
(getApiClient as any).mockImplementation(() => ({
|
|
136
133
|
auth: {
|
|
@@ -141,12 +138,9 @@ describe('simple/Auth', () => {
|
|
|
141
138
|
const response = await Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz');
|
|
142
139
|
expect(response).toBe(validResponse);
|
|
143
140
|
});
|
|
141
|
+
|
|
144
142
|
it('should return a `NoSamlRouteError` if the response is a 404', async () => {
|
|
145
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
146
|
-
Promise.resolve({
|
|
147
|
-
ok: false,
|
|
148
|
-
status: 404,
|
|
149
|
-
}));
|
|
143
|
+
const initiateIdpAuthentication = jest.fn(() => { throw BadResponse.fromText('an error message', 404); });
|
|
150
144
|
|
|
151
145
|
(getApiClient as any).mockImplementation(() => ({
|
|
152
146
|
auth: {
|
|
@@ -159,80 +153,8 @@ describe('simple/Auth', () => {
|
|
|
159
153
|
);
|
|
160
154
|
});
|
|
161
155
|
|
|
162
|
-
it('should return
|
|
163
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
164
|
-
Promise.resolve({
|
|
165
|
-
ok: false,
|
|
166
|
-
json: () => Promise.resolve({ message: 'an error message', reason: 'an error reason' }),
|
|
167
|
-
}));
|
|
168
|
-
|
|
169
|
-
(getApiClient as any).mockImplementation(() => ({
|
|
170
|
-
auth: {
|
|
171
|
-
initiateIdpAuthentication,
|
|
172
|
-
},
|
|
173
|
-
}));
|
|
174
|
-
|
|
175
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow(
|
|
176
|
-
'an error message',
|
|
177
|
-
);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should return an error `reason` if there is no `message` and the response is NOT ok', async () => {
|
|
181
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
182
|
-
Promise.resolve({
|
|
183
|
-
ok: false,
|
|
184
|
-
json: () => Promise.resolve({ reason: 'an error reason' }),
|
|
185
|
-
}));
|
|
186
|
-
|
|
187
|
-
(getApiClient as any).mockImplementation(() => ({
|
|
188
|
-
auth: {
|
|
189
|
-
initiateIdpAuthentication,
|
|
190
|
-
},
|
|
191
|
-
}));
|
|
192
|
-
|
|
193
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow(
|
|
194
|
-
'an error reason',
|
|
195
|
-
);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('should return an error with a null message if there is no `message` and `reason`', async () => {
|
|
199
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
200
|
-
Promise.resolve({
|
|
201
|
-
ok: false,
|
|
202
|
-
json: () => Promise.resolve({}),
|
|
203
|
-
}));
|
|
204
|
-
|
|
205
|
-
(getApiClient as any).mockImplementation(() => ({
|
|
206
|
-
auth: {
|
|
207
|
-
initiateIdpAuthentication,
|
|
208
|
-
},
|
|
209
|
-
}));
|
|
210
|
-
|
|
211
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('');
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it('should return a NoSAMLRouteError if the response is a 404', async () => {
|
|
215
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
216
|
-
Promise.resolve({
|
|
217
|
-
ok: false,
|
|
218
|
-
status: 404,
|
|
219
|
-
}));
|
|
220
|
-
|
|
221
|
-
(getApiClient as any).mockImplementation(() => ({
|
|
222
|
-
auth: {
|
|
223
|
-
initiateIdpAuthentication,
|
|
224
|
-
},
|
|
225
|
-
}));
|
|
226
|
-
|
|
227
|
-
await expect(Auth.initiateIdpAuthentication('example.com', 'https://myapp.xyz')).rejects.toThrow('No route found for SAML SSO');
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
it('should return a SamlConfigError if the response is a 500', async () => {
|
|
231
|
-
const initiateIdpAuthentication = jest.fn(() =>
|
|
232
|
-
Promise.resolve({
|
|
233
|
-
ok: false,
|
|
234
|
-
status: 500,
|
|
235
|
-
}));
|
|
156
|
+
it('should return a `SamlConfigError` if the response is a 500', async () => {
|
|
157
|
+
const initiateIdpAuthentication = jest.fn(() => { throw ServerError.fromText('an error message', 500); });
|
|
236
158
|
|
|
237
159
|
(getApiClient as any).mockImplementation(() => ({
|
|
238
160
|
auth: {
|
|
@@ -158,3 +158,23 @@ describe('With a refresh token', () => {
|
|
|
158
158
|
});
|
|
159
159
|
});
|
|
160
160
|
});
|
|
161
|
+
|
|
162
|
+
describe('base64Encode', () => {
|
|
163
|
+
it('should encode a string using base64', () => {
|
|
164
|
+
const input = 'Hello World!';
|
|
165
|
+
const expectedOutput = 'SGVsbG8gV29ybGQh';
|
|
166
|
+
expect(ApiRequester.base64Encode(input)).toBe(expectedOutput);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should handle special characters', () => {
|
|
170
|
+
const input = 'éà$@€';
|
|
171
|
+
const expectedOutput = 'w6nDoCRA4oKs';
|
|
172
|
+
expect(ApiRequester.base64Encode(input)).toBe(expectedOutput);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should handle empty string', () => {
|
|
176
|
+
const input = '';
|
|
177
|
+
const expectedOutput = '';
|
|
178
|
+
expect(ApiRequester.base64Encode(input)).toBe(expectedOutput);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
@@ -64,7 +64,15 @@ export default class ApiRequester {
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
static base64Encode(str: string): string {
|
|
67
|
-
|
|
67
|
+
if (typeof btoa !== 'undefined') {
|
|
68
|
+
try {
|
|
69
|
+
return btoa(str);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
// fall back to Base64.encode if btoa fails
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return Base64.encode(str);
|
|
68
76
|
}
|
|
69
77
|
|
|
70
78
|
// @see https://github.com/facebook/flow/issues/183#issuecomment-358607052
|