Browse Source

refactoring

pull/24050/head
erdemcaygor 10 months ago
parent
commit
408c5f33a6
  1. 3
      npm/ng-packs/packages/oauth/package.json
  2. 10
      npm/ng-packs/packages/oauth/project.json
  3. 2
      npm/ng-packs/packages/oauth/src/lib/services/memory-token-storage.service.ts
  4. 57
      npm/ng-packs/packages/oauth/src/lib/workers/token-storage.worker.js
  5. 98
      npm/ng-packs/packages/oauth/src/lib/workers/token-storage.worker.ts

3
npm/ng-packs/packages/oauth/package.json

@ -6,6 +6,9 @@
"type": "git", "type": "git",
"url": "https://github.com/abpframework/abp.git" "url": "https://github.com/abpframework/abp.git"
}, },
"scripts": {
"build:worker": "esbuild src/lib/workers/token-storage.worker.ts --bundle --format=esm --target=es2022 --outfile=src/lib/workers/token-storage.worker.js"
},
"dependencies": { "dependencies": {
"@abp/ng.core": "~10.0.1", "@abp/ng.core": "~10.0.1",
"@abp/utils": "~10.0.1", "@abp/utils": "~10.0.1",

10
npm/ng-packs/packages/oauth/project.json

@ -5,6 +5,13 @@
"sourceRoot": "packages/oauth/src", "sourceRoot": "packages/oauth/src",
"prefix": "abp", "prefix": "abp",
"targets": { "targets": {
"build-worker": {
"executor": "nx:run-commands",
"options": {
"command": "esbuild src/lib/workers/token-storage.worker.ts --bundle --format=esm --target=es2022 --outfile=src/lib/workers/token-storage.worker.js",
"cwd": "packages/oauth"
}
},
"build": { "build": {
"executor": "@nx/angular:package", "executor": "@nx/angular:package",
"outputs": ["{workspaceRoot}/dist/packages/oauth"], "outputs": ["{workspaceRoot}/dist/packages/oauth"],
@ -19,7 +26,8 @@
"tsConfig": "packages/oauth/tsconfig.lib.json" "tsConfig": "packages/oauth/tsconfig.lib.json"
} }
}, },
"defaultConfiguration": "production" "defaultConfiguration": "production",
"dependsOn": ["build-worker"]
}, },
"test": { "test": {
"executor": "@nx/jest:jest", "executor": "@nx/jest:jest",

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

@ -31,7 +31,7 @@ export class MemoryTokenStorageService implements OAuthStorage {
// @ts-ignore // @ts-ignore
this.worker = new SharedWorker( this.worker = new SharedWorker(
new URL( new URL(
'../workers/token-storage.worker.js', '../workers/token-storage.worker.ts',
import.meta.url import.meta.url
), ),
{ name: 'oauth-token-storage', type: "module" } { name: 'oauth-token-storage', type: "module" }

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

@ -1,65 +1,62 @@
// ESM SharedWorker // src/lib/workers/token-storage.worker.ts
var tokenStore = /* @__PURE__ */ new Map();
const tokenStore = new Map(); var ports = /* @__PURE__ */ new Set();
const ports = new Set();
// Broadcast message to all ports except the sender and remove dead ports
function broadcastToOtherPorts(senderPort, message) { function broadcastToOtherPorts(senderPort, message) {
const deadPorts = []; const deadPorts = [];
ports.forEach((p) => {
ports.forEach(p => {
if (p !== senderPort) { if (p !== senderPort) {
try { try {
p.postMessage(message); p.postMessage(message);
} catch (error) { } catch (error) {
console.log('Dead port detected, removing...'); console.log("Dead port detected, removing...");
deadPorts.push(p); deadPorts.push(p);
} }
} }
}); });
deadPorts.forEach((p) => ports.delete(p));
// Clean up dead ports if (deadPorts.length > 0) {
deadPorts.forEach(p => ports.delete(p)); console.log("Cleaned up dead ports. Total ports:", ports.size);
}
} }
self.onconnect = (event) => { self.onconnect = (event) => {
const port = event.ports[0]; const port = event.ports[0];
ports.add(port); ports.add(port);
console.log("Port connected. Total ports:", ports.size);
// Clean up port when it's closed port.addEventListener("messageerror", () => {
port.addEventListener('messageerror', () => {
ports.delete(port); ports.delete(port);
console.log('Port disconnected (error). Total ports:', ports.size); console.log("Port disconnected (error). Total ports:", ports.size);
}); });
port.onmessage = (e) => { port.onmessage = (e) => {
const { action, key, value } = e.data; const { action, key, value } = e.data;
switch (action) { switch (action) {
case 'set': case "set":
if (key && value !== undefined) { if (key && value !== void 0) {
tokenStore.set(key, value); tokenStore.set(key, value);
broadcastToOtherPorts(port, { action: 'set', key, value }); broadcastToOtherPorts(port, { action: "set", key, value });
} }
break; break;
case 'remove': case "remove":
if (key) { if (key) {
console.log("remove", key);
tokenStore.delete(key); tokenStore.delete(key);
broadcastToOtherPorts(port, { action: 'remove', key }); broadcastToOtherPorts(port, { action: "remove", key });
} }
break; break;
case 'clear': case "clear":
console.log("clear user");
tokenStore.clear(); tokenStore.clear();
broadcastToOtherPorts(port, { action: 'clear' }); broadcastToOtherPorts(port, { action: "clear" });
break; break;
case 'get': case "get":
console.log("get user");
if (key) { if (key) {
const value = tokenStore.get(key) ?? null; const value2 = tokenStore.get(key) ?? null;
port.postMessage({ action: 'get', key, value }); port.postMessage({ action: "get", key, value: value2 });
} }
break; break;
default:
console.warn("Unknown action:", action);
} }
}; };
port.start(); port.start();
}; };
export {};

98
npm/ng-packs/packages/oauth/src/lib/workers/token-storage.worker.ts

@ -0,0 +1,98 @@
/// <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…
Cancel
Save