Merge pull request #3624 from SillyTavern/server-events Add server events emitter

35b72cc6e650286ea2b7001a92865616cce37630

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
3 files changed, +54 -3Ignore whitespace
index.d.ts+31 -3
@@ -1,8 +1,36 @@
11import { UserDirectoryList, UserEventEmitter } from "./src/users"'node:events';
22import { CommandLineArgumentsCsrfSyncedToken } from "./src/command'csrf-line"sync';
33import { CsrfSyncedTokenUserDirectoryList, User } from "csrf-sync"'./src/users.js';
4+import { CommandLineArguments } from './src/command-line.js';
5+import { EVENT_NAMES } from './src/server-events.js';
6+
7+/**
8+ * Event payload for SERVER_STARTED event.
9+ */
10+export interface ServerStartedEvent {
11+ /**
12+ * The URL the server is listening on.
13+ */
14+ url: URL;
15+}
16+
17+/**
18+ * Map of all server events to their payload types.
19+ */
20+export interface ServerEventMap {
21+ [EVENT_NAMES.SERVER_STARTED]: [ServerStartedEvent];
22+}
423
524declare global {
25+ declare namespace NodeJS {
26+ export interface Process {
27+ /**
28+ * A global instance of the server events emitter.
29+ */
30+ serverEvents: EventEmitter<ServerEventMap>;
31+ }
32+ }
33+
634 declare namespace CookieSessionInterfaces {
735 export interface CookieSessionObject {
836 /**
server.js+2 -0
@@ -20,6 +20,7 @@ import bodyParser from 'body-parser';
2020import open from 'open';
2121
2222// local library imports
23+import { serverEvents, EVENT_NAMES } from './src/server-events.js';
2324import { CommandLineParser } from './src/command-line.js';
2425import { loadPlugins } from './src/plugin-loader.js';
2526import {
@@ -348,6 +349,7 @@ async function postSetupTasks(result) {
348349 console.log('\n' + getSeparator(plainGoToLog.length) + '\n');
349350
350351 setupLogLevel();
352+ serverEvents.emit(EVENT_NAMES.SERVER_STARTED, { url: autorunUrl });
351353}
352354
353355/**
src/server-events.js+21 -0
@@ -0,0 +1,21 @@
1+import EventEmitter from 'node:events';
2+import process from 'node:process';
3+
4+/**
5+ * @typedef {import('../index').ServerEventMap} ServerEventMap
6+ * @type {EventEmitter<ServerEventMap>} The default event source.
7+ */
8+export const serverEvents = new EventEmitter();
9+process.serverEvents = serverEvents;
10+export default serverEvents;
11+
12+/**
13+ * @enum {string}
14+ * @readonly
15+ */
16+export const EVENT_NAMES = Object.freeze({
17+ /**
18+ * Emitted when the server has started.
19+ */
20+ SERVER_STARTED: 'server-started',
21+});