@mu-cabin/opms-permission 0.9.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +155 -3
- package/dist/index.d.mts +76 -1
- package/dist/index.d.ts +76 -1
- package/dist/index.mjs +154 -3
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
@@ -33,6 +33,7 @@ __export(index_exports, {
|
|
33
33
|
DataHandler: () => DataHandler,
|
34
34
|
EnumOrgQueryMode: () => EnumOrgQueryMode,
|
35
35
|
EnumOrgQueryScope: () => EnumOrgQueryScope,
|
36
|
+
EventEmitter: () => EventEmitter,
|
36
37
|
OpmsPermission: () => Permission,
|
37
38
|
getOrgTree: () => getOrgTree,
|
38
39
|
getUserInfo: () => getUserInfo,
|
@@ -161,10 +162,11 @@ var Storage = class {
|
|
161
162
|
var storage = new Storage();
|
162
163
|
|
163
164
|
// src/utils/dataHandler.ts
|
164
|
-
|
165
|
+
var getCompletePath = (item) => {
|
165
166
|
const menuUrl = item.openIndicator === "INNER_COMPONENT" ? item.componentPath : item.defaultUrl;
|
166
|
-
|
167
|
-
|
167
|
+
const path = item.prefix && item.openIndicator === "INNER_COMPONENT" ? `${item.prefix}${menuUrl}` : menuUrl ?? "";
|
168
|
+
return path;
|
169
|
+
};
|
168
170
|
function getMenuName(item) {
|
169
171
|
return item.resourceType !== "FOLDER" ? item.resourceName || "" : (item.showName ?? item.resourceName) || "";
|
170
172
|
}
|
@@ -393,6 +395,104 @@ async function queryOrgCompanies(baseUrl, params) {
|
|
393
395
|
);
|
394
396
|
}
|
395
397
|
|
398
|
+
// src/utils/eventEmitter.ts
|
399
|
+
var EventEmitter = class {
|
400
|
+
constructor(allowedEvents) {
|
401
|
+
this.eventListeners = /* @__PURE__ */ new Map();
|
402
|
+
this.allowedEvents = new Set(allowedEvents || []);
|
403
|
+
}
|
404
|
+
/**
|
405
|
+
* Add event listener
|
406
|
+
*/
|
407
|
+
listen(event, listener) {
|
408
|
+
if (this.allowedEvents.size > 0 && !this.allowedEvents.has(event)) {
|
409
|
+
const allowedEventsList = Array.from(this.allowedEvents).join(", ");
|
410
|
+
throw new Error(
|
411
|
+
`Event "${String(event)}" is not registered. Allowed events: ${allowedEventsList}`
|
412
|
+
);
|
413
|
+
}
|
414
|
+
if (!this.eventListeners.has(event)) {
|
415
|
+
this.eventListeners.set(event, /* @__PURE__ */ new Set());
|
416
|
+
}
|
417
|
+
const listeners = this.eventListeners.get(event);
|
418
|
+
listeners.add(listener);
|
419
|
+
return () => {
|
420
|
+
listeners.delete(listener);
|
421
|
+
if (listeners.size === 0) {
|
422
|
+
this.eventListeners.delete(event);
|
423
|
+
}
|
424
|
+
};
|
425
|
+
}
|
426
|
+
/**
|
427
|
+
* Remove event listener
|
428
|
+
*/
|
429
|
+
unlisten(event, listener) {
|
430
|
+
const listeners = this.eventListeners.get(event);
|
431
|
+
if (listeners) {
|
432
|
+
listeners.delete(listener);
|
433
|
+
if (listeners.size === 0) {
|
434
|
+
this.eventListeners.delete(event);
|
435
|
+
}
|
436
|
+
}
|
437
|
+
}
|
438
|
+
/**
|
439
|
+
* Remove all listeners for a specific event or all events
|
440
|
+
*/
|
441
|
+
unlistenAll(event) {
|
442
|
+
if (event) {
|
443
|
+
this.eventListeners.delete(event);
|
444
|
+
} else {
|
445
|
+
this.eventListeners.clear();
|
446
|
+
}
|
447
|
+
}
|
448
|
+
/**
|
449
|
+
* Emit event to all listeners
|
450
|
+
*/
|
451
|
+
emit(event, data) {
|
452
|
+
const listeners = this.eventListeners.get(event);
|
453
|
+
if (listeners) {
|
454
|
+
listeners.forEach((listener) => {
|
455
|
+
try {
|
456
|
+
listener(data);
|
457
|
+
} catch (error) {
|
458
|
+
console.error(`Error in event listener for ${String(event)}:`, error);
|
459
|
+
}
|
460
|
+
});
|
461
|
+
}
|
462
|
+
}
|
463
|
+
/**
|
464
|
+
* Get the number of listeners for a specific event
|
465
|
+
*/
|
466
|
+
getListenerCount(event) {
|
467
|
+
const listeners = this.eventListeners.get(event);
|
468
|
+
return listeners ? listeners.size : 0;
|
469
|
+
}
|
470
|
+
/**
|
471
|
+
* Check if there are any listeners for a specific event
|
472
|
+
*/
|
473
|
+
hasListeners(event) {
|
474
|
+
return this.getListenerCount(event) > 0;
|
475
|
+
}
|
476
|
+
/**
|
477
|
+
* Get all registered event types
|
478
|
+
*/
|
479
|
+
getEventTypes() {
|
480
|
+
return Array.from(this.eventListeners.keys());
|
481
|
+
}
|
482
|
+
/**
|
483
|
+
* Get all allowed event types
|
484
|
+
*/
|
485
|
+
getAllowedEvents() {
|
486
|
+
return Array.from(this.allowedEvents);
|
487
|
+
}
|
488
|
+
/**
|
489
|
+
* Check if an event is allowed
|
490
|
+
*/
|
491
|
+
isEventAllowed(event) {
|
492
|
+
return this.allowedEvents.size === 0 || this.allowedEvents.has(event);
|
493
|
+
}
|
494
|
+
};
|
495
|
+
|
396
496
|
// src/permission.ts
|
397
497
|
var DataHandler = {
|
398
498
|
iterateOrgTree(orgTree) {
|
@@ -463,11 +563,59 @@ var Permission = class {
|
|
463
563
|
this.widgetMap = {};
|
464
564
|
this.menuList = [];
|
465
565
|
this.menuMap = {};
|
566
|
+
// Event emitter instance - only allow tokenChange event
|
567
|
+
this.eventEmitter = new EventEmitter(["tokenChange"]);
|
466
568
|
this.baseUrl = options.baseUrl;
|
467
569
|
this.systemId = options.systemId;
|
468
570
|
storage.setSystemId(this.systemId);
|
469
571
|
storage.setVersion("1.0.0");
|
470
572
|
}
|
573
|
+
/**
|
574
|
+
* Add event listener
|
575
|
+
*/
|
576
|
+
listen(event, listener) {
|
577
|
+
try {
|
578
|
+
return this.eventEmitter.listen(event, listener);
|
579
|
+
} catch (error) {
|
580
|
+
if (error instanceof Error && error.message.includes("not registered")) {
|
581
|
+
const allowedEvents = this.eventEmitter.getAllowedEvents();
|
582
|
+
throw new Error(
|
583
|
+
`Permission event "${String(event)}" is not supported. Available events: ${allowedEvents.join(", ")}`
|
584
|
+
);
|
585
|
+
}
|
586
|
+
throw error;
|
587
|
+
}
|
588
|
+
}
|
589
|
+
/**
|
590
|
+
* Remove event listener
|
591
|
+
*/
|
592
|
+
unlisten(event, listener) {
|
593
|
+
this.eventEmitter.unlisten(event, listener);
|
594
|
+
}
|
595
|
+
/**
|
596
|
+
* Remove all listeners for a specific event or all events
|
597
|
+
*/
|
598
|
+
unlistenAll(event) {
|
599
|
+
this.eventEmitter.unlistenAll(event);
|
600
|
+
}
|
601
|
+
/**
|
602
|
+
* Emit event to all listeners
|
603
|
+
*/
|
604
|
+
emit(event, data) {
|
605
|
+
this.eventEmitter.emit(event, data);
|
606
|
+
}
|
607
|
+
/**
|
608
|
+
* Get available events that can be listened to
|
609
|
+
*/
|
610
|
+
getAvailableEvents() {
|
611
|
+
return this.eventEmitter.getAllowedEvents();
|
612
|
+
}
|
613
|
+
/**
|
614
|
+
* Check if an event is supported
|
615
|
+
*/
|
616
|
+
isEventSupported(event) {
|
617
|
+
return this.eventEmitter.isEventAllowed(event);
|
618
|
+
}
|
471
619
|
/**
|
472
620
|
* Login using code from URL, save userInfo
|
473
621
|
*/
|
@@ -494,6 +642,7 @@ var Permission = class {
|
|
494
642
|
const { token } = obj;
|
495
643
|
url.searchParams.delete("code");
|
496
644
|
storage.setItem(TOKEN_KEY, token);
|
645
|
+
this.emit("tokenChange", token);
|
497
646
|
return token;
|
498
647
|
}
|
499
648
|
/**
|
@@ -505,6 +654,7 @@ var Permission = class {
|
|
505
654
|
}
|
506
655
|
clear() {
|
507
656
|
storage.clear();
|
657
|
+
this.emit("tokenChange", "");
|
508
658
|
}
|
509
659
|
async getUserInfo() {
|
510
660
|
const data = await getUserInfo(this.baseUrl);
|
@@ -616,6 +766,7 @@ var Permission = class {
|
|
616
766
|
}
|
617
767
|
setToken(token) {
|
618
768
|
storage.setItem(TOKEN_KEY, token);
|
769
|
+
this.emit("tokenChange", token);
|
619
770
|
}
|
620
771
|
// --- Getters ---
|
621
772
|
// get userInfo(): UserInfo | null {
|
@@ -728,6 +879,7 @@ function jumpToSSOLogout({
|
|
728
879
|
DataHandler,
|
729
880
|
EnumOrgQueryMode,
|
730
881
|
EnumOrgQueryScope,
|
882
|
+
EventEmitter,
|
731
883
|
OpmsPermission,
|
732
884
|
getOrgTree,
|
733
885
|
getUserInfo,
|
package/dist/index.d.mts
CHANGED
@@ -200,6 +200,56 @@ declare function handlePermissionTree<T extends {
|
|
200
200
|
noAuthMap: Record<number | string, T>;
|
201
201
|
};
|
202
202
|
|
203
|
+
type PermissionEventType = 'tokenChange';
|
204
|
+
type PermissionEventListener<T = any> = (data: T) => void;
|
205
|
+
interface PermissionEventMap {
|
206
|
+
tokenChange: string;
|
207
|
+
}
|
208
|
+
/**
|
209
|
+
* Generic Event Emitter class for handling events
|
210
|
+
*/
|
211
|
+
declare class EventEmitter<TEventMap extends Record<string, any> = PermissionEventMap> {
|
212
|
+
private eventListeners;
|
213
|
+
private allowedEvents;
|
214
|
+
constructor(allowedEvents?: (keyof TEventMap)[]);
|
215
|
+
/**
|
216
|
+
* Add event listener
|
217
|
+
*/
|
218
|
+
listen<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): () => void;
|
219
|
+
/**
|
220
|
+
* Remove event listener
|
221
|
+
*/
|
222
|
+
unlisten<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): void;
|
223
|
+
/**
|
224
|
+
* Remove all listeners for a specific event or all events
|
225
|
+
*/
|
226
|
+
unlistenAll(event?: keyof TEventMap): void;
|
227
|
+
/**
|
228
|
+
* Emit event to all listeners
|
229
|
+
*/
|
230
|
+
emit<TEvent extends keyof TEventMap>(event: TEvent, data: TEventMap[TEvent]): void;
|
231
|
+
/**
|
232
|
+
* Get the number of listeners for a specific event
|
233
|
+
*/
|
234
|
+
getListenerCount(event: keyof TEventMap): number;
|
235
|
+
/**
|
236
|
+
* Check if there are any listeners for a specific event
|
237
|
+
*/
|
238
|
+
hasListeners(event: keyof TEventMap): boolean;
|
239
|
+
/**
|
240
|
+
* Get all registered event types
|
241
|
+
*/
|
242
|
+
getEventTypes(): (keyof TEventMap)[];
|
243
|
+
/**
|
244
|
+
* Get all allowed event types
|
245
|
+
*/
|
246
|
+
getAllowedEvents(): (keyof TEventMap)[];
|
247
|
+
/**
|
248
|
+
* Check if an event is allowed
|
249
|
+
*/
|
250
|
+
isEventAllowed(event: keyof TEventMap): boolean;
|
251
|
+
}
|
252
|
+
|
203
253
|
interface PermissionOptions {
|
204
254
|
systemId: string;
|
205
255
|
baseUrl: string;
|
@@ -246,7 +296,32 @@ declare class Permission {
|
|
246
296
|
menuMap: {
|
247
297
|
[path: string]: MenuItem;
|
248
298
|
};
|
299
|
+
private eventEmitter;
|
249
300
|
constructor(options: PermissionOptions);
|
301
|
+
/**
|
302
|
+
* Add event listener
|
303
|
+
*/
|
304
|
+
listen<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): () => void;
|
305
|
+
/**
|
306
|
+
* Remove event listener
|
307
|
+
*/
|
308
|
+
unlisten<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): void;
|
309
|
+
/**
|
310
|
+
* Remove all listeners for a specific event or all events
|
311
|
+
*/
|
312
|
+
unlistenAll(event?: PermissionEventType): void;
|
313
|
+
/**
|
314
|
+
* Emit event to all listeners
|
315
|
+
*/
|
316
|
+
private emit;
|
317
|
+
/**
|
318
|
+
* Get available events that can be listened to
|
319
|
+
*/
|
320
|
+
getAvailableEvents(): PermissionEventType[];
|
321
|
+
/**
|
322
|
+
* Check if an event is supported
|
323
|
+
*/
|
324
|
+
isEventSupported(event: string): event is PermissionEventType;
|
250
325
|
/**
|
251
326
|
* Login using code from URL, save userInfo
|
252
327
|
*/
|
@@ -346,4 +421,4 @@ declare function jumpToSSOLogout({ baseUrl, redirectToUrl, clientId, }: {
|
|
346
421
|
clientId?: string;
|
347
422
|
}): void;
|
348
423
|
|
349
|
-
export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
|
424
|
+
export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, EventEmitter, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type PermissionEventListener, type PermissionEventMap, type PermissionEventType, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
|
package/dist/index.d.ts
CHANGED
@@ -200,6 +200,56 @@ declare function handlePermissionTree<T extends {
|
|
200
200
|
noAuthMap: Record<number | string, T>;
|
201
201
|
};
|
202
202
|
|
203
|
+
type PermissionEventType = 'tokenChange';
|
204
|
+
type PermissionEventListener<T = any> = (data: T) => void;
|
205
|
+
interface PermissionEventMap {
|
206
|
+
tokenChange: string;
|
207
|
+
}
|
208
|
+
/**
|
209
|
+
* Generic Event Emitter class for handling events
|
210
|
+
*/
|
211
|
+
declare class EventEmitter<TEventMap extends Record<string, any> = PermissionEventMap> {
|
212
|
+
private eventListeners;
|
213
|
+
private allowedEvents;
|
214
|
+
constructor(allowedEvents?: (keyof TEventMap)[]);
|
215
|
+
/**
|
216
|
+
* Add event listener
|
217
|
+
*/
|
218
|
+
listen<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): () => void;
|
219
|
+
/**
|
220
|
+
* Remove event listener
|
221
|
+
*/
|
222
|
+
unlisten<TEvent extends keyof TEventMap>(event: TEvent, listener: PermissionEventListener<TEventMap[TEvent]>): void;
|
223
|
+
/**
|
224
|
+
* Remove all listeners for a specific event or all events
|
225
|
+
*/
|
226
|
+
unlistenAll(event?: keyof TEventMap): void;
|
227
|
+
/**
|
228
|
+
* Emit event to all listeners
|
229
|
+
*/
|
230
|
+
emit<TEvent extends keyof TEventMap>(event: TEvent, data: TEventMap[TEvent]): void;
|
231
|
+
/**
|
232
|
+
* Get the number of listeners for a specific event
|
233
|
+
*/
|
234
|
+
getListenerCount(event: keyof TEventMap): number;
|
235
|
+
/**
|
236
|
+
* Check if there are any listeners for a specific event
|
237
|
+
*/
|
238
|
+
hasListeners(event: keyof TEventMap): boolean;
|
239
|
+
/**
|
240
|
+
* Get all registered event types
|
241
|
+
*/
|
242
|
+
getEventTypes(): (keyof TEventMap)[];
|
243
|
+
/**
|
244
|
+
* Get all allowed event types
|
245
|
+
*/
|
246
|
+
getAllowedEvents(): (keyof TEventMap)[];
|
247
|
+
/**
|
248
|
+
* Check if an event is allowed
|
249
|
+
*/
|
250
|
+
isEventAllowed(event: keyof TEventMap): boolean;
|
251
|
+
}
|
252
|
+
|
203
253
|
interface PermissionOptions {
|
204
254
|
systemId: string;
|
205
255
|
baseUrl: string;
|
@@ -246,7 +296,32 @@ declare class Permission {
|
|
246
296
|
menuMap: {
|
247
297
|
[path: string]: MenuItem;
|
248
298
|
};
|
299
|
+
private eventEmitter;
|
249
300
|
constructor(options: PermissionOptions);
|
301
|
+
/**
|
302
|
+
* Add event listener
|
303
|
+
*/
|
304
|
+
listen<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): () => void;
|
305
|
+
/**
|
306
|
+
* Remove event listener
|
307
|
+
*/
|
308
|
+
unlisten<T extends PermissionEventType>(event: T, listener: PermissionEventListener<PermissionEventMap[T]>): void;
|
309
|
+
/**
|
310
|
+
* Remove all listeners for a specific event or all events
|
311
|
+
*/
|
312
|
+
unlistenAll(event?: PermissionEventType): void;
|
313
|
+
/**
|
314
|
+
* Emit event to all listeners
|
315
|
+
*/
|
316
|
+
private emit;
|
317
|
+
/**
|
318
|
+
* Get available events that can be listened to
|
319
|
+
*/
|
320
|
+
getAvailableEvents(): PermissionEventType[];
|
321
|
+
/**
|
322
|
+
* Check if an event is supported
|
323
|
+
*/
|
324
|
+
isEventSupported(event: string): event is PermissionEventType;
|
250
325
|
/**
|
251
326
|
* Login using code from URL, save userInfo
|
252
327
|
*/
|
@@ -346,4 +421,4 @@ declare function jumpToSSOLogout({ baseUrl, redirectToUrl, clientId, }: {
|
|
346
421
|
clientId?: string;
|
347
422
|
}): void;
|
348
423
|
|
349
|
-
export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
|
424
|
+
export { type ApiResponse, type ChildOrganization, type CodeSourceType, DataHandler, EnumOrgQueryMode, EnumOrgQueryScope, EventEmitter, type MenuItem, type OpenIndicatorType, Permission as OpmsPermission, type Option, type OrgRecord, type OrgTreeItem, type PermissionEventListener, type PermissionEventMap, type PermissionEventType, type Resource, type ResourceType, type UserInfo, type UserOrgTreeParams, type UserOrganization, type UserRole, getOrgTree, getUserInfo, getUserOrgTree, jumpToSSOLogin, jumpToSSOLogout, login, logout, queryOrgCompanies, queryResource };
|
package/dist/index.mjs
CHANGED
@@ -113,10 +113,11 @@ var Storage = class {
|
|
113
113
|
var storage = new Storage();
|
114
114
|
|
115
115
|
// src/utils/dataHandler.ts
|
116
|
-
|
116
|
+
var getCompletePath = (item) => {
|
117
117
|
const menuUrl = item.openIndicator === "INNER_COMPONENT" ? item.componentPath : item.defaultUrl;
|
118
|
-
|
119
|
-
|
118
|
+
const path = item.prefix && item.openIndicator === "INNER_COMPONENT" ? `${item.prefix}${menuUrl}` : menuUrl ?? "";
|
119
|
+
return path;
|
120
|
+
};
|
120
121
|
function getMenuName(item) {
|
121
122
|
return item.resourceType !== "FOLDER" ? item.resourceName || "" : (item.showName ?? item.resourceName) || "";
|
122
123
|
}
|
@@ -345,6 +346,104 @@ async function queryOrgCompanies(baseUrl, params) {
|
|
345
346
|
);
|
346
347
|
}
|
347
348
|
|
349
|
+
// src/utils/eventEmitter.ts
|
350
|
+
var EventEmitter = class {
|
351
|
+
constructor(allowedEvents) {
|
352
|
+
this.eventListeners = /* @__PURE__ */ new Map();
|
353
|
+
this.allowedEvents = new Set(allowedEvents || []);
|
354
|
+
}
|
355
|
+
/**
|
356
|
+
* Add event listener
|
357
|
+
*/
|
358
|
+
listen(event, listener) {
|
359
|
+
if (this.allowedEvents.size > 0 && !this.allowedEvents.has(event)) {
|
360
|
+
const allowedEventsList = Array.from(this.allowedEvents).join(", ");
|
361
|
+
throw new Error(
|
362
|
+
`Event "${String(event)}" is not registered. Allowed events: ${allowedEventsList}`
|
363
|
+
);
|
364
|
+
}
|
365
|
+
if (!this.eventListeners.has(event)) {
|
366
|
+
this.eventListeners.set(event, /* @__PURE__ */ new Set());
|
367
|
+
}
|
368
|
+
const listeners = this.eventListeners.get(event);
|
369
|
+
listeners.add(listener);
|
370
|
+
return () => {
|
371
|
+
listeners.delete(listener);
|
372
|
+
if (listeners.size === 0) {
|
373
|
+
this.eventListeners.delete(event);
|
374
|
+
}
|
375
|
+
};
|
376
|
+
}
|
377
|
+
/**
|
378
|
+
* Remove event listener
|
379
|
+
*/
|
380
|
+
unlisten(event, listener) {
|
381
|
+
const listeners = this.eventListeners.get(event);
|
382
|
+
if (listeners) {
|
383
|
+
listeners.delete(listener);
|
384
|
+
if (listeners.size === 0) {
|
385
|
+
this.eventListeners.delete(event);
|
386
|
+
}
|
387
|
+
}
|
388
|
+
}
|
389
|
+
/**
|
390
|
+
* Remove all listeners for a specific event or all events
|
391
|
+
*/
|
392
|
+
unlistenAll(event) {
|
393
|
+
if (event) {
|
394
|
+
this.eventListeners.delete(event);
|
395
|
+
} else {
|
396
|
+
this.eventListeners.clear();
|
397
|
+
}
|
398
|
+
}
|
399
|
+
/**
|
400
|
+
* Emit event to all listeners
|
401
|
+
*/
|
402
|
+
emit(event, data) {
|
403
|
+
const listeners = this.eventListeners.get(event);
|
404
|
+
if (listeners) {
|
405
|
+
listeners.forEach((listener) => {
|
406
|
+
try {
|
407
|
+
listener(data);
|
408
|
+
} catch (error) {
|
409
|
+
console.error(`Error in event listener for ${String(event)}:`, error);
|
410
|
+
}
|
411
|
+
});
|
412
|
+
}
|
413
|
+
}
|
414
|
+
/**
|
415
|
+
* Get the number of listeners for a specific event
|
416
|
+
*/
|
417
|
+
getListenerCount(event) {
|
418
|
+
const listeners = this.eventListeners.get(event);
|
419
|
+
return listeners ? listeners.size : 0;
|
420
|
+
}
|
421
|
+
/**
|
422
|
+
* Check if there are any listeners for a specific event
|
423
|
+
*/
|
424
|
+
hasListeners(event) {
|
425
|
+
return this.getListenerCount(event) > 0;
|
426
|
+
}
|
427
|
+
/**
|
428
|
+
* Get all registered event types
|
429
|
+
*/
|
430
|
+
getEventTypes() {
|
431
|
+
return Array.from(this.eventListeners.keys());
|
432
|
+
}
|
433
|
+
/**
|
434
|
+
* Get all allowed event types
|
435
|
+
*/
|
436
|
+
getAllowedEvents() {
|
437
|
+
return Array.from(this.allowedEvents);
|
438
|
+
}
|
439
|
+
/**
|
440
|
+
* Check if an event is allowed
|
441
|
+
*/
|
442
|
+
isEventAllowed(event) {
|
443
|
+
return this.allowedEvents.size === 0 || this.allowedEvents.has(event);
|
444
|
+
}
|
445
|
+
};
|
446
|
+
|
348
447
|
// src/permission.ts
|
349
448
|
var DataHandler = {
|
350
449
|
iterateOrgTree(orgTree) {
|
@@ -415,11 +514,59 @@ var Permission = class {
|
|
415
514
|
this.widgetMap = {};
|
416
515
|
this.menuList = [];
|
417
516
|
this.menuMap = {};
|
517
|
+
// Event emitter instance - only allow tokenChange event
|
518
|
+
this.eventEmitter = new EventEmitter(["tokenChange"]);
|
418
519
|
this.baseUrl = options.baseUrl;
|
419
520
|
this.systemId = options.systemId;
|
420
521
|
storage.setSystemId(this.systemId);
|
421
522
|
storage.setVersion("1.0.0");
|
422
523
|
}
|
524
|
+
/**
|
525
|
+
* Add event listener
|
526
|
+
*/
|
527
|
+
listen(event, listener) {
|
528
|
+
try {
|
529
|
+
return this.eventEmitter.listen(event, listener);
|
530
|
+
} catch (error) {
|
531
|
+
if (error instanceof Error && error.message.includes("not registered")) {
|
532
|
+
const allowedEvents = this.eventEmitter.getAllowedEvents();
|
533
|
+
throw new Error(
|
534
|
+
`Permission event "${String(event)}" is not supported. Available events: ${allowedEvents.join(", ")}`
|
535
|
+
);
|
536
|
+
}
|
537
|
+
throw error;
|
538
|
+
}
|
539
|
+
}
|
540
|
+
/**
|
541
|
+
* Remove event listener
|
542
|
+
*/
|
543
|
+
unlisten(event, listener) {
|
544
|
+
this.eventEmitter.unlisten(event, listener);
|
545
|
+
}
|
546
|
+
/**
|
547
|
+
* Remove all listeners for a specific event or all events
|
548
|
+
*/
|
549
|
+
unlistenAll(event) {
|
550
|
+
this.eventEmitter.unlistenAll(event);
|
551
|
+
}
|
552
|
+
/**
|
553
|
+
* Emit event to all listeners
|
554
|
+
*/
|
555
|
+
emit(event, data) {
|
556
|
+
this.eventEmitter.emit(event, data);
|
557
|
+
}
|
558
|
+
/**
|
559
|
+
* Get available events that can be listened to
|
560
|
+
*/
|
561
|
+
getAvailableEvents() {
|
562
|
+
return this.eventEmitter.getAllowedEvents();
|
563
|
+
}
|
564
|
+
/**
|
565
|
+
* Check if an event is supported
|
566
|
+
*/
|
567
|
+
isEventSupported(event) {
|
568
|
+
return this.eventEmitter.isEventAllowed(event);
|
569
|
+
}
|
423
570
|
/**
|
424
571
|
* Login using code from URL, save userInfo
|
425
572
|
*/
|
@@ -446,6 +593,7 @@ var Permission = class {
|
|
446
593
|
const { token } = obj;
|
447
594
|
url.searchParams.delete("code");
|
448
595
|
storage.setItem(TOKEN_KEY, token);
|
596
|
+
this.emit("tokenChange", token);
|
449
597
|
return token;
|
450
598
|
}
|
451
599
|
/**
|
@@ -457,6 +605,7 @@ var Permission = class {
|
|
457
605
|
}
|
458
606
|
clear() {
|
459
607
|
storage.clear();
|
608
|
+
this.emit("tokenChange", "");
|
460
609
|
}
|
461
610
|
async getUserInfo() {
|
462
611
|
const data = await getUserInfo(this.baseUrl);
|
@@ -568,6 +717,7 @@ var Permission = class {
|
|
568
717
|
}
|
569
718
|
setToken(token) {
|
570
719
|
storage.setItem(TOKEN_KEY, token);
|
720
|
+
this.emit("tokenChange", token);
|
571
721
|
}
|
572
722
|
// --- Getters ---
|
573
723
|
// get userInfo(): UserInfo | null {
|
@@ -679,6 +829,7 @@ export {
|
|
679
829
|
DataHandler,
|
680
830
|
EnumOrgQueryMode,
|
681
831
|
EnumOrgQueryScope,
|
832
|
+
EventEmitter,
|
682
833
|
Permission as OpmsPermission,
|
683
834
|
getOrgTree,
|
684
835
|
getUserInfo,
|