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 5929a26236..ab0388cd35 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,7 +21,6 @@ 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: {}, @@ -31,9 +30,16 @@ const securityOptions: SecurityOptions = { withCredentials: false }; +const emitter = { + emit: () => {}, + off: () => {}, + on: () => {}, + once: () => {} +}; + const emitters: Emitters = { - eventEmitter: new EventEmitter(), - apiClientEmitter: new EventEmitter() + eventEmitter: emitter, + apiClientEmitter: emitter }; const mockResponse = { @@ -118,10 +124,10 @@ describe('AdfHttpClient', () => { httpMethod: 'POST' }; - const eventSpy = spyOn(emitters.eventEmitter, 'emit').and.callThrough(); + const spy = spyOn(emitter, 'emit').and.callThrough(); angularHttpClient.request('http://example.com', options, securityOptions, emitters).catch(() => { - expect(eventSpy).toHaveBeenCalledWith('unauthorized'); + expect(spy).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 eeee981177..9941e19ec3 100644 --- a/lib/core/api/src/lib/adf-http-client.service.ts +++ b/lib/core/api/src/lib/adf-http-client.service.ts @@ -34,25 +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 { EventEmitter } from 'eventemitter3'; - -type EventEmitterInstance = InstanceType; - -type EventEmitterEvents = 'progress' | 'success' | 'error' | 'forbidden' | 'abort' | 'unauthorized' | string; +import ee, { Emitter } from 'event-emitter'; export interface Emitters { - readonly eventEmitter: EventEmitterInstance; - readonly apiClientEmitter: EventEmitterInstance; + readonly eventEmitter: Emitter; + readonly apiClientEmitter: Emitter; } @Injectable({ providedIn: 'root' }) -export class AdfHttpClient implements JsApiHttpClient { - private eventEmitter = new EventEmitter(); - +export class AdfHttpClient implements ee.Emitter, JsApiHttpClient { + on: ee.EmitterMethod; + off: ee.EmitterMethod; + once: ee.EmitterMethod; _disableCsrf: boolean; + emit: (type: string, ...args: any[]) => void; + get disableCsrf(): boolean { return this._disableCsrf; } @@ -69,27 +68,7 @@ export class AdfHttpClient implements JsApiHttpClient { }; constructor(private httpClient: HttpClient) { - // 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); + ee(this); } setDefaultSecurityOption(options: any) { @@ -157,19 +136,24 @@ export class AdfHttpClient implements JsApiHttpClient { private addPromiseListeners(promise: Promise, eventEmitter: any) { const eventPromise = Object.assign(promise, { - on(event: K, fn: (...args: any[]) => void, context?: any) { - eventEmitter.on(event, fn, context); + on() { + // eslint-disable-next-line prefer-spread, prefer-rest-params + eventEmitter.on.apply(eventEmitter, arguments); return this; }, - once(event: K, fn: (...args: any[]) => void, context?: any) { - eventEmitter.once(event, fn, context); + once() { + // eslint-disable-next-line prefer-spread, prefer-rest-params + eventEmitter.once.apply(eventEmitter, arguments); return this; }, - emit(event: K, ...args: any[]): boolean { - return eventEmitter.emit(event, ...args); + emit() { + // eslint-disable-next-line prefer-spread, prefer-rest-params + eventEmitter.emit.apply(eventEmitter, arguments); + return this; }, - off(event: K, fn?: (...args: any[]) => void, context?: any) { - eventEmitter.off(event, fn, context); + off() { + // eslint-disable-next-line prefer-spread, prefer-rest-params + eventEmitter.off.apply(eventEmitter, arguments); return this; } }); @@ -178,17 +162,16 @@ export class AdfHttpClient implements JsApiHttpClient { } private getEventEmitters(): Emitters { - 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); + const apiClientEmitter = { + on: this.on.bind(this), + off: this.off.bind(this), + once: this.once.bind(this), + emit: this.emit.bind(this) + }; return { apiClientEmitter, - eventEmitter: new EventEmitter() + eventEmitter: ee({}) }; } 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 403b3214e0..666215c551 100644 --- a/lib/core/src/lib/auth/interfaces/authentication-service.interface.ts +++ b/lib/core/src/lib/auth/interfaces/authentication-service.interface.ts @@ -16,20 +16,18 @@ */ import { HttpHeaders } from '@angular/common/http'; -import { EventEmitter } from 'eventemitter3'; +import ee from 'event-emitter'; import { Observable } from 'rxjs'; -type EventEmitterInstance = InstanceType; - export interface AuthenticationServiceInterface { onError: any; onLogin: any; onLogout: any; - on: EventEmitterInstance['on']; - off: EventEmitterInstance['off']; - once: EventEmitterInstance['once']; - emit: EventEmitterInstance['emit']; + on: ee.EmitterMethod; + off: ee.EmitterMethod; + once: ee.EmitterMethod; + emit: (type: string, ...args: any[]) => void; 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 2390a05668..aa5d3bb1a9 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 { +export class AuthenticationService implements AuthenticationServiceInterface, ee.Emitter { onLogin: Subject = new Subject(); onLogout: Subject = new Subject(); onTokenReceived: Subject = new Subject(); @@ -49,19 +49,19 @@ export class AuthenticationService implements AuthenticationServiceInterface { } } - get on(): EventEmitterInstance['on'] { + get on(): ee.EmitterMethod { return this.isOauth() ? this.oidcAuthenticationService.on : this.basicAlfrescoAuthService.on; } - get off(): EventEmitterInstance['off'] { + get off(): ee.EmitterMethod { return this.isOauth() ? this.oidcAuthenticationService.off : this.basicAlfrescoAuthService.off; } - get once(): EventEmitterInstance['once'] { + get once(): ee.EmitterMethod { return this.isOauth() ? this.oidcAuthenticationService.once : this.basicAlfrescoAuthService.once; } - get emit(): EventEmitterInstance['emit'] { + get emit(): (type: string, ...args: any[]) => void { 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 c7da5e8495..057a461551 100644 --- a/lib/core/src/lib/auth/services/base-authentication.service.ts +++ b/lib/core/src/lib/auth/services/base-authentication.service.ts @@ -21,15 +21,13 @@ 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 { EventEmitter } from 'eventemitter3'; +import ee from 'event-emitter'; -type EventEmitterInstance = InstanceType; - -export abstract class BaseAuthenticationService implements AuthenticationServiceInterface { - on: EventEmitterInstance['on']; - off: EventEmitterInstance['off']; - once: EventEmitterInstance['once']; - emit: EventEmitterInstance['emit']; +export abstract class BaseAuthenticationService implements AuthenticationServiceInterface, ee.Emitter { + on: ee.EmitterMethod; + off: ee.EmitterMethod; + once: ee.EmitterMethod; + emit: (type: string, ...args: any[]) => void; protected redirectUrl: RedirectionModel = null; @@ -40,7 +38,9 @@ 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 bd819153c0..32e58084ff 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": { - "eventemitter3": "^5.0.1", + "event-emitter": "^0.3.5", "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 7f23e46b7e..26fadd83b0 100644 --- a/lib/js-api/src/alfrescoApi.ts +++ b/lib/js-api/src/alfrescoApi.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { EventEmitter } from 'eventemitter3'; +import ee, { EmitterMethod, Emitter } from 'event-emitter'; import { ContentAuth } from './authentication/contentAuth'; import { ProcessAuth } from './authentication/processAuth'; import { Oauth2Auth } from './authentication/oauth2Auth'; @@ -26,12 +26,11 @@ 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'; -type EventEmitterInstance = InstanceType; - -export class AlfrescoApi extends AlfrescoApiClient implements AlfrescoApiType { +export class AlfrescoApi implements Emitter, AlfrescoApiType { __type = 'legacy-client'; + storage: Storage; + config: AlfrescoApiConfig; contentClient: ContentClient; contentPrivateClient: ContentClient; processClient: ProcessClient; @@ -44,11 +43,21 @@ export class AlfrescoApi extends AlfrescoApiClient implements AlfrescoApiType { processAuth: ProcessAuth; contentAuth: ContentAuth; + on: EmitterMethod; + off: EmitterMethod; + once: EmitterMethod; + bufferEvents: string[] = []; + + emit: (type: string, ...args: any[]) => void; + username: string; - constructor(config?: AlfrescoApiConfig, httpClient?: HttpClient) { - super(undefined, httpClient); + constructor( + config?: AlfrescoApiConfig, + public httpClient?: HttpClient + ) { + ee(this); if (config) { this.setConfig(config); @@ -386,15 +395,14 @@ export class AlfrescoApi extends AlfrescoApiClient implements AlfrescoApiType { return this.contentAuth.validateTicket(); } - private loginBPMECM(username: string, password: string): AlfrescoApiClientPromise<[string, string]> { + private loginBPMECM(username: string, password: string): Promise<[string, string]> { const contentPromise = this.contentAuth.login(username, password); const processPromise = this.processAuth.login(username, password); - const eventEmitter: EventEmitterInstance = new EventEmitter(); - const promise = new Promise<[string, string]>((resolve, reject) => { + const promise: any = new Promise<[string, string]>((resolve, reject) => { Promise.all([contentPromise, processPromise]).then( (data) => { - eventEmitter.emit('success'); + promise.emit('success'); resolve(data); }, (error) => { @@ -402,15 +410,16 @@ export class AlfrescoApi extends AlfrescoApiClient implements AlfrescoApiType { this.processAuth.invalidateSession(); if (error.status === 401) { - eventEmitter.emit('unauthorized'); + promise.emit('unauthorized'); } - eventEmitter.emit('error'); + promise.emit('error'); reject(error); } ); }); - return this.addPromiseListeners(promise, eventEmitter); + ee(promise); // jshint ignore:line + return promise; } /** @@ -443,29 +452,29 @@ export class AlfrescoApi extends AlfrescoApiClient implements AlfrescoApiType { return Promise.resolve(); } - private _logoutBPMECM(): AlfrescoApiClientPromise { + private _logoutBPMECM(): Promise { const contentPromise = this.contentAuth.logout(); const processPromise = this.processAuth.logout(); - const eventEmitter: EventEmitterInstance = new EventEmitter(); - const promise = new Promise((resolve, reject) => { + const promise: any = new Promise((resolve, reject) => { Promise.all([contentPromise, processPromise]).then( () => { this.config.ticket = undefined; - eventEmitter.emit('logout'); + promise.emit('logout'); resolve(); }, (error) => { if (error.status === 401) { - eventEmitter.emit('unauthorized'); + promise.emit('unauthorized'); } - eventEmitter.emit('error'); + promise.emit('error'); reject(error); } ); }); - return this.addPromiseListeners(promise, eventEmitter); + ee(promise); // jshint ignore:line + return promise; } /** diff --git a/lib/js-api/src/alfrescoApiClient.ts b/lib/js-api/src/alfrescoApiClient.ts index e21ec20b51..c1f9288e69 100644 --- a/lib/js-api/src/alfrescoApiClient.ts +++ b/lib/js-api/src/alfrescoApiClient.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { EventEmitter } from 'eventemitter3'; +import ee from 'event-emitter'; import { AlfrescoApiConfig } from './alfrescoApiConfig'; import { Authentication } from './authentication/authentication'; import { SuperagentHttpClient } from './superagentHttpClient'; @@ -25,13 +25,11 @@ import { Storage } from './storage'; declare const Buffer: any; -type EventEmitterInstance = InstanceType; - export type AlfrescoApiClientPromise = Promise & { - 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; + on: ee.EmitterMethod; + off: ee.EmitterMethod; + once: ee.EmitterMethod; + emit: (type: string, ...args: any[]) => void; abort?: () => void; }; @@ -64,8 +62,11 @@ export function buildCollectionParam(param: string[], collectionFormat: string): } } -export class AlfrescoApiClient implements LegacyHttpClient { - private eventEmitter = new EventEmitter(); +export class AlfrescoApiClient implements ee.Emitter, LegacyHttpClient { + on: ee.EmitterMethod; + off: ee.EmitterMethod; + once: ee.EmitterMethod; + emit: (type: string, ...args: any[]) => void; storage: Storage; host: string; @@ -104,29 +105,13 @@ export class AlfrescoApiClient implements LegacyHttpClient { constructor(host?: string, httpClient?: HttpClient) { this.host = host; + this.storage = Storage.getInstance(); + // fallback for backward compatibility this.httpClient = httpClient || new SuperagentHttpClient(); - } - // 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); + ee(this); } request(options: RequestOptions): Promise { @@ -340,7 +325,7 @@ export class AlfrescoApiClient implements LegacyHttpClient { return { apiClientEmitter, - eventEmitter: new EventEmitter() + eventEmitter: ee({}) }; } @@ -389,22 +374,27 @@ export class AlfrescoApiClient implements LegacyHttpClient { return Boolean(contentType?.match(/^application\/json(;.*)?$/i)); } - addPromiseListeners(promise: Promise, eventEmitter: EventEmitterInstance): AlfrescoApiClientPromise { + private addPromiseListeners(promise: Promise, eventEmitter: ee.Emitter): AlfrescoApiClientPromise { return Object.assign(promise, { - on(event: K, fn: (...args: any[]) => void, context?: any): AlfrescoApiClientPromise { - eventEmitter.on(event, fn, context); - return this as AlfrescoApiClientPromise; + on() { + // eslint-disable-next-line prefer-spread,prefer-rest-params + eventEmitter.on.apply(eventEmitter, arguments); + return this; }, - once(event: K, fn: (...args: any[]) => void, context?: any): AlfrescoApiClientPromise { - eventEmitter.once(event, fn, context); - return this as AlfrescoApiClientPromise; + once() { + // eslint-disable-next-line prefer-spread,prefer-rest-params + eventEmitter.once.apply(eventEmitter, arguments); + return this; }, - emit(event: K, ...args: any[]): boolean { - return eventEmitter.emit(event, ...args); + emit() { + // eslint-disable-next-line prefer-spread,prefer-rest-params + eventEmitter.emit.apply(eventEmitter, arguments); + return this; }, - off(event: K, fn?: (...args: any[]) => void, context?: any): AlfrescoApiClientPromise { - eventEmitter.off(event, fn, context); - return this as AlfrescoApiClientPromise; + off() { + // eslint-disable-next-line prefer-spread,prefer-rest-params + eventEmitter.off.apply(eventEmitter, arguments); + return this; } }); } 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 d18a2caafd..66307de448 100644 --- a/lib/js-api/src/api-clients/http-client.interface.ts +++ b/lib/js-api/src/api-clients/http-client.interface.ts @@ -16,9 +16,7 @@ */ import { Authentication } from '../authentication/authentication'; -import { EventEmitter } from 'eventemitter3'; - -type EventEmitterInstance = InstanceType; +import { Emitter } from 'event-emitter'; export interface RequestOptions { path: string; @@ -95,13 +93,8 @@ export interface SecurityOptions { } export interface Emitters { - readonly eventEmitter: EventEmitterInstance; - readonly apiClientEmitter: { - on: EventEmitterInstance['on']; - off: EventEmitterInstance['off']; - once: EventEmitterInstance['once']; - emit: EventEmitterInstance['emit']; - }; + readonly eventEmitter: Emitter; + readonly apiClientEmitter: Emitter; } export interface HttpClient { diff --git a/lib/js-api/src/authentication/contentAuth.ts b/lib/js-api/src/authentication/contentAuth.ts index fd13a1691c..ec74ea9560 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 { EventEmitter } from 'eventemitter3'; +import ee from 'event-emitter'; import { AuthenticationApi, TicketBody } from '../api/auth-rest-api'; import { AlfrescoApiClient } from '../alfrescoApiClient'; import { AlfrescoApiConfig } from '../alfrescoApiConfig'; @@ -104,7 +104,8 @@ export class ContentAuth extends AlfrescoApiClient { }); }); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); // jshint ignore:line + return promise; } /** @@ -132,7 +133,8 @@ export class ContentAuth extends AlfrescoApiClient { ); }); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); // jshint ignore:line + return promise; } /** @@ -158,7 +160,8 @@ export class ContentAuth extends AlfrescoApiClient { ); }); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); // jshint ignore:line + return promise; } /** diff --git a/lib/js-api/src/authentication/oauth2Auth.ts b/lib/js-api/src/authentication/oauth2Auth.ts index 08a22366ea..4c23b9137e 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 { EventEmitter } from 'eventemitter3'; +import ee from 'event-emitter'; import { AlfrescoApiClient } from '../alfrescoApiClient'; import { AlfrescoApiConfig } from '../alfrescoApiConfig'; import { Authentication } from './authentication'; @@ -604,7 +604,7 @@ export class Oauth2Auth extends AlfrescoApiClient { } ); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); // jshint ignore:line } pollingRefreshToken() { @@ -654,7 +654,9 @@ export class Oauth2Auth extends AlfrescoApiClient { ); }); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); // jshint ignore:line + + return promise; } universalBtoa(stringToConvert: string) { diff --git a/lib/js-api/src/authentication/processAuth.ts b/lib/js-api/src/authentication/processAuth.ts index d902b7cecf..3382063e0d 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 { EventEmitter } from 'eventemitter3'; +import ee from 'event-emitter'; import { AlfrescoApiClient, AlfrescoApiClientPromise } from '../alfrescoApiClient'; import { AlfrescoApiConfig } from '../alfrescoApiConfig'; import { Authentication } from './authentication'; @@ -123,7 +123,8 @@ export class ProcessAuth extends AlfrescoApiClient { ); }); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); // jshint ignore:line + return promise; } /** @@ -153,7 +154,8 @@ export class ProcessAuth extends AlfrescoApiClient { ); }); - return this.addPromiseListeners(promise, new EventEmitter()); + ee(promise); + return promise; } /** diff --git a/lib/js-api/src/superagentHttpClient.ts b/lib/js-api/src/superagentHttpClient.ts index e201067deb..d999a61d5b 100644 --- a/lib/js-api/src/superagentHttpClient.ts +++ b/lib/js-api/src/superagentHttpClient.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { EventEmitter } from 'eventemitter3'; +import ee, { Emitter } from 'event-emitter'; import superagent, { Response, SuperAgentRequest } from 'superagent'; import { Authentication } from './authentication/authentication'; import { RequestOptions, HttpClient, SecurityOptions, Emitters } from './api-clients/http-client.interface'; @@ -26,8 +26,6 @@ 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 { @@ -136,7 +134,7 @@ export class SuperagentHttpClient implements HttpClient { contentType: string, accept: string, responseType: string, - eventEmitter: EventEmitterInstance, + eventEmitter: ee.Emitter, returnType: string, securityOptions: SecurityOptions ) { @@ -270,7 +268,7 @@ export class SuperagentHttpClient implements HttpClient { } } - private progress(event: ProgressEvent | unknown, eventEmitter: EventEmitterInstance): void { + private progress(event: ProgressEvent | unknown, eventEmitter: Emitter): void { if (isProgressEvent(event)) { const percent = Math.round((event.loaded / event.total) * 100); diff --git a/package-lock.json b/package-lock.json index 8e1afec65e..8238143053 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "date-fns": "^2.30.0", "dotenv-expand": "^5.1.0", "editorjs-html": "^4.0.5", - "eventemitter3": "^5.0.1", + "event-emitter": "^0.3.5", "graphql-ws": "^6.0.5", "material-icons": "^1.13.12", "minimatch-browser": "1.0.0", @@ -75,6 +75,7 @@ "@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", @@ -16211,6 +16212,13 @@ "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", @@ -21344,6 +21352,19 @@ "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", @@ -22416,6 +22437,46 @@ "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", @@ -23171,6 +23232,21 @@ "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", @@ -23264,10 +23340,20 @@ "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": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, "node_modules/events": { @@ -23417,6 +23503,15 @@ "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", @@ -25212,12 +25307,6 @@ "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", @@ -29549,6 +29638,13 @@ "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", @@ -30933,6 +31029,12 @@ "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", @@ -38620,6 +38722,12 @@ "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 c904f3f8f9..fb4378d84f 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "date-fns": "^2.30.0", "dotenv-expand": "^5.1.0", "editorjs-html": "^4.0.5", - "eventemitter3": "^5.0.1", + "event-emitter": "^0.3.5", "graphql-ws": "^6.0.5", "material-icons": "^1.13.12", "minimatch-browser": "1.0.0", @@ -95,6 +95,7 @@ "@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",