@@ -61,6 +61,13 @@ const { client, gatekeeper } = crowdhandler.init({
6161// Validate the request
6262const result = await gatekeeper .validateRequest ();
6363
64+ // Check for errors first
65+ if (result .error ) {
66+ console .error (` Validation error: ${ result .error .message } ` );
67+ // 4xx errors: promoted = false (always block access)
68+ // 5xx errors: promoted depends on trustOnFail setting
69+ }
70+
6471// Handle the validation result
6572if (result .setCookie ) {
6673 gatekeeper .setCookie (result .cookieValue , result .domain );
@@ -192,12 +199,10 @@ try {
192199 const result = await gatekeeper .validateRequest ();
193200 // ... handle result ...
194201} catch (error) {
195- if (error .code === ' API_CONNECTION_FAILED' ) {
196- // Handle based on trustOnFail setting
197- // true = allow access, false = use fallback room
198- }
202+ console .error (' Validation failed:' , error .message );
203+ console .error (' Status code:' , error .statusCode );
204+ // Handle based on trustOnFail setting
199205}
200- ```
201206
202207### gatekeeper .setCookie (value, domain? )
203208
@@ -418,27 +423,46 @@ Full API documentation with request/response examples is available in your [Crow
418423
419424## Error Handling
420425
421- All SDK errors are instances of ` CrowdHandlerError ` with helpful context :
426+ All SDK errors are instances of ` CrowdHandlerError` with consistent structure :
422427
423428` ` ` javascript
424429try {
425430 const rooms = await client .rooms ().get ();
426431} catch (error) {
427- console .error (error .code ); // 'ROOM_NOT_FOUND'
428- console .error (error .message ); // Human-readable message
429- console .error (error .suggestion ); // Helpful next steps
430- console .error (error .statusCode ); // HTTP status code
432+ console .error (error .message ); // The actual API error message
433+ console .error (error .statusCode ); // HTTP status code (e.g., 401, 404)
434+ console .error (error .suggestion ); // Helpful guidance for resolution
435+ console .error (error .code ); // Error code for programmatic handling
431436}
432437` ` `
433438
434- ### Error Codes
439+ ### API Error Transparency
440+
441+ The SDK preserves the exact error messages from the CrowdHandler API, allowing you to handle specific error scenarios:
442+
443+ ` ` ` javascript
444+ try {
445+ const result = await gatekeeper .validateRequest ({
446+ custom: { code: ' user-code' }
447+ });
448+ } catch (error) {
449+ // Check the specific error message from the API
450+ if (error .message .includes (' Invalid priority code' )) {
451+ // Handle invalid access code
452+ }
453+
454+ // For advanced debugging, access the full API response
455+ const apiResponse = error .context ? .apiResponse ;
456+ }
457+ ` ` `
458+
459+ ### Common Error Codes
435460
436461- ` INVALID_CONFIG ` - Invalid SDK configuration
437462- ` MISSING_PRIVATE_KEY ` - Private key required for this operation
438463- ` API_CONNECTION_FAILED ` - Cannot reach CrowdHandler API
439- - ` RESOURCE_NOT_FOUND ` - Requested resource doesn't exist
440- - ` RATE_LIMITED ` - Too many requests
441- - Plus more specific error codes
464+ - ` API_INVALID_RESPONSE ` - API returned an error
465+ - ` RATE_LIMITED ` - Too many requests (includes retry-after)
442466
443467## Integration Examples
444468
@@ -468,6 +492,13 @@ async function protectRoute(req, res, next) {
468492
469493 const result = await gatekeeper .validateRequest ();
470494
495+ // Check if there was an error during validation
496+ if (result .error ) {
497+ console .error (` API Error ${ result .error .statusCode } : ${ result .error .message } ` );
498+ // 4xx errors (e.g., invalid key, bad request): promoted = false (user blocked)
499+ // 5xx errors (e.g., server error): promoted based on trustOnFail setting
500+ }
501+
471502 if (result .setCookie ) {
472503 gatekeeper .setCookie (result .cookieValue , result .domain );
473504 }
@@ -484,8 +515,10 @@ async function protectRoute(req, res, next) {
484515 res .locals .gatekeeper = gatekeeper;
485516 next ();
486517 } catch (error) {
487- console .error (' CrowdHandler error:' , error);
488- // Decide whether to block or allow on error
518+ // This catches unexpected errors (e.g., network issues, config errors)
519+ console .error (' CrowdHandler SDK error:' , error .message );
520+ // trustOnFail: true (default) = allow access on error
521+ // trustOnFail: false = block access on error
489522 next ();
490523 }
491524}
@@ -607,6 +640,36 @@ await gatekeeper.recordPerformance({
607640});
608641` ` `
609642
643+ ### Test Error Simulation
644+
645+ For testing your error handling without making real API calls, you can simulate errors:
646+
647+ ` ` ` javascript
648+ const { gatekeeper } = init ({
649+ publicKey: ' YOUR_PUBLIC_KEY' ,
650+ request: req,
651+ response: res,
652+ options: {
653+ testError: {
654+ statusCode: 500 , // Simulate a 500 error
655+ message: ' Simulated server error for testing'
656+ }
657+ }
658+ });
659+
660+ // This will return immediately with a simulated error
661+ const result = await gatekeeper .validateRequest ();
662+ // result.error will contain the test error
663+ // result.promoted will be true (with default trustOnFail: true)
664+ ` ` `
665+
666+ This is useful for:
667+ - Testing error handling logic in development
668+ - Verifying fallback behavior for different error types
669+ - Integration testing without affecting production metrics
670+
671+ Note: 4xx test errors will always set ` promoted: false ` , while 5xx test errors respect your ` trustOnFail` setting.
672+
610673### Lite Validator Mode
611674
612675Lite validator mode provides token refresh without API calls by checking room configuration locally. To enable it:
0 commit comments