Skip to content

Commit

Permalink
Restrict Multicaster callback type
Browse files Browse the repository at this point in the history
Only allow standard (err, result) callbacks, so that we can bridge them
to promises.
  • Loading branch information
lawrence-forooghian committed Jan 29, 2024
1 parent 1be691f commit d012125
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 19 deletions.
4 changes: 2 additions & 2 deletions src/common/lib/client/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class Auth {
client: BaseClient;
tokenParams: API.TokenParams;
currentTokenRequestId: number | null;
waitingForTokenRequest: MulticasterInstance | null;
waitingForTokenRequest: MulticasterInstance<API.TokenDetails> | null;
// This initialization is always overwritten and only used to prevent a TypeScript compiler error
authOptions: API.AuthOptions = {} as API.AuthOptions;
tokenDetails?: API.TokenDetails | null;
Expand Down Expand Up @@ -959,7 +959,7 @@ class Auth {

/* Request a new token */
const tokenRequestId = (this.currentTokenRequestId = getTokenRequestId());
this.requestToken(this.tokenParams, this.authOptions, (err: Function, tokenResponse?: API.TokenDetails) => {
this.requestToken(this.tokenParams, this.authOptions, (err: ErrorInfo | null, tokenResponse?: API.TokenDetails) => {
if ((this.currentTokenRequestId as number) > tokenRequestId) {
Logger.logAction(
Logger.LOG_MINOR,
Expand Down
4 changes: 2 additions & 2 deletions src/common/lib/transport/connectionmanager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1951,10 +1951,10 @@ class ConnectionManager extends EventEmitter {
* the dup, they'll be lost */
if (lastQueued && !lastQueued.sendAttempted && bundleWith(lastQueued.message, msg, maxSize)) {
if (!lastQueued.merged) {
lastQueued.callback = Multicaster.create([lastQueued.callback as any]);
lastQueued.callback = Multicaster.create([lastQueued.callback]);
lastQueued.merged = true;
}
(lastQueued.callback as MulticasterInstance).push(callback as any);
(lastQueued.callback as MulticasterInstance<void>).push(callback);
} else {
this.queuedMessages.push(new PendingMessage(msg, callback));
}
Expand Down
30 changes: 15 additions & 15 deletions src/common/lib/util/multicaster.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
import { StandardCallback } from 'common/types/utils';
import ErrorInfo from 'common/lib/types/errorinfo';
import Logger from './logger';

type AnyFunction = (...args: any[]) => unknown;

export interface MulticasterInstance extends Function {
(...args: unknown[]): void;
push: (fn: AnyFunction) => void;
export interface MulticasterInstance<T> extends Function {
(err?: ErrorInfo | null, result?: T): void;
push: (fn: StandardCallback<T>) => void;
}

class Multicaster {
members: Array<AnyFunction>;
class Multicaster<T> {
members: Array<StandardCallback<T>>;

// Private constructor; use static Multicaster.create instead
private constructor(members?: Array<AnyFunction | undefined>) {
this.members = (members as Array<AnyFunction>) || [];
private constructor(members?: Array<StandardCallback<T> | undefined>) {
this.members = (members as Array<StandardCallback<T>>) || [];
}

private call(...args: unknown[]): void {
private call(err?: ErrorInfo | null, result?: T): void {
for (const member of this.members) {
if (member) {
try {
member(...args);
member(err, result);
} catch (e) {
Logger.logAction(
Logger.LOG_ERROR,
Expand All @@ -31,14 +31,14 @@ class Multicaster {
}
}

push(...args: Array<AnyFunction>): void {
push(...args: Array<StandardCallback<T>>): void {
this.members.push(...args);
}

static create(members?: Array<AnyFunction | undefined>): MulticasterInstance {
static create<T>(members?: Array<StandardCallback<T> | undefined>): MulticasterInstance<T> {
const instance = new Multicaster(members);
return Object.assign((...args: unknown[]) => instance.call(...args), {
push: (fn: AnyFunction) => instance.push(fn),
return Object.assign((err?: ErrorInfo | null, result?: T) => instance.call(err, result), {
push: (fn: StandardCallback<T>) => instance.push(fn),
});
}
}
Expand Down

0 comments on commit d012125

Please sign in to comment.