Skip to content

Commit 05a8b1e

Browse files
Merge pull request #906 from ranfisfrancisco/master
Add openPopupWithLock and use to open login popup
2 parents e1689ac + 32a4376 commit 05a8b1e

8 files changed

+95
-9
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG.md
22

3+
## [2.14.5] - 2024-08-02
4+
Added:
5+
- Made change to prevent more than one login popup from appearing when an embedded CCP is opened in two or more tabs.
6+
37
## [2.14.1] - 2024-03-29
48
Added:
59
- `initCCP` param to set custom ringtone for chat.

package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "amazon-connect-streams",
3-
"version": "2.14.4",
3+
"version": "2.14.5",
44
"description": "Amazon Connect Streams Library",
55
"engines": {
66
"node": ">=12.0.0"

release/connect-streams-dr-min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

release/connect-streams-dr.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

release/connect-streams-min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

release/connect-streams.js

+43-2
Original file line numberDiff line numberDiff line change
@@ -26896,7 +26896,7 @@ AWS.apiLoader.services['connect']['2017-02-15'] = require('../apis/connect-2017-
2689626896

2689726897
connect.core = {};
2689826898
connect.core.initialized = false;
26899-
connect.version = "2.14.4";
26899+
connect.version = "2.14.5";
2690026900
connect.outerContextStreamsVersion = null;
2690126901
connect.DEFAULT_BATCH_SIZE = 500;
2690226902

@@ -26940,6 +26940,8 @@ AWS.apiLoader.services['connect']['2017-02-15'] = require('../apis/connect-2017-
2694026940
const SNAPSHOT_TOTAL_PROCESSING_TIME = 'SnapshotTotalProcessingTime';
2694126941
const SNAPSHOT_COMPARISON_STEP_TIME = 'SnapshotComparisonStepTime';
2694226942

26943+
var CHECK_LOGIN_POPUP_INTERVAL_MS = 1000;
26944+
2694326945
const APP = {
2694426946
GUIDES: 'customviews',
2694526947
};
@@ -28334,7 +28336,7 @@ AWS.apiLoader.services['connect']['2017-02-15'] = require('../apis/connect-2017-
2833428336
try {
2833528337
var loginUrl = getLoginUrl(params);
2833628338
connect.getLog().warn("ACK_TIMEOUT occurred, attempting to pop the login page if not already open.").sendInternalLogToServer();
28337-
connect.core.loginWindow = connect.core.getPopupManager().open(loginUrl, connect.MasterTopics.LOGIN_POPUP, params.loginOptions);
28339+
connect.core._openPopupWithLock(loginUrl, params.loginOptions)
2833828340
} catch (e) {
2833928341
connect.getLog().error("ACK_TIMEOUT occurred but we are unable to open the login popup.").withException(e).sendInternalLogToServer();
2834028342
}
@@ -28405,6 +28407,45 @@ AWS.apiLoader.services['connect']['2017-02-15'] = require('../apis/connect-2017-
2840528407
};
2840628408
};
2840728409

28410+
connect.core._openPopupWithLock = function (loginUrl, loginOptions) {
28411+
const lockName = "connect-login-popup-lock" + loginUrl;
28412+
28413+
try {
28414+
navigator.locks.request(lockName, {mode: 'exclusive', ifAvailable: true }, async lock => {
28415+
if (!lock) {
28416+
connect.getLog().info("Popup already opened by another tab.").sendInternalLogToServer();
28417+
return;
28418+
}
28419+
connect.getLog().info("Opening popup window with weblock.").sendInternalLogToServer();
28420+
28421+
connect.core.loginWindow = connect.core.getPopupManager().open(loginUrl, connect.MasterTopics.LOGIN_POPUP, loginOptions);
28422+
28423+
connect.core._shouldHoldPopupLock = true;
28424+
28425+
const checkPopupInterval = setInterval(function() {
28426+
if (!connect.core.loginWindow || connect.core.loginWindow?.closed) {
28427+
clearInterval(checkPopupInterval);
28428+
connect.core._shouldHoldPopupLock = false;
28429+
connect.getLog().info("Cleared check popup interval.").sendInternalLogToServer();
28430+
}
28431+
}, CHECK_LOGIN_POPUP_INTERVAL_MS);
28432+
28433+
// hold the lock until the popup is closed
28434+
while (connect.core._shouldHoldPopupLock) {
28435+
await new Promise(resolve => setTimeout(resolve, 1000));
28436+
}
28437+
28438+
connect.getLog().info("Releasing weblock for opening login popup.").sendInternalLogToServer();
28439+
})
28440+
} catch (e) {
28441+
connect.getLog().error("Failed to use weblock to open popup. Your browser may be out of date.").withException(e).sendInternalLogToServer();
28442+
28443+
if (!connect.core.loginWindow){
28444+
connect.core.loginWindow = connect.core.getPopupManager().open(loginUrl, connect.MasterTopics.LOGIN_POPUP, loginOptions);
28445+
}
28446+
}
28447+
};
28448+
2840828449
connect.core.onIframeRetriesExhausted = function(f) {
2840928450
connect.core.getEventBus().subscribe(connect.EventType.IFRAME_RETRIES_EXHAUSTED, f);
2841028451
}

src/core.js

+42-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
const SNAPSHOT_TOTAL_PROCESSING_TIME = 'SnapshotTotalProcessingTime';
5656
const SNAPSHOT_COMPARISON_STEP_TIME = 'SnapshotComparisonStepTime';
5757

58+
var CHECK_LOGIN_POPUP_INTERVAL_MS = 1000;
59+
5860
const APP = {
5961
GUIDES: 'customviews',
6062
};
@@ -1449,7 +1451,7 @@
14491451
try {
14501452
var loginUrl = getLoginUrl(params);
14511453
connect.getLog().warn("ACK_TIMEOUT occurred, attempting to pop the login page if not already open.").sendInternalLogToServer();
1452-
connect.core.loginWindow = connect.core.getPopupManager().open(loginUrl, connect.MasterTopics.LOGIN_POPUP, params.loginOptions);
1454+
connect.core._openPopupWithLock(loginUrl, params.loginOptions)
14531455
} catch (e) {
14541456
connect.getLog().error("ACK_TIMEOUT occurred but we are unable to open the login popup.").withException(e).sendInternalLogToServer();
14551457
}
@@ -1520,6 +1522,45 @@
15201522
};
15211523
};
15221524

1525+
connect.core._openPopupWithLock = function (loginUrl, loginOptions) {
1526+
const lockName = "connect-login-popup-lock" + loginUrl;
1527+
1528+
try {
1529+
navigator.locks.request(lockName, {mode: 'exclusive', ifAvailable: true }, async lock => {
1530+
if (!lock) {
1531+
connect.getLog().info("Popup already opened by another tab.").sendInternalLogToServer();
1532+
return;
1533+
}
1534+
connect.getLog().info("Opening popup window with weblock.").sendInternalLogToServer();
1535+
1536+
connect.core.loginWindow = connect.core.getPopupManager().open(loginUrl, connect.MasterTopics.LOGIN_POPUP, loginOptions);
1537+
1538+
connect.core._shouldHoldPopupLock = true;
1539+
1540+
const checkPopupInterval = setInterval(function() {
1541+
if (!connect.core.loginWindow || connect.core.loginWindow?.closed) {
1542+
clearInterval(checkPopupInterval);
1543+
connect.core._shouldHoldPopupLock = false;
1544+
connect.getLog().info("Cleared check popup interval.").sendInternalLogToServer();
1545+
}
1546+
}, CHECK_LOGIN_POPUP_INTERVAL_MS);
1547+
1548+
// hold the lock until the popup is closed
1549+
while (connect.core._shouldHoldPopupLock) {
1550+
await new Promise(resolve => setTimeout(resolve, 1000));
1551+
}
1552+
1553+
connect.getLog().info("Releasing weblock for opening login popup.").sendInternalLogToServer();
1554+
})
1555+
} catch (e) {
1556+
connect.getLog().error("Failed to use weblock to open popup. Your browser may be out of date.").withException(e).sendInternalLogToServer();
1557+
1558+
if (!connect.core.loginWindow){
1559+
connect.core.loginWindow = connect.core.getPopupManager().open(loginUrl, connect.MasterTopics.LOGIN_POPUP, loginOptions);
1560+
}
1561+
}
1562+
};
1563+
15231564
connect.core.onIframeRetriesExhausted = function(f) {
15241565
connect.core.getEventBus().subscribe(connect.EventType.IFRAME_RETRIES_EXHAUSTED, f);
15251566
}

0 commit comments

Comments
 (0)