Browse Source

memory leak bug fix

pull/24050/head
erdemcaygor 2 months ago
parent
commit
2538118604
  1. 10
      npm/ng-packs/packages/oauth/src/lib/services/memory-token-storage.service.ts
  2. 45
      npm/ng-packs/packages/oauth/src/lib/workers/token-storage.worker.js

10
npm/ng-packs/packages/oauth/src/lib/services/memory-token-storage.service.ts

@ -57,8 +57,18 @@ export class MemoryTokenStorageService implements OAuthStorage {
this.cache.clear();
this.refreshDocument();
break;
case 'get':
if (value !== null) {
this.cache.set(key, value);
}
break;
}
};
// Load all tokens from SharedWorker on initialization
this.keysShouldStoreInMemory.forEach(key => {
this.port?.postMessage({ action: 'get', key });
});
} catch (error) {
this.useSharedWorker = false;
}

45
npm/ng-packs/packages/oauth/src/lib/workers/token-storage.worker.js

@ -3,39 +3,53 @@
const tokenStore = new Map();
const ports = new Set();
// Broadcast message to all ports except the sender and remove dead ports
function broadcastToOtherPorts(senderPort, message) {
const deadPorts = [];
ports.forEach(p => {
if (p !== senderPort) {
try {
p.postMessage(message);
} catch (error) {
console.log('Dead port detected, removing...');
deadPorts.push(p);
}
}
});
// Clean up dead ports
deadPorts.forEach(p => ports.delete(p));
}
self.onconnect = (event) => {
const port = event.ports[0];
ports.add(port);
// Clean up port when it's closed
port.addEventListener('messageerror', () => {
ports.delete(port);
console.log('Port disconnected (error). Total ports:', ports.size);
});
port.onmessage = (e) => {
const { action, key, value } = e.data;
switch (action) {
case 'set':
if (key && value !== undefined) {
tokenStore.set(key, value);
ports.forEach(p => {
if (p !== port) {
p.postMessage({ action: 'set', key, value });
}
});
broadcastToOtherPorts(port, { action: 'set', key, value });
}
break;
case 'remove':
if (key) {
tokenStore.delete(key);
ports.forEach(p => {
if (p !== port) {
p.postMessage({ action: 'remove', key });
}
});
broadcastToOtherPorts(port, { action: 'remove', key });
}
break;
case 'clear':
tokenStore.clear();
ports.forEach(p => {
if (p !== port) {
p.postMessage({ action: 'clear' });
}
});
broadcastToOtherPorts(port, { action: 'clear' });
break;
case 'get':
if (key) {
@ -45,7 +59,6 @@ self.onconnect = (event) => {
break;
}
};
port.start();
};

Loading…
Cancel
Save