Accept an async listener in the types and normalise any rejection reason

This commit is contained in:
2026-08-27 23:07:48 +02:00
parent 0c55e5ee11
commit 344249b080
7 changed files with 73 additions and 27 deletions
+16 -4
View File
@@ -9,6 +9,7 @@ import { bindTypeFromCommand, checkSessionOptions, undeclaredInterfaceVersion }
import { createServer as createNetServer } from 'node:net';
import { createServer as createTlsServer } from 'node:tls';
import { defaultInterfaceVersion } from './defs/constants.ts';
import { errorFrom } from './error-from.ts';
import { paramText } from './defs/types.ts';
import { silentLog } from './log.ts';
@@ -50,8 +51,19 @@ const defaults = {
systemId: defaultSystemId,
};
/** A listener may return a promise: an `async` one that rejects is routed like one that throws. */
type ServerListener<K extends keyof ServerEvents> = (...args: ServerEvents[K]) => unknown;
/** A listening SMPP server. Sessions arrive as `session` events; `close()` stops listening. */
export class SmppServer extends EventEmitter<ServerEvents> {
declare addListener: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
declare off: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
declare on: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
declare once: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
declare prependListener: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
declare prependOnceListener: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
declare removeListener: <K extends keyof ServerEvents>(event: K, listener: ServerListener<K>) => this;
readonly sessions = new Set<Session>();
private readonly log: SmppLog;
@@ -78,7 +90,7 @@ export class SmppServer extends EventEmitter<ServerEvents> {
try {
return super.emit(event, ...args);
} catch (thrown: unknown) {
const err = thrown instanceof Error ? thrown : new Error(String(thrown));
const err = errorFrom(thrown);
this.log.error('server - a listener threw', { event, message: err.message });
@@ -95,7 +107,7 @@ export class SmppServer extends EventEmitter<ServerEvents> {
...args: [event: keyof ServerEvents, ...rest: unknown[]]
): void {
const [event] = args;
const error = reason instanceof Error ? reason : new Error(String(reason));
const error = errorFrom(reason);
this.log.error('server - a listener rejected', { event, message: error.message });
@@ -109,7 +121,7 @@ export class SmppServer extends EventEmitter<ServerEvents> {
try {
session.close();
} catch (thrown: unknown) {
this.emit('serverError', thrown instanceof Error ? thrown : new Error(String(thrown)));
this.emit('serverError', errorFrom(thrown));
}
}
@@ -332,7 +344,7 @@ export function server(options: ServerOptions = {}): Promise<Result<{ server: Sm
resolve({ server: smpp });
});
} catch (thrown: unknown) {
onStartupError(thrown instanceof Error ? thrown : new Error(String(thrown)));
onStartupError(errorFrom(thrown));
}
});
}