mirror of https://github.com/abpframework/abp.git
5 changed files with 147 additions and 190 deletions
@ -1,62 +0,0 @@ |
|||
// src/lib/workers/token-storage.worker.ts
|
|||
var tokenStore = /* @__PURE__ */ new Map(); |
|||
var ports = /* @__PURE__ */ new Set(); |
|||
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); |
|||
} |
|||
} |
|||
}); |
|||
deadPorts.forEach((p) => ports.delete(p)); |
|||
if (deadPorts.length > 0) { |
|||
console.log("Cleaned up dead ports. Total ports:", ports.size); |
|||
} |
|||
} |
|||
self.onconnect = (event) => { |
|||
const port = event.ports[0]; |
|||
ports.add(port); |
|||
console.log("Port connected. Total ports:", ports.size); |
|||
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 !== void 0) { |
|||
tokenStore.set(key, value); |
|||
broadcastToOtherPorts(port, { action: "set", key, value }); |
|||
} |
|||
break; |
|||
case "remove": |
|||
if (key) { |
|||
console.log("remove", key); |
|||
tokenStore.delete(key); |
|||
broadcastToOtherPorts(port, { action: "remove", key }); |
|||
} |
|||
break; |
|||
case "clear": |
|||
console.log("clear user"); |
|||
tokenStore.clear(); |
|||
broadcastToOtherPorts(port, { action: "clear" }); |
|||
break; |
|||
case "get": |
|||
console.log("get user"); |
|||
if (key) { |
|||
const value2 = tokenStore.get(key) ?? null; |
|||
port.postMessage({ action: "get", key, value: value2 }); |
|||
} |
|||
break; |
|||
default: |
|||
console.warn("Unknown action:", action); |
|||
} |
|||
}; |
|||
port.start(); |
|||
}; |
|||
@ -1,98 +0,0 @@ |
|||
/// <reference lib="webworker" />
|
|||
|
|||
// Message types for type safety
|
|||
interface TokenMessage { |
|||
action: 'set' | 'remove' | 'clear' | 'get'; |
|||
key?: string; |
|||
value?: string; |
|||
} |
|||
|
|||
interface TokenResponse { |
|||
action: 'set' | 'remove' | 'clear' | 'get'; |
|||
key?: string; |
|||
value?: string | null; |
|||
} |
|||
|
|||
declare const self: SharedWorkerGlobalScope; |
|||
|
|||
const tokenStore = new Map<string, string>(); |
|||
const ports = new Set<MessagePort>(); |
|||
|
|||
// Broadcast message to all ports except the sender
|
|||
// Automatically cleans up dead ports
|
|||
function broadcastToOtherPorts(senderPort: MessagePort, message: TokenResponse): void { |
|||
const deadPorts: MessagePort[] = []; |
|||
|
|||
ports.forEach(p => { |
|||
if (p !== senderPort) { |
|||
try { |
|||
p.postMessage(message); |
|||
} catch (error) { |
|||
// Port is dead/closed, mark for removal
|
|||
console.log('Dead port detected, removing...'); |
|||
deadPorts.push(p); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
// Clean up dead ports
|
|||
deadPorts.forEach(p => ports.delete(p)); |
|||
|
|||
if (deadPorts.length > 0) { |
|||
console.log('Cleaned up dead ports. Total ports:', ports.size); |
|||
} |
|||
} |
|||
|
|||
self.onconnect = (event: MessageEvent) => { |
|||
const port = event.ports[0]; |
|||
ports.add(port); |
|||
console.log('Port connected. Total ports:', ports.size); |
|||
|
|||
// 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: MessageEvent<TokenMessage>) => { |
|||
const { action, key, value } = e.data; |
|||
|
|||
switch (action) { |
|||
case 'set': |
|||
if (key && value !== undefined) { |
|||
tokenStore.set(key, value); |
|||
broadcastToOtherPorts(port, { action: 'set', key, value }); |
|||
} |
|||
break; |
|||
|
|||
case 'remove': |
|||
if (key) { |
|||
console.log('remove', key); |
|||
tokenStore.delete(key); |
|||
broadcastToOtherPorts(port, { action: 'remove', key }); |
|||
} |
|||
break; |
|||
|
|||
case 'clear': |
|||
console.log('clear user'); |
|||
tokenStore.clear(); |
|||
broadcastToOtherPorts(port, { action: 'clear' }); |
|||
break; |
|||
|
|||
case 'get': |
|||
console.log('get user'); |
|||
if (key) { |
|||
const value = tokenStore.get(key) ?? null; |
|||
port.postMessage({ action: 'get', key, value } as TokenResponse); |
|||
} |
|||
break; |
|||
|
|||
default: |
|||
console.warn('Unknown action:', action); |
|||
} |
|||
}; |
|||
|
|||
port.start(); |
|||
}; |
|||
|
|||
export {}; |
|||
Loading…
Reference in new issue