Skip to content

Commit cc5d6fd

Browse files
committed
err msg
1 parent 36d7ef7 commit cc5d6fd

36 files changed

+244
-208
lines changed

lib/core/bucketer/index.tests.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929
USER_NOT_IN_ANY_EXPERIMENT,
3030
USER_ASSIGNED_TO_EXPERIMENT_BUCKET,
3131
} from '.';
32+
import { OptimizelyError } from '../../error/optimizly_error';
3233

3334
var buildLogMessageFromArgs = args => sprintf(args[1], ...args.splice(2));
3435
var testData = getTestProjectConfig();
@@ -204,9 +205,11 @@ describe('lib/core/bucketer', function () {
204205
var bucketerParamsWithInvalidGroupId = cloneDeep(bucketerParams);
205206
bucketerParamsWithInvalidGroupId.experimentIdMap[configObj.experiments[4].id].groupId = '6969';
206207

207-
assert.throws(function () {
208+
const ex = assert.throws(function () {
208209
bucketer.bucket(bucketerParamsWithInvalidGroupId);
209-
}, sprintf(INVALID_GROUP_ID, 'BUCKETER', '6969'));
210+
});
211+
assert.equal(ex.baseMessage, INVALID_GROUP_ID);
212+
assert.deepEqual(ex.params, ['6969']);
210213
});
211214
});
212215

@@ -343,10 +346,7 @@ describe('lib/core/bucketer', function () {
343346
const response = assert.throws(function() {
344347
bucketer._generateBucketValue(null);
345348
} );
346-
expect([
347-
sprintf(INVALID_BUCKETING_ID, 'BUCKETER', null, "Cannot read property 'length' of null"), // node v14
348-
sprintf(INVALID_BUCKETING_ID, 'BUCKETER', null, "Cannot read properties of null (reading \'length\')") // node v16
349-
]).contain(response.message);
349+
expect(response.baseMessage).to.equal(INVALID_BUCKETING_ID);
350350
});
351351
});
352352

lib/core/bucketer/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {
2929

3030
import { LOG_LEVEL } from '../../utils/enums';
3131
import { INVALID_BUCKETING_ID, INVALID_GROUP_ID } from '../../error_messages';
32+
import { OptimizelyError } from '../../error/optimizly_error';
3233

3334
export const USER_NOT_IN_ANY_EXPERIMENT = 'User %s is not in any experiment of group %s.';
3435
export const USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP = 'User %s is not in experiment %s of group %s.';
@@ -66,7 +67,7 @@ export const bucket = function(bucketerParams: BucketerParams): DecisionResponse
6667
if (groupId) {
6768
const group = bucketerParams.groupIdMap[groupId];
6869
if (!group) {
69-
throw new Error(sprintf(INVALID_GROUP_ID, MODULE_NAME, groupId));
70+
throw new OptimizelyError(INVALID_GROUP_ID, groupId);
7071
}
7172
if (group.policy === RANDOM_POLICY) {
7273
const bucketedExperimentId = bucketUserIntoExperiment(
@@ -228,7 +229,7 @@ export const _generateBucketValue = function(bucketingKey: string): number {
228229
const ratio = hashValue / MAX_HASH_VALUE;
229230
return Math.floor(ratio * MAX_TRAFFIC_VALUE);
230231
} catch (ex: any) {
231-
throw new Error(sprintf(INVALID_BUCKETING_ID, MODULE_NAME, bucketingKey, ex.message));
232+
throw new OptimizelyError(INVALID_BUCKETING_ID, bucketingKey, ex.message);
232233
}
233234
};
234235

lib/core/decision_service/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ import {
9696
VALID_BUCKETING_ID,
9797
VARIATION_REMOVED_FOR_USER,
9898
} from '../../log_messages';
99+
import { OptimizelyError } from '../../error/optimizly_error';
99100

100101
export const MODULE_NAME = 'DECISION_SERVICE';
101102

@@ -975,7 +976,7 @@ export class DecisionService {
975976
*/
976977
removeForcedVariation(userId: string, experimentId: string, experimentKey: string): void {
977978
if (!userId) {
978-
throw new Error(sprintf(INVALID_USER_ID, MODULE_NAME));
979+
throw new OptimizelyError(INVALID_USER_ID);
979980
}
980981

981982
if (this.forcedVariationMap.hasOwnProperty(userId)) {
@@ -986,7 +987,7 @@ export class DecisionService {
986987
userId,
987988
);
988989
} else {
989-
throw new Error(sprintf(USER_NOT_IN_FORCED_VARIATION, MODULE_NAME, userId));
990+
throw new OptimizelyError(USER_NOT_IN_FORCED_VARIATION, userId);
990991
}
991992
}
992993

lib/error_messages.ts

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,33 @@ export const BROWSER_ODP_MANAGER_INITIALIZATION_FAILED = '%s: Error initializing
1818
export const CONDITION_EVALUATOR_ERROR = 'Error evaluating audience condition of type %s: %s';
1919
export const DATAFILE_AND_SDK_KEY_MISSING =
2020
'%s: You must provide at least one of sdkKey or datafile. Cannot start Optimizely';
21-
export const EXPERIMENT_KEY_NOT_IN_DATAFILE = '%s: Experiment key %s is not in datafile.';
21+
export const EXPERIMENT_KEY_NOT_IN_DATAFILE = 'Experiment key %s is not in datafile.';
2222
export const FEATURE_NOT_IN_DATAFILE = 'Feature key %s is not in datafile.';
2323
export const FETCH_SEGMENTS_FAILED_NETWORK_ERROR = '%s: Audience segments fetch failed. (network error)';
2424
export const FETCH_SEGMENTS_FAILED_DECODE_ERROR = '%s: Audience segments fetch failed. (decode error)';
2525
export const IMPROPERLY_FORMATTED_EXPERIMENT = 'Experiment key %s is improperly formatted.';
26-
export const INVALID_ATTRIBUTES = '%s: Provided attributes are in an invalid format.';
27-
export const INVALID_BUCKETING_ID = '%s: Unable to generate hash for bucketing ID %s: %s';
28-
export const INVALID_DATAFILE = '%s: Datafile is invalid - property %s: %s';
29-
export const INVALID_DATAFILE_MALFORMED = '%s: Datafile is invalid because it is malformed.';
30-
export const INVALID_CONFIG = '%s: Provided Optimizely config is in an invalid format.';
31-
export const INVALID_JSON = '%s: JSON object is not valid.';
32-
export const INVALID_ERROR_HANDLER = '%s: Provided "errorHandler" is in an invalid format.';
33-
export const INVALID_EVENT_DISPATCHER = '%s: Provided "eventDispatcher" is in an invalid format.';
34-
export const INVALID_EVENT_TAGS = '%s: Provided event tags are in an invalid format.';
26+
export const INVALID_ATTRIBUTES = 'Provided attributes are in an invalid format.';
27+
export const INVALID_BUCKETING_ID = 'Unable to generate hash for bucketing ID %s: %s';
28+
export const INVALID_DATAFILE = 'Datafile is invalid - property %s: %s';
29+
export const INVALID_DATAFILE_MALFORMED = 'Datafile is invalid because it is malformed.';
30+
export const INVALID_CONFIG = 'Provided Optimizely config is in an invalid format.';
31+
export const INVALID_JSON = 'JSON object is not valid.';
32+
export const INVALID_ERROR_HANDLER = 'Provided "errorHandler" is in an invalid format.';
33+
export const INVALID_EVENT_DISPATCHER = 'Provided "eventDispatcher" is in an invalid format.';
34+
export const INVALID_EVENT_TAGS = 'Provided event tags are in an invalid format.';
3535
export const INVALID_EXPERIMENT_KEY =
3636
'Experiment key %s is not in datafile. It is either invalid, paused, or archived.';
3737
export const INVALID_EXPERIMENT_ID = 'Experiment ID %s is not in datafile.';
38-
export const INVALID_GROUP_ID = '%s: Group ID %s is not in datafile.';
39-
export const INVALID_LOGGER = '%s: Provided "logger" is in an invalid format.';
38+
export const INVALID_GROUP_ID = 'Group ID %s is not in datafile.';
39+
export const INVALID_LOGGER = 'Provided "logger" is in an invalid format.';
4040
export const INVALID_ROLLOUT_ID = 'Invalid rollout ID %s attached to feature %s';
41-
export const INVALID_USER_ID = '%s: Provided user ID is in an invalid format.';
42-
export const INVALID_USER_PROFILE_SERVICE = '%s: Provided user profile service instance is in an invalid format: %s.';
41+
export const INVALID_USER_ID = 'Provided user ID is in an invalid format.';
42+
export const INVALID_USER_PROFILE_SERVICE = 'Provided user profile service instance is in an invalid format: %s.';
4343
export const LOCAL_STORAGE_DOES_NOT_EXIST = 'Error accessing window localStorage.';
4444
export const MISSING_INTEGRATION_KEY =
45-
'%s: Integration key missing from datafile. All integrations should include a key.';
46-
export const NO_DATAFILE_SPECIFIED = '%s: No datafile specified. Cannot start optimizely.';
47-
export const NO_JSON_PROVIDED = '%s: No JSON object to validate against schema.';
45+
'Integration key missing from datafile. All integrations should include a key.';
46+
export const NO_DATAFILE_SPECIFIED = 'No datafile specified. Cannot start optimizely.';
47+
export const NO_JSON_PROVIDED = 'No JSON object to validate against schema.';
4848
export const NO_EVENT_PROCESSOR = 'No event processor is provided';
4949
export const NO_VARIATION_FOR_EXPERIMENT_KEY = 'No variation key %s defined in datafile for experiment %s.';
5050
export const ODP_CONFIG_NOT_AVAILABLE = '%s: ODP is not integrated to the project.';
@@ -79,21 +79,21 @@ export const ODP_VUID_INITIALIZATION_FAILED = '%s: ODP VUID initialization faile
7979
export const ODP_VUID_REGISTRATION_FAILED = '%s: ODP VUID failed to be registered.';
8080
export const ODP_VUID_REGISTRATION_FAILED_EVENT_MANAGER_MISSING =
8181
'%s: ODP register vuid failed. (Event Manager not instantiated).';
82-
export const UNDEFINED_ATTRIBUTE = '%s: Provided attribute: %s has an undefined value.';
82+
export const UNDEFINED_ATTRIBUTE = 'Provided attribute: %s has an undefined value.';
8383
export const UNRECOGNIZED_ATTRIBUTE =
8484
'Unrecognized attribute %s provided. Pruning before sending event to Optimizely.';
8585
export const UNABLE_TO_CAST_VALUE = 'Unable to cast value %s to type %s, returning null.';
8686
export const USER_NOT_IN_FORCED_VARIATION =
87-
'%s: User %s is not in the forced variation map. Cannot remove their forced variation.';
87+
'User %s is not in the forced variation map. Cannot remove their forced variation.';
8888
export const USER_PROFILE_LOOKUP_ERROR = 'Error while looking up user profile for user ID "%s": %s.';
8989
export const USER_PROFILE_SAVE_ERROR = 'Error while saving user profile for user ID "%s": %s.';
9090
export const VARIABLE_KEY_NOT_IN_DATAFILE =
9191
'%s: Variable with key "%s" associated with feature with key "%s" is not in datafile.';
9292
export const VARIATION_ID_NOT_IN_DATAFILE = '%s: No variation ID %s defined in datafile for experiment %s.';
9393
export const VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT = 'Variation ID %s is not in the datafile.';
94-
export const INVALID_INPUT_FORMAT = '%s: Provided %s is in an invalid format.';
94+
export const INVALID_INPUT_FORMAT = 'Provided %s is in an invalid format.';
9595
export const INVALID_DATAFILE_VERSION =
96-
'%s: This version of the JavaScript SDK does not support the given datafile version: %s';
96+
'This version of the JavaScript SDK does not support the given datafile version: %s';
9797
export const INVALID_VARIATION_KEY = 'Provided variation key is in an invalid format.';
9898
export const UNABLE_TO_GET_VUID = 'Unable to get VUID - ODP Manager is not instantiated yet.';
9999
export const ERROR_FETCHING_DATAFILE = 'Error fetching datafile: %s';
@@ -126,5 +126,25 @@ export const REQUEST_TIMEOUT = 'Request timeout';
126126
export const REQUEST_ERROR = 'Request error';
127127
export const NO_STATUS_CODE_IN_RESPONSE = 'No status code in response';
128128
export const UNSUPPORTED_PROTOCOL = 'Unsupported protocol: %s';
129+
export const ONREADY_TIMEOUT = 'onReady timeout expired after %s ms';
130+
export const INSTANCE_CLOSED = 'Instance closed';
131+
export const DATAFILE_MANAGER_STOPPED = 'Datafile manager stopped before it could be started';
132+
export const FAILED_TO_FETCH_DATAFILE = 'Failed to fetch datafile';
133+
export const NO_SDKKEY_OR_DATAFILE = 'At least one of sdkKey or datafile must be provided';
134+
export const RETRY_CANCELLED = 'Retry cancelled';
135+
export const SERVICE_STOPPED_BEFORE_IT_WAS_STARTED = 'Service stopped before it was started';
136+
export const ONLY_POST_REQUESTS_ARE_SUPPORTED = 'Only POST requests are supported';
137+
export const SEND_BEACON_FAILED = 'sendBeacon failed';
138+
export const FAILED_TO_DISPATCH_EVENTS = 'Failed to dispatch events'
139+
export const FAILED_TO_DISPATCH_EVENTS_WITH_ARG = 'Failed to dispatch events: %s';
140+
export const EVENT_PROCESSOR_STOPPED = 'Event processor stopped before it could be started';
141+
export const CANNOT_START_WITHOUT_ODP_CONFIG = 'cannot start without ODP config';
142+
export const START_CALLED_WHEN_ODP_IS_NOT_INTEGRATED = 'start() called when ODP is not integrated';
143+
export const ODP_ACTION_IS_NOT_VALID = 'ODP action is not valid (cannot be empty).';
144+
export const ODP_MANAGER_STOPPED_BEFORE_RUNNING = 'odp manager stopped before running';
145+
export const ODP_EVENT_MANAGER_STOPPED = "ODP event manager stopped before it could start";
146+
export const ONREADY_TIMEOUT_EXPIRED = 'onReady timeout expired after %s ms';
147+
export const DATAFILE_MANAGER_FAILED_TO_START = 'Datafile manager failed to start';
148+
129149

130150
export const messages: string[] = [];

lib/event_processor/batch_event_processor.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import { isSuccessStatusCode } from "../utils/http_request_handler/http_util";
2727
import { EventEmitter } from "../utils/event_emitter/event_emitter";
2828
import { IdGenerator } from "../utils/id_generator";
2929
import { areEventContextsEqual } from "./event_builder/user_event";
30-
import { EVENT_PROCESSOR_STOPPED, FAILED_TO_DISPATCH_EVENTS, FAILED_TO_DISPATCH_EVENTS_WITH_ARG } from "../exception_messages";
31-
import { sprintf } from "../utils/fns";
30+
import { EVENT_PROCESSOR_STOPPED, FAILED_TO_DISPATCH_EVENTS, FAILED_TO_DISPATCH_EVENTS_WITH_ARG } from "../error_messages";
31+
import { OptimizelyError } from "../error/optimizly_error";
3232

3333
export const DEFAULT_MIN_BACKOFF = 1000;
3434
export const DEFAULT_MAX_BACKOFF = 32000;
@@ -165,7 +165,7 @@ export class BatchEventProcessor extends BaseService implements EventProcessor {
165165
const dispatcher = closing && this.closingEventDispatcher ? this.closingEventDispatcher : this.eventDispatcher;
166166
return dispatcher.dispatchEvent(request).then((res) => {
167167
if (res.statusCode && !isSuccessStatusCode(res.statusCode)) {
168-
return Promise.reject(new Error(sprintf(FAILED_TO_DISPATCH_EVENTS_WITH_ARG, res.statusCode)));
168+
return Promise.reject(new OptimizelyError(FAILED_TO_DISPATCH_EVENTS_WITH_ARG, res.statusCode));
169169
}
170170
return Promise.resolve(res);
171171
});
@@ -276,7 +276,7 @@ export class BatchEventProcessor extends BaseService implements EventProcessor {
276276
}
277277

278278
if (this.isNew()) {
279-
this.startPromise.reject(new Error(EVENT_PROCESSOR_STOPPED));
279+
this.startPromise.reject(new OptimizelyError(EVENT_PROCESSOR_STOPPED));
280280
}
281281

282282
this.state = ServiceState.Stopping;

lib/event_processor/event_dispatcher/default_dispatcher.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
import { ONLY_POST_REQUESTS_ARE_SUPPORTED } from '../../exception_messages';
16+
import { OptimizelyError } from '../../error/optimizly_error';
17+
import { ONLY_POST_REQUESTS_ARE_SUPPORTED } from '../../error_messages';
1718
import { RequestHandler } from '../../utils/http_request_handler/http';
1819
import { EventDispatcher, EventDispatcherResponse, LogEvent } from './event_dispatcher';
1920

@@ -29,7 +30,7 @@ export class DefaultEventDispatcher implements EventDispatcher {
2930
): Promise<EventDispatcherResponse> {
3031
// Non-POST requests not supported
3132
if (eventObj.httpVerb !== 'POST') {
32-
return Promise.reject(new Error(ONLY_POST_REQUESTS_ARE_SUPPORTED));
33+
return Promise.reject(new OptimizelyError(ONLY_POST_REQUESTS_ARE_SUPPORTED));
3334
}
3435

3536
const dataString = JSON.stringify(eventObj.params);

lib/event_processor/event_dispatcher/send_beacon_dispatcher.browser.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { SEND_BEACON_FAILED } from '../../exception_messages';
17+
import { OptimizelyError } from '../../error/optimizly_error';
18+
import { SEND_BEACON_FAILED } from '../../error_messages';
1819
import { EventDispatcher, EventDispatcherResponse } from './event_dispatcher';
1920

2021
export type Event = {
@@ -42,7 +43,7 @@ export const dispatchEvent = function(
4243
if(success) {
4344
return Promise.resolve({});
4445
}
45-
return Promise.reject(new Error(SEND_BEACON_FAILED));
46+
return Promise.reject(new OptimizelyError(SEND_BEACON_FAILED));
4647
}
4748

4849
const eventDispatcher : EventDispatcher = {

lib/event_processor/forwarding_event_processor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import { buildLogEvent } from './event_builder/log_event';
2323
import { BaseService, ServiceState } from '../service';
2424
import { EventEmitter } from '../utils/event_emitter/event_emitter';
2525
import { Consumer, Fn } from '../utils/type';
26-
import { SERVICE_STOPPED_BEFORE_IT_WAS_STARTED } from '../exception_messages';
26+
import { SERVICE_STOPPED_BEFORE_IT_WAS_STARTED } from '../error_messages';
27+
import { OptimizelyError } from '../error/optimizly_error';
2728
class ForwardingEventProcessor extends BaseService implements EventProcessor {
2829
private dispatcher: EventDispatcher;
2930
private eventEmitter: EventEmitter<{ dispatch: LogEvent }>;
@@ -55,7 +56,7 @@ class ForwardingEventProcessor extends BaseService implements EventProcessor {
5556
}
5657

5758
if (this.isNew()) {
58-
this.startPromise.reject(new Error(SERVICE_STOPPED_BEFORE_IT_WAS_STARTED));
59+
this.startPromise.reject(new OptimizelyError(SERVICE_STOPPED_BEFORE_IT_WAS_STARTED));
5960
}
6061

6162
this.state = ServiceState.Terminated;

lib/exception_messages.ts

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,4 @@
1414
* limitations under the License.
1515
*/
1616

17-
export const FAILED_TO_DISPATCH_EVENTS = 'Failed to dispatch events'
18-
export const FAILED_TO_DISPATCH_EVENTS_WITH_ARG = 'Failed to dispatch events: %s';
19-
export const EVENT_PROCESSOR_STOPPED = 'Event processor stopped before it could be started';
20-
export const SERVICE_STOPPED_BEFORE_IT_WAS_STARTED = 'Service stopped before it was started';
21-
export const ONLY_POST_REQUESTS_ARE_SUPPORTED = 'Only POST requests are supported';
22-
export const SEND_BEACON_FAILED = 'sendBeacon failed';
23-
export const CANNOT_START_WITHOUT_ODP_CONFIG = 'cannot start without ODP config';
24-
export const START_CALLED_WHEN_ODP_IS_NOT_INTEGRATED = 'start() called when ODP is not integrated';
25-
export const ODP_ACTION_IS_NOT_VALID = 'ODP action is not valid (cannot be empty).';
26-
export const ODP_MANAGER_STOPPED_BEFORE_RUNNING = 'odp manager stopped before running';
27-
export const ODP_EVENT_MANAGER_STOPPED = "ODP event manager stopped before it could start";
28-
export const ONREADY_TIMEOUT_EXPIRED = 'onReady timeout expired after %s ms';
29-
export const INSTANCE_CLOSED = 'Instance closed';
30-
export const DATAFILE_MANAGER_STOPPED = 'Datafile manager stopped before it could be started';
31-
export const DATAFILE_MANAGER_FAILED_TO_START = 'Datafile manager failed to start';
32-
export const FAILED_TO_FETCH_DATAFILE = 'Failed to fetch datafile';
33-
export const FAILED_TO_STOP = 'Failed to stop';
34-
export const YOU_MUST_PROVIDE_AT_LEAST_ONE_OF_SDKKEY_OR_DATAFILE = 'You must provide at least one of sdkKey or datafile';
35-
export const RETRY_CANCELLED = 'Retry cancelled';
36-
export const REQUEST_FAILED = 'Request failed';
37-
export const PROMISE_SHOULD_NOT_HAVE_RESOLVED = 'Promise should not have resolved';
38-
export const VUID_IS_NOT_SUPPORTED_IN_NODEJS= 'VUID is not supported in Node.js environment';
17+

lib/odp/event_manager/odp_event_api_manager.spec.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ const PIXEL_URL = 'https://odp.pixel.com';
4141
const odpConfig = new OdpConfig(API_KEY, API_HOST, PIXEL_URL, []);
4242

4343
import { getMockRequestHandler } from '../../tests/mock/mock_request_handler';
44-
import { REQUEST_FAILED } from '../../exception_messages';
4544

4645
describe('DefaultOdpEventApiManager', () => {
4746
it('should generate the event request using the correct odp config and event', async () => {
@@ -101,7 +100,7 @@ describe('DefaultOdpEventApiManager', () => {
101100
it('should return a promise that fails if the requestHandler response promise fails', async () => {
102101
const mockRequestHandler = getMockRequestHandler();
103102
mockRequestHandler.makeRequest.mockReturnValue({
104-
responsePromise: Promise.reject(new Error(REQUEST_FAILED)),
103+
responsePromise: Promise.reject(new Error('REQUEST_FAILED')),
105104
});
106105
const requestGenerator = vi.fn().mockReturnValue({
107106
method: 'PATCH',
@@ -115,7 +114,7 @@ describe('DefaultOdpEventApiManager', () => {
115114
const manager = new DefaultOdpEventApiManager(mockRequestHandler, requestGenerator);
116115
const response = manager.sendEvents(odpConfig, ODP_EVENTS);
117116

118-
await expect(response).rejects.toThrow('Request failed');
117+
await expect(response).rejects.toThrow();
119118
});
120119

121120
it('should return a promise that resolves with correct response code from the requestHandler', async () => {

0 commit comments

Comments
 (0)