diff --git a/lib/core/api/src/lib/adf-http-client.service.spec.ts b/lib/core/api/src/lib/adf-http-client.service.spec.ts index ab0388cd35..5929a26236 100644 --- a/lib/core/api/src/lib/adf-http-client.service.spec.ts +++ b/lib/core/api/src/lib/adf-http-client.service.spec.ts @@ -21,6 +21,7 @@ import { HttpClientTestingModule, HttpTestingController } from '@angular/common/ import { TestBed } from '@angular/core/testing'; import { AdfHttpClient } from './adf-http-client.service'; import { AlfrescoApiResponseError } from './alfresco-api/alfresco-api.response-error'; +import EventEmitter from 'eventemitter3'; const securityOptions: SecurityOptions = { authentications: {}, @@ -30,16 +31,9 @@ const securityOptions: SecurityOptions = { withCredentials: false }; -const emitter = { - emit: () => {}, - off: () => {}, - on: () => {}, - once: () => {} -}; - const emitters: Emitters = { - eventEmitter: emitter, - apiClientEmitter: emitter + eventEmitter: new EventEmitter(), + apiClientEmitter: new EventEmitter() }; const mockResponse = { @@ -124,10 +118,10 @@ describe('AdfHttpClient', () => { httpMethod: 'POST' }; - const spy = spyOn(emitter, 'emit').and.callThrough(); + const eventSpy = spyOn(emitters.eventEmitter, 'emit').and.callThrough(); angularHttpClient.request('http://example.com', options, securityOptions, emitters).catch(() => { - expect(spy).toHaveBeenCalledWith('unauthorized'); + expect(eventSpy).toHaveBeenCalledWith('unauthorized'); done(); }); diff --git a/lib/core/api/src/lib/adf-http-client.service.ts b/lib/core/api/src/lib/adf-http-client.service.ts index 6fa5006e61..5d7e9ae66f 100644 --- a/lib/core/api/src/lib/adf-http-client.service.ts +++ b/lib/core/api/src/lib/adf-http-client.service.ts @@ -34,23 +34,24 @@ import { AlfrescoApiParamEncoder } from './alfresco-api/alfresco-api.param-encod import { AlfrescoApiResponseError } from './alfresco-api/alfresco-api.response-error'; import { Constructor } from './types'; import { RequestOptions, SecurityOptions } from './interfaces'; -import ee, { Emitter } from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; + +type EventEmitterInstance = InstanceType; + +type EventEmitterEvents = 'progress' | 'success' | 'error' | 'forbidden' | 'abort' | 'unauthorized' | string; export interface Emitters { - readonly eventEmitter: Emitter; - readonly apiClientEmitter: Emitter; + readonly eventEmitter: EventEmitterInstance; + readonly apiClientEmitter: EventEmitterInstance; } @Injectable({ providedIn: 'root' }) -export class AdfHttpClient implements ee.Emitter, JsApiHttpClient { - on: ee.EmitterMethod; - off: ee.EmitterMethod; - once: ee.EmitterMethod; - _disableCsrf: boolean; +export class AdfHttpClient implements JsApiHttpClient { + private eventEmitter = new EventEmitter(); - emit: (type: string, ...args: any[]) => void; + _disableCsrf: boolean; get disableCsrf(): boolean { return this._disableCsrf; @@ -68,7 +69,27 @@ export class AdfHttpClient implements ee.Emitter, JsApiHttpClient { }; constructor(private httpClient: HttpClient) { - ee(this); + // No need for ee(this) anymore - we use composition instead of inheritance + } + + // EventEmitter delegation methods + on(event: EventEmitterEvents, fn: (...args: any[]) => void, context?: any): this { + this.eventEmitter.on(event, fn, context); + return this; + } + + off(event: EventEmitterEvents, fn?: (...args: any[]) => void, context?: any): this { + this.eventEmitter.off(event, fn, context); + return this; + } + + once(event: EventEmitterEvents, fn: (...args: any[]) => void, context?: any): this { + this.eventEmitter.once(event, fn, context); + return this; + } + + emit(event: EventEmitterEvents, ...args: any[]): boolean { + return this.eventEmitter.emit(event, ...args); } setDefaultSecurityOption(options: any) { @@ -136,24 +157,19 @@ export class AdfHttpClient implements ee.Emitter, JsApiHttpClient { private addPromiseListeners(promise: Promise, eventEmitter: any) { const eventPromise = Object.assign(promise, { - on() { - // eslint-disable-next-line prefer-spread, prefer-rest-params - eventEmitter.on.apply(eventEmitter, arguments); + on(event: K, fn: (...args: any[]) => void, context?: any) { + eventEmitter.on(event, fn, context); return this; }, - once() { - // eslint-disable-next-line prefer-spread, prefer-rest-params - eventEmitter.once.apply(eventEmitter, arguments); + once(event: K, fn: (...args: any[]) => void, context?: any) { + eventEmitter.once(event, fn, context); return this; }, - emit() { - // eslint-disable-next-line prefer-spread, prefer-rest-params - eventEmitter.emit.apply(eventEmitter, arguments); - return this; + emit(event: K, ...args: any[]): boolean { + return eventEmitter.emit(event, ...args); }, - off() { - // eslint-disable-next-line prefer-spread, prefer-rest-params - eventEmitter.off.apply(eventEmitter, arguments); + off(event: K, fn?: (...args: any[]) => void, context?: any) { + eventEmitter.off(event, fn, context); return this; } }); @@ -162,16 +178,17 @@ export class AdfHttpClient implements ee.Emitter, JsApiHttpClient { } private getEventEmitters(): Emitters { - const apiClientEmitter = { - on: this.on.bind(this), - off: this.off.bind(this), - once: this.once.bind(this), - emit: this.emit.bind(this) - }; + const apiClientEmitter: EventEmitterInstance = new EventEmitter(); + + // Bind this instance's methods to the apiClientEmitter for backward compatibility + apiClientEmitter.on = this.on.bind(this); + apiClientEmitter.off = this.off.bind(this); + apiClientEmitter.once = this.once.bind(this); + apiClientEmitter.emit = this.emit.bind(this); return { apiClientEmitter, - eventEmitter: ee({}) + eventEmitter: new EventEmitter() }; } diff --git a/lib/core/src/lib/auth/interfaces/authentication-service.interface.ts b/lib/core/src/lib/auth/interfaces/authentication-service.interface.ts index 666215c551..403b3214e0 100644 --- a/lib/core/src/lib/auth/interfaces/authentication-service.interface.ts +++ b/lib/core/src/lib/auth/interfaces/authentication-service.interface.ts @@ -16,18 +16,20 @@ */ import { HttpHeaders } from '@angular/common/http'; -import ee from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import { Observable } from 'rxjs'; +type EventEmitterInstance = InstanceType; + export interface AuthenticationServiceInterface { onError: any; onLogin: any; onLogout: any; - on: ee.EmitterMethod; - off: ee.EmitterMethod; - once: ee.EmitterMethod; - emit: (type: string, ...args: any[]) => void; + on: EventEmitterInstance['on']; + off: EventEmitterInstance['off']; + once: EventEmitterInstance['once']; + emit: EventEmitterInstance['emit']; getToken(): string; isLoggedIn(): boolean; diff --git a/lib/core/src/lib/auth/services/authentication.service.ts b/lib/core/src/lib/auth/services/authentication.service.ts index aa5d3bb1a9..2390a05668 100644 --- a/lib/core/src/lib/auth/services/authentication.service.ts +++ b/lib/core/src/lib/auth/services/authentication.service.ts @@ -21,13 +21,13 @@ import { BasicAlfrescoAuthService } from '../basic-auth/basic-alfresco-auth.serv import { Observable, Subject, from } from 'rxjs'; import { HttpHeaders } from '@angular/common/http'; import { AuthenticationServiceInterface } from '../interfaces/authentication-service.interface'; -import ee from 'event-emitter'; import { RedirectAuthService } from '../oidc/redirect-auth.service'; - +import { EventEmitter } from 'eventemitter3'; +type EventEmitterInstance = InstanceType; @Injectable({ providedIn: 'root' }) -export class AuthenticationService implements AuthenticationServiceInterface, ee.Emitter { +export class AuthenticationService implements AuthenticationServiceInterface { onLogin: Subject = new Subject(); onLogout: Subject = new Subject(); onTokenReceived: Subject = new Subject(); @@ -49,19 +49,19 @@ export class AuthenticationService implements AuthenticationServiceInterface, ee } } - get on(): ee.EmitterMethod { + get on(): EventEmitterInstance['on'] { return this.isOauth() ? this.oidcAuthenticationService.on : this.basicAlfrescoAuthService.on; } - get off(): ee.EmitterMethod { + get off(): EventEmitterInstance['off'] { return this.isOauth() ? this.oidcAuthenticationService.off : this.basicAlfrescoAuthService.off; } - get once(): ee.EmitterMethod { + get once(): EventEmitterInstance['once'] { return this.isOauth() ? this.oidcAuthenticationService.once : this.basicAlfrescoAuthService.once; } - get emit(): (type: string, ...args: any[]) => void { + get emit(): EventEmitterInstance['emit'] { return this.isOauth() ? this.oidcAuthenticationService.emit : this.basicAlfrescoAuthService.emit; } diff --git a/lib/core/src/lib/auth/services/base-authentication.service.ts b/lib/core/src/lib/auth/services/base-authentication.service.ts index 057a461551..c7da5e8495 100644 --- a/lib/core/src/lib/auth/services/base-authentication.service.ts +++ b/lib/core/src/lib/auth/services/base-authentication.service.ts @@ -21,13 +21,15 @@ import { Observable, Observer, ReplaySubject, throwError } from 'rxjs'; import { AppConfigService, AppConfigValues } from '../../app-config/app-config.service'; import { CookieService } from '../../common/services/cookie.service'; import { AuthenticationServiceInterface } from '../interfaces/authentication-service.interface'; -import ee from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; -export abstract class BaseAuthenticationService implements AuthenticationServiceInterface, ee.Emitter { - on: ee.EmitterMethod; - off: ee.EmitterMethod; - once: ee.EmitterMethod; - emit: (type: string, ...args: any[]) => void; +type EventEmitterInstance = InstanceType; + +export abstract class BaseAuthenticationService implements AuthenticationServiceInterface { + on: EventEmitterInstance['on']; + off: EventEmitterInstance['off']; + once: EventEmitterInstance['once']; + emit: EventEmitterInstance['emit']; protected redirectUrl: RedirectionModel = null; @@ -38,9 +40,7 @@ export abstract class BaseAuthenticationService implements AuthenticationService protected constructor( protected appConfig: AppConfigService, protected cookie: CookieService - ) { - ee(this); - } + ) {} abstract getAuthHeaders(requestUrl: string, header: HttpHeaders): HttpHeaders; abstract getToken(): string; diff --git a/lib/js-api/package.json b/lib/js-api/package.json index 32e58084ff..bd819153c0 100644 --- a/lib/js-api/package.json +++ b/lib/js-api/package.json @@ -15,7 +15,7 @@ "url": "https://github.com/Alfresco/alfresco-ng2-components/issues" }, "dependencies": { - "event-emitter": "^0.3.5", + "eventemitter3": "^5.0.1", "superagent": "^9.0.1", "tslib": "^2.6.1" }, diff --git a/lib/js-api/src/alfrescoApi.ts b/lib/js-api/src/alfrescoApi.ts index d049655ddc..7f23e46b7e 100644 --- a/lib/js-api/src/alfrescoApi.ts +++ b/lib/js-api/src/alfrescoApi.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import ee, { EmitterMethod, Emitter } from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import { ContentAuth } from './authentication/contentAuth'; import { ProcessAuth } from './authentication/processAuth'; import { Oauth2Auth } from './authentication/oauth2Auth'; @@ -26,11 +26,12 @@ import { AlfrescoApiConfig } from './alfrescoApiConfig'; import { Authentication } from './authentication/authentication'; import { AlfrescoApiType } from './to-deprecate/alfresco-api-type'; import { HttpClient } from './api-clients/http-client.interface'; +import { AlfrescoApiClient, AlfrescoApiClientPromise } from './alfrescoApiClient'; -export class AlfrescoApi implements Emitter, AlfrescoApiType { +type EventEmitterInstance = InstanceType; + +export class AlfrescoApi extends AlfrescoApiClient implements AlfrescoApiType { __type = 'legacy-client'; - storage: Storage; - config: AlfrescoApiConfig; contentClient: ContentClient; contentPrivateClient: ContentClient; processClient: ProcessClient; @@ -43,18 +44,11 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType { processAuth: ProcessAuth; contentAuth: ContentAuth; - on: EmitterMethod; - off: EmitterMethod; - once: EmitterMethod; - bufferEvents: string[] = []; - - emit: (type: string, ...args: any[]) => void; - username: string; - constructor(config?: AlfrescoApiConfig, public httpClient?: HttpClient) { - ee(this); + constructor(config?: AlfrescoApiConfig, httpClient?: HttpClient) { + super(undefined, httpClient); if (config) { this.setConfig(config); @@ -392,14 +386,15 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType { return this.contentAuth.validateTicket(); } - private loginBPMECM(username: string, password: string): Promise<[string, string]> { + private loginBPMECM(username: string, password: string): AlfrescoApiClientPromise<[string, string]> { const contentPromise = this.contentAuth.login(username, password); const processPromise = this.processAuth.login(username, password); - const promise: any = new Promise<[string, string]>((resolve, reject) => { + const eventEmitter: EventEmitterInstance = new EventEmitter(); + const promise = new Promise<[string, string]>((resolve, reject) => { Promise.all([contentPromise, processPromise]).then( (data) => { - promise.emit('success'); + eventEmitter.emit('success'); resolve(data); }, (error) => { @@ -407,16 +402,15 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType { this.processAuth.invalidateSession(); if (error.status === 401) { - promise.emit('unauthorized'); + eventEmitter.emit('unauthorized'); } - promise.emit('error'); + eventEmitter.emit('error'); reject(error); } ); }); - ee(promise); // jshint ignore:line - return promise; + return this.addPromiseListeners(promise, eventEmitter); } /** @@ -449,29 +443,29 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType { return Promise.resolve(); } - private _logoutBPMECM(): Promise { + private _logoutBPMECM(): AlfrescoApiClientPromise { const contentPromise = this.contentAuth.logout(); const processPromise = this.processAuth.logout(); - const promise: any = new Promise((resolve, reject) => { + const eventEmitter: EventEmitterInstance = new EventEmitter(); + const promise = new Promise((resolve, reject) => { Promise.all([contentPromise, processPromise]).then( () => { this.config.ticket = undefined; - promise.emit('logout'); + eventEmitter.emit('logout'); resolve(); }, (error) => { if (error.status === 401) { - promise.emit('unauthorized'); + eventEmitter.emit('unauthorized'); } - promise.emit('error'); + eventEmitter.emit('error'); reject(error); } ); }); - ee(promise); // jshint ignore:line - return promise; + return this.addPromiseListeners(promise, eventEmitter); } /** diff --git a/lib/js-api/src/alfrescoApiClient.ts b/lib/js-api/src/alfrescoApiClient.ts index c1f9288e69..e21ec20b51 100644 --- a/lib/js-api/src/alfrescoApiClient.ts +++ b/lib/js-api/src/alfrescoApiClient.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import ee from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import { AlfrescoApiConfig } from './alfrescoApiConfig'; import { Authentication } from './authentication/authentication'; import { SuperagentHttpClient } from './superagentHttpClient'; @@ -25,11 +25,13 @@ import { Storage } from './storage'; declare const Buffer: any; +type EventEmitterInstance = InstanceType; + export type AlfrescoApiClientPromise = Promise & { - on: ee.EmitterMethod; - off: ee.EmitterMethod; - once: ee.EmitterMethod; - emit: (type: string, ...args: any[]) => void; + on: (event: K, fn: (...args: any[]) => void, context?: any) => AlfrescoApiClientPromise; + off: (event: K, fn?: (...args: any[]) => void, context?: any) => AlfrescoApiClientPromise; + once: (event: K, fn: (...args: any[]) => void, context?: any) => AlfrescoApiClientPromise; + emit: (event: K, ...args: any[]) => boolean; abort?: () => void; }; @@ -62,11 +64,8 @@ export function buildCollectionParam(param: string[], collectionFormat: string): } } -export class AlfrescoApiClient implements ee.Emitter, LegacyHttpClient { - on: ee.EmitterMethod; - off: ee.EmitterMethod; - once: ee.EmitterMethod; - emit: (type: string, ...args: any[]) => void; +export class AlfrescoApiClient implements LegacyHttpClient { + private eventEmitter = new EventEmitter(); storage: Storage; host: string; @@ -105,13 +104,29 @@ export class AlfrescoApiClient implements ee.Emitter, LegacyHttpClient { constructor(host?: string, httpClient?: HttpClient) { this.host = host; - this.storage = Storage.getInstance(); - // fallback for backward compatibility this.httpClient = httpClient || new SuperagentHttpClient(); + } - ee(this); + // EventEmitter delegation methods + on(event: K, fn: (...args: any[]) => void, context?: any): this { + this.eventEmitter.on(event, fn, context); + return this; + } + + off(event: K, fn?: (...args: any[]) => void, context?: any): this { + this.eventEmitter.off(event, fn, context); + return this; + } + + once(event: K, fn: (...args: any[]) => void, context?: any): this { + this.eventEmitter.once(event, fn, context); + return this; + } + + emit(event: K, ...args: any[]): boolean { + return this.eventEmitter.emit(event, ...args); } request(options: RequestOptions): Promise { @@ -325,7 +340,7 @@ export class AlfrescoApiClient implements ee.Emitter, LegacyHttpClient { return { apiClientEmitter, - eventEmitter: ee({}) + eventEmitter: new EventEmitter() }; } @@ -374,27 +389,22 @@ export class AlfrescoApiClient implements ee.Emitter, LegacyHttpClient { return Boolean(contentType?.match(/^application\/json(;.*)?$/i)); } - private addPromiseListeners(promise: Promise, eventEmitter: ee.Emitter): AlfrescoApiClientPromise { + addPromiseListeners(promise: Promise, eventEmitter: EventEmitterInstance): AlfrescoApiClientPromise { return Object.assign(promise, { - on() { - // eslint-disable-next-line prefer-spread,prefer-rest-params - eventEmitter.on.apply(eventEmitter, arguments); - return this; + on(event: K, fn: (...args: any[]) => void, context?: any): AlfrescoApiClientPromise { + eventEmitter.on(event, fn, context); + return this as AlfrescoApiClientPromise; }, - once() { - // eslint-disable-next-line prefer-spread,prefer-rest-params - eventEmitter.once.apply(eventEmitter, arguments); - return this; + once(event: K, fn: (...args: any[]) => void, context?: any): AlfrescoApiClientPromise { + eventEmitter.once(event, fn, context); + return this as AlfrescoApiClientPromise; }, - emit() { - // eslint-disable-next-line prefer-spread,prefer-rest-params - eventEmitter.emit.apply(eventEmitter, arguments); - return this; + emit(event: K, ...args: any[]): boolean { + return eventEmitter.emit(event, ...args); }, - off() { - // eslint-disable-next-line prefer-spread,prefer-rest-params - eventEmitter.off.apply(eventEmitter, arguments); - return this; + off(event: K, fn?: (...args: any[]) => void, context?: any): AlfrescoApiClientPromise { + eventEmitter.off(event, fn, context); + return this as AlfrescoApiClientPromise; } }); } diff --git a/lib/js-api/src/api-clients/http-client.interface.ts b/lib/js-api/src/api-clients/http-client.interface.ts index 66307de448..d18a2caafd 100644 --- a/lib/js-api/src/api-clients/http-client.interface.ts +++ b/lib/js-api/src/api-clients/http-client.interface.ts @@ -16,7 +16,9 @@ */ import { Authentication } from '../authentication/authentication'; -import { Emitter } from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; + +type EventEmitterInstance = InstanceType; export interface RequestOptions { path: string; @@ -93,8 +95,13 @@ export interface SecurityOptions { } export interface Emitters { - readonly eventEmitter: Emitter; - readonly apiClientEmitter: Emitter; + readonly eventEmitter: EventEmitterInstance; + readonly apiClientEmitter: { + on: EventEmitterInstance['on']; + off: EventEmitterInstance['off']; + once: EventEmitterInstance['once']; + emit: EventEmitterInstance['emit']; + }; } export interface HttpClient { diff --git a/lib/js-api/src/authentication/contentAuth.ts b/lib/js-api/src/authentication/contentAuth.ts index ec74ea9560..fd13a1691c 100644 --- a/lib/js-api/src/authentication/contentAuth.ts +++ b/lib/js-api/src/authentication/contentAuth.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import ee from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import { AuthenticationApi, TicketBody } from '../api/auth-rest-api'; import { AlfrescoApiClient } from '../alfrescoApiClient'; import { AlfrescoApiConfig } from '../alfrescoApiConfig'; @@ -104,8 +104,7 @@ export class ContentAuth extends AlfrescoApiClient { }); }); - ee(promise); // jshint ignore:line - return promise; + return this.addPromiseListeners(promise, new EventEmitter()); } /** @@ -133,8 +132,7 @@ export class ContentAuth extends AlfrescoApiClient { ); }); - ee(promise); // jshint ignore:line - return promise; + return this.addPromiseListeners(promise, new EventEmitter()); } /** @@ -160,8 +158,7 @@ export class ContentAuth extends AlfrescoApiClient { ); }); - ee(promise); // jshint ignore:line - return promise; + return this.addPromiseListeners(promise, new EventEmitter()); } /** diff --git a/lib/js-api/src/authentication/oauth2Auth.ts b/lib/js-api/src/authentication/oauth2Auth.ts index 4c23b9137e..08a22366ea 100644 --- a/lib/js-api/src/authentication/oauth2Auth.ts +++ b/lib/js-api/src/authentication/oauth2Auth.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import ee from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import { AlfrescoApiClient } from '../alfrescoApiClient'; import { AlfrescoApiConfig } from '../alfrescoApiConfig'; import { Authentication } from './authentication'; @@ -604,7 +604,7 @@ export class Oauth2Auth extends AlfrescoApiClient { } ); - ee(promise); // jshint ignore:line + return this.addPromiseListeners(promise, new EventEmitter()); } pollingRefreshToken() { @@ -654,9 +654,7 @@ export class Oauth2Auth extends AlfrescoApiClient { ); }); - ee(promise); // jshint ignore:line - - return promise; + return this.addPromiseListeners(promise, new EventEmitter()); } universalBtoa(stringToConvert: string) { diff --git a/lib/js-api/src/authentication/processAuth.ts b/lib/js-api/src/authentication/processAuth.ts index 3382063e0d..d902b7cecf 100644 --- a/lib/js-api/src/authentication/processAuth.ts +++ b/lib/js-api/src/authentication/processAuth.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import ee from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import { AlfrescoApiClient, AlfrescoApiClientPromise } from '../alfrescoApiClient'; import { AlfrescoApiConfig } from '../alfrescoApiConfig'; import { Authentication } from './authentication'; @@ -123,8 +123,7 @@ export class ProcessAuth extends AlfrescoApiClient { ); }); - ee(promise); // jshint ignore:line - return promise; + return this.addPromiseListeners(promise, new EventEmitter()); } /** @@ -154,8 +153,7 @@ export class ProcessAuth extends AlfrescoApiClient { ); }); - ee(promise); - return promise; + return this.addPromiseListeners(promise, new EventEmitter()); } /** diff --git a/lib/js-api/src/superagentHttpClient.ts b/lib/js-api/src/superagentHttpClient.ts index d999a61d5b..e201067deb 100644 --- a/lib/js-api/src/superagentHttpClient.ts +++ b/lib/js-api/src/superagentHttpClient.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import ee, { Emitter } from 'event-emitter'; +import { EventEmitter } from 'eventemitter3'; import superagent, { Response, SuperAgentRequest } from 'superagent'; import { Authentication } from './authentication/authentication'; import { RequestOptions, HttpClient, SecurityOptions, Emitters } from './api-clients/http-client.interface'; @@ -26,6 +26,8 @@ import { isBrowser, paramToString } from './utils'; declare const Blob: any; declare const Buffer: any; +type EventEmitterInstance = InstanceType; + const isProgressEvent = (event: ProgressEvent | unknown): event is ProgressEvent => (event as ProgressEvent)?.lengthComputable; export class SuperagentHttpClient implements HttpClient { @@ -134,7 +136,7 @@ export class SuperagentHttpClient implements HttpClient { contentType: string, accept: string, responseType: string, - eventEmitter: ee.Emitter, + eventEmitter: EventEmitterInstance, returnType: string, securityOptions: SecurityOptions ) { @@ -268,7 +270,7 @@ export class SuperagentHttpClient implements HttpClient { } } - private progress(event: ProgressEvent | unknown, eventEmitter: Emitter): void { + private progress(event: ProgressEvent | unknown, eventEmitter: EventEmitterInstance): void { if (isProgressEvent(event)) { const percent = Math.round((event.loaded / event.total) * 100); diff --git a/package-lock.json b/package-lock.json index 6a8af1aecc..92d6fb8bd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "cropperjs": "1.6.2", "date-fns": "^2.30.0", "dotenv-expand": "^5.1.0", - "event-emitter": "^0.3.5", + "eventemitter3": "^5.0.1", "graphql-ws": "^6.0.5", "material-icons": "^1.13.12", "minimatch-browser": "1.0.0", @@ -74,7 +74,6 @@ "@storybook/manager-api": "8.6.14", "@storybook/theming": "8.6.12", "@types/ejs": "^3.1.5", - "@types/event-emitter": "^0.3.3", "@types/jasmine": "4.0.3", "@types/jasminewd2": "~2.0.2", "@types/jest": "^29.5.14", @@ -15894,13 +15893,6 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, - "node_modules/@types/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@types/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/express": { "version": "4.17.23", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", @@ -20938,19 +20930,6 @@ "dev": true, "license": "MIT" }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "license": "ISC", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -22024,46 +22003,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/esbuild": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", @@ -22819,21 +22758,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -22927,20 +22851,10 @@ "resolved": "https://registry.npmjs.org/eve-raphael/-/eve-raphael-0.5.0.tgz", "integrity": "sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug==" }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, "node_modules/events": { @@ -23090,15 +23004,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "dependencies": { - "type": "^2.7.2" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -24877,6 +24782,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/http-proxy/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", @@ -29226,13 +29137,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", @@ -30617,12 +30521,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "license": "ISC" - }, "node_modules/ng-packagr": { "version": "19.2.2", "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.2.tgz", @@ -38310,12 +38208,6 @@ "dev": true, "license": "BSD" }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 0beeb64d83..484042ac10 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cropperjs": "1.6.2", "date-fns": "^2.30.0", "dotenv-expand": "^5.1.0", - "event-emitter": "^0.3.5", + "eventemitter3": "^5.0.1", "graphql-ws": "^6.0.5", "material-icons": "^1.13.12", "minimatch-browser": "1.0.0", @@ -94,7 +94,6 @@ "@storybook/manager-api": "8.6.14", "@storybook/theming": "8.6.12", "@types/ejs": "^3.1.5", - "@types/event-emitter": "^0.3.3", "@types/jasmine": "4.0.3", "@types/jasminewd2": "~2.0.2", "@types/jest": "^29.5.14",