Skip to content

Timeout happening on one idle instance is causing the interrupt to stop working on the other idle instance #204

@vinacharya05

Description

@vinacharya05

NOTE: Due to limited time constraints and resources, we ask that you please use Stack Overflow or similar to troubleshoot or ask general questions, and not use bug reports to solicit help setting up your app.

Describe the bug
I have two idle instances, one for auto logout and another one for screensaver.

If my screensaver is "Active" and if timeout happens on the first instance(i,e. autologout) and if I try to interrupt the screen then screensaver is not going off and its blocking the UI. (One thing is clear that interrupt subscription stops working in this scenario).

To Reproduce
import {Component, NgZone, OnInit} from '@angular/core';
import {DEFAULT_INTERRUPTSOURCES, Idle, LocalStorage, LocalStorageExpiry} from '@ng-idle/core';
@component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit{
title = 'my-idle-app';
private readonly screenSaver!: HTMLElement;
private readonly screenSaverText!: Text;
idleTime1: number = 1;
private screenSaverIdle = new Idle(new LocalStorageExpiry(new LocalStorage()), this.ngZone);

constructor(readonly ngZone: NgZone, private idle1: Idle) {
this.screenSaver = document.createElement('div');
this.screenSaver.id = 'screensaver';
this.screenSaver.className = 'screen-saver';
this.screenSaverText = document.createTextNode('---%');
const movingTxt = document.createElement('span');
movingTxt.appendChild(this.screenSaverText);
this.screenSaver.appendChild(movingTxt);
this.removeScreenSaver();

this.screenSaverIdle.setIdleName('screenSaverIdleService');
this.screenSaverIdle.setInterrupts(DEFAULT_INTERRUPTSOURCES);
this.screenSaverIdle.setTimeout(false);
this.screenSaverIdle.setIdle(10);
this.screenSaverIdle.watch();

this.screenSaverIdle.onIdleStart.subscribe(() => {
  document.body.appendChild(this.screenSaver);
});

this.screenSaverIdle.onIdleEnd.subscribe(() => {
  console.log('IDLE END ::');
  this.removeScreenSaver();
});

}

ngOnInit() {
this.idle1.setIdleName('AutoLogoutIdleService');
this.idle1.setInterrupts(DEFAULT_INTERRUPTSOURCES);

this.idle1.setIdle(this.idleTime1);
this.idle1.setTimeout(10);

this.idle1.onIdleStart.subscribe(() => {
  console.log("IDLE 1 STARTS")
});

this.idle1.onIdleEnd.subscribe({
  next: () => {
    console.log("IDLE 1 END");
  },
  complete: () => {
    console.log("idle 1 completed");
  }
});

this.idle1.onTimeout.subscribe(()=> {
  console.log("User session timed Out",);
});

this.idle1.watch();

}

private removeScreenSaver() {
const ex = document.getElementById('screensaver');
if (ex) {
document.body.removeChild(ex);
}
}
}

Expected behavior
A clear and concise description of what you expected to happen.

Please tell us about your environment

  • Mobile or Desktop: Desktop
  • Browser: Chrome
  • Version: ~11.1.0
  • Angular version: 13
  • NodeJS version: 16.20.2
  • Language (TypeScript x.x, ES5, ES2015, etc.):

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions