Skip to content

Commit cab2246

Browse files
in-waiting room support
1 parent a7bd960 commit cab2246

18 files changed

Lines changed: 1062 additions & 232 deletions

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ const result = await gatekeeper.validateRequest();
159159
deployment: string, // Deployment identifier from the API
160160
token: string, // The session token
161161
hash: string | null, // Signature hash for validation (when available)
162+
requested: string, // Timestamp when the request was made
162163
liteValidatorRedirect: boolean, // true = redirect to lite validator
163164
liteValidatorUrl: string // URL for lite validator redirect
164165
}
@@ -214,6 +215,19 @@ if (!result.promoted) {
214215
}
215216
```
216217

218+
### gatekeeper.redirectIfPromoted()
219+
220+
Redirects promoted users from a waiting room implementation back to the target site with fresh CrowdHandler parameters. This method is specifically for use in waiting room implementations.
221+
222+
```javascript
223+
// In waiting room implementation
224+
if (result.promoted) {
225+
return gatekeeper.redirectIfPromoted();
226+
}
227+
```
228+
229+
**Use Case:** When building a custom waiting room that runs on your infrastructure, this method handles the redirect back to the protected resource with proper CrowdHandler parameters.
230+
217231
### gatekeeper.recordPerformance(options?)
218232

219233
Records performance metrics to help CrowdHandler optimize queue flow and capacity.
@@ -265,6 +279,7 @@ const instance = crowdhandler.init({
265279
trustOnFail: true, // Allow access if API fails
266280
fallbackSlug: '', // Fallback room slug when trustOnFail is false
267281
cookieName: 'crowdhandler', // Custom cookie name (default: 'crowdhandler')
282+
waitingRoom: false, // Set to true if SDK is running in a waiting room context
268283
liteValidator: false, // Enable lite validator mode (default: false)
269284
roomsConfig: [{ // Array of room configurations for lite validator
270285
domain: string, // e.g. 'https://example.com'

dist/common/types.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22
Object.defineProperty(exports, "__esModule", { value: true });
3-
exports.Modes = exports.RecordPerformanceOptions = exports.SessionStatusWrapper = exports.HttpErrorWrapper = exports.ValidateRequestObject = exports.TokenObjectConstructor = exports.TokenObject = exports.ExtractTokenOptions = exports.SignatureSourceObject = exports.SignatureResponseObject = exports.SignatureObject = exports.RoomMetaObject = exports.LocalStorageOptions = exports.LocalStorageObject = exports.CookieObject = exports.RequestObject = exports.ProcessURLResultObject = exports.SpecialParametersObject = exports.QueryObject = exports.GatekeeperKeyPair = exports.GatekeeperOptions = exports.RoomsConfig = exports.RoomConfig = void 0;
3+
exports.Modes = exports.RecordPerformanceOptions = exports.SessionStatusWrapper = exports.HttpErrorWrapper = exports.ValidateRequestObject = exports.TokenObjectConstructor = exports.TokenObject = exports.ExtractTokenOptions = exports.SignatureSourceObject = exports.SignatureResponseObject = exports.SignatureObject = exports.RoomMetaObject = exports.LocalStorageOptions = exports.LocalStorageObject = exports.CookieObject = exports.RequestObject = exports.ProcessURLResultObject = exports.SessionRequestConfig = exports.SpecialParametersObject = exports.QueryObject = exports.GatekeeperKeyPair = exports.GatekeeperOptions = exports.RoomsConfig = exports.RoomConfig = void 0;
44
var zod_1 = require("zod");
55
// Lite Validator types
66
exports.RoomConfig = zod_1.z.object({
@@ -21,7 +21,8 @@ exports.GatekeeperOptions = zod_1.z.object({
2121
trustOnFail: zod_1.z.boolean().optional(),
2222
cookieName: zod_1.z.string().optional(),
2323
liteValidator: zod_1.z.boolean().optional(),
24-
roomsConfig: exports.RoomsConfig.optional(), // Array of room configs
24+
roomsConfig: exports.RoomsConfig.optional(),
25+
waitingRoom: zod_1.z.boolean().optional(),
2526
});
2627
exports.GatekeeperKeyPair = zod_1.z.object({
2728
publicKey: zod_1.z.string(),
@@ -44,6 +45,14 @@ exports.SpecialParametersObject = zod_1.z.object({
4445
chPublicKey: zod_1.z.string(),
4546
chRequested: zod_1.z.string(),
4647
});
48+
// Request configuration for session status API calls
49+
exports.SessionRequestConfig = zod_1.z.object({
50+
agent: zod_1.z.string().optional(),
51+
ip: zod_1.z.string().optional(),
52+
lang: zod_1.z.string().optional(),
53+
url: zod_1.z.string().optional(),
54+
slug: zod_1.z.string().optional(),
55+
});
4756
exports.ProcessURLResultObject = zod_1.z.object({
4857
targetURL: zod_1.z.string(),
4958
specialParameters: exports.SpecialParametersObject,
@@ -127,6 +136,7 @@ exports.ValidateRequestObject = zod_1.z.object({
127136
deployment: zod_1.z.string().optional(),
128137
hash: zod_1.z.string().nullable().optional(),
129138
token: zod_1.z.string().optional(),
139+
requested: zod_1.z.string().optional(),
130140
liteValidatorRedirect: zod_1.z.boolean().optional(),
131141
liteValidatorUrl: zod_1.z.string().optional(),
132142
});
@@ -144,6 +154,8 @@ exports.SessionStatusWrapper = zod_1.z.object({
144154
status: zod_1.z.number().nullable(),
145155
slug: zod_1.z.string().nullable().optional(),
146156
token: zod_1.z.string().nullable().optional(),
157+
urlRedirect: zod_1.z.string().nullable().optional(),
158+
requested: zod_1.z.string().nullable().optional(),
147159
})
148160
.catchall(zod_1.z.any()),
149161
});

0 commit comments

Comments
 (0)