/// import { EventEmitter } from 'events'; import EventSource, { EventSourceInitDict } from 'eventsource'; import type MediaWikiRevisionCreateEvent from './streams/MediaWikiRevisionCreateEvent'; import type MediaWikiPageDeleteEvent from './streams/MediaWikiPageDeleteEvent'; import type MediaWikiPageLinksChangeEvent from './streams/MediaWikiPageLinksChangeEvent'; import type MediaWikiPageMoveEvent from './streams/MediaWikiPageMoveEvent'; import type MediaWikiPagePropertiesChangeEvent from './streams/MediaWikiPagePropertiesChangeEvent'; import type MediaWikiPageUndeleteEvent from './streams/MediaWikiPageUndeleteEvent'; import type MediaWikiRecentChangeEvent from './streams/MediaWikiRecentChangeEvent'; import type MediaWikiRevisionVisibilityChangeEvent from './streams/MediaWikiRevisionVisibilityChangeEvent'; import type EventGateTestEvent from './streams/EventGateTestEvent'; import MediaWikiRevisionTagsChangeEvent from './streams/MediaWikiRevisionTagsChangeEvent'; import { WikimediaStreamFilter } from './WikimediaStreamFilter'; /** * The list of Wikimedia EventStreams types, excluding aliases (found in * {@link WikimediaEventStreamAliases} instead). * * @see {@link https://stream.wikimedia.org/?doc|List of streams} */ export declare const WikimediaEventStreams: readonly ["eventgate-main.test.event", "mediawiki.page-create", "mediawiki.page-delete", "mediawiki.page-links-change", "mediawiki.page-move", "mediawiki.page-properties-change", "mediawiki.page-undelete", "mediawiki.recentchange", "mediawiki.revision-create", "mediawiki.revision-tags-change", "mediawiki.revision-visibility-change"]; /** * The list of Wikimedia EventStreams aliases. These streams point to other * streams. * * @see {@link https://stream.wikimedia.org/?doc|List of streams} */ export declare const WikimediaEventStreamAliases: { readonly 'page-create': "mediawiki.page-create"; readonly 'page-delete': "mediawiki.page-delete"; readonly 'page-links-change': "mediawiki.page-links-change"; readonly 'page-move': "mediawiki.page-move"; readonly 'page-properties-change': "mediawiki.page-properties-change"; readonly 'page-undelete': "mediawiki.page-undelete"; readonly recentchange: "mediawiki.recentchange"; readonly 'revision-create': "mediawiki.revision-create"; readonly test: "eventgate-main.test.event"; }; /** * Type definition for each event stream. Respective type declarations for the * event stream payloads can be found in their respective files. */ export type WikimediaEventStreamEventTypes = { 'eventgate-main.test.event': EventGateTestEvent; 'test': EventGateTestEvent; 'mediawiki.page-create': MediaWikiRevisionCreateEvent; 'page-create': MediaWikiRevisionCreateEvent; 'mediawiki.page-delete': MediaWikiPageDeleteEvent; 'page-delete': MediaWikiPageDeleteEvent; 'mediawiki.page-links-change': MediaWikiPageLinksChangeEvent; 'page-links-change': MediaWikiPageLinksChangeEvent; 'mediawiki.page-move': MediaWikiPageMoveEvent; 'page-move': MediaWikiPageMoveEvent; 'mediawiki.page-properties-change': MediaWikiPagePropertiesChangeEvent; 'page-properties-change': MediaWikiPagePropertiesChangeEvent; 'mediawiki.page-undelete': MediaWikiPageUndeleteEvent; 'page-undelete': MediaWikiPageUndeleteEvent; 'mediawiki.recentchange': MediaWikiRecentChangeEvent; 'recentchange': MediaWikiRecentChangeEvent; 'mediawiki.revision-create': MediaWikiRevisionCreateEvent; 'revision-create': MediaWikiRevisionCreateEvent; 'mediawiki.revision-tags-change': MediaWikiRevisionTagsChangeEvent; 'mediawiki.revision-visibility-change': MediaWikiRevisionVisibilityChangeEvent; }; /** * The ID of a non-alias Wikimedia event stream. */ export type SpecificWikimediaEventStream = typeof WikimediaEventStreams[number]; /** * The ID of an alias Wikimedia event stream. */ export type AliasWikimediaEventStream = keyof typeof WikimediaEventStreamAliases; /** * The ID of a Wikimedia event stream. */ export type WikimediaEventStream = SpecificWikimediaEventStream | AliasWikimediaEventStream; /** * An object mapping specific Wikimedia event streams to an array of all their aliases. * * @example `{ "mediawiki.page-create": ["page-create"], ... }` */ export declare const WikimediaEventStreamAliasesKey: Partial>; export declare enum EventSourceState { Pending = -1, Connecting = 0, Open = 1, Closed = 2 } /** * Sets the type for listeners that are added to the {@link WikimediaStream} EventEmitter. */ export type WikimediaStreamEventListener = (data: WikimediaEventStreamEventTypes[T], event: MessageEvent) => void; /** * Sets the type for listeners that are added to the {@link WikimediaStream} EventEmitter. */ export type RawWikimediaStreamEventListener = (data: T, event: MessageEvent) => void; export type WikimediaStreamLastEventID = { /** * The Kafka topic of the stream. This usually includes the datacenter and the * stream topic (e.g. `eqiad.mediawiki.recentchange`). */ topic: string; /** * The Kafka partition of the stream. */ partition: number; /** * The timestamp to begin enumerating from. This should be a JavaScript-like * timestamp (millisecond-based). * * KafkaSSE will always provide either a timestamp or an offset. */ timestamp?: number; /** * The event offset to begin enumerating from. * * KafkaSSE will always provide either a timestamp or an offset. */ offset?: number; }; export interface WikimediaStreamOptions extends EventSourceInitDict { /** * Whether the stream should automatically be reopened if it closes due to an * error or a periodic disconnect (standard for Wikimedia Foundation streams). * * @default true */ reopenOnClose?: boolean; /** * Specifies the Kafka topics, partitions and offsets from which to begin * streaming. You may not specify topics that are not configured to be part * of this stream endpoint. * * If a timestamp is given, the stream will start from an event closest * to the timestamp provided. If an offset is provided, the stream will start * from the exact event at the provided offset. If both are provided, offset * takes precedence. * * The last event ID received by the stream will always take precedence. If * you want to continue a stream with a custom last event ID after this stream * has already received events, instantiate a new stream. * * @see https://github.com/wikimedia/kafkasse#readme * @example `[{topic: datacenter1.topic, partition: 0, offset: 12345}, ...]` */ lastEventId?: WikimediaStreamLastEventID[]; /** * If given, this timestamp will be used as the historical starting position * in each the requested streams. since should either be an integer UTC * milliseconds unix epoch timestamp, or a string timestamp parseable by * `Date.parse()`. If the timestamp given does not have any corresponding offsets, * it will be ignored, and the data will begin streaming from the latest position * in the stream. This parameter is ignored if `Last-Event-ID` is set with * offsets (or timestamps) for individual topic partition assignments, e.g. * when resuming after a disconnect. * * NOTE: Historical timestamp assignment is not supported indefinitely. Depending * on backend stream configuration, will likely be only one or a few weeks. */ since?: string; /** * Whether to start after instantiation or not. * * @default true */ autoStart?: boolean; /** * Enable listening to canary events. Canary events are sent multiple times * an hour to ensure that streams are not broken. They are filtered by * default to avoid "fake" events from being received by a client. * * @see https://w.wiki/7$2z EventStreams documentation on canary events * @see https://w.wiki/7$2v Technical documentation on canary events * @default false */ enableCanary?: boolean; } export type ErrorEvent = Event & { type: 'error'; message: string | undefined; }; export declare interface WikimediaStream { once(event: T, listener: WikimediaStreamEventListener): this; once(event: 'open' | 'close', listener: () => void): this; once(event: 'error', listener: (error: ErrorEvent) => void): this; on(event: T, listener: WikimediaStreamEventListener): this; on(event: 'open' | 'close', listener: () => void): this; on(event: 'error', listener: (error: ErrorEvent) => void): this; addListener(event: T, listener: WikimediaStreamEventListener): this; addListener(event: 'open' | 'close', listener: () => void): this; addListener(event: 'error', listener: (error: ErrorEvent) => void): this; off(event: T, listener: WikimediaStreamEventListener): this; off(event: 'open' | 'close', listener: () => void): this; off(event: 'error', listener: (error: ErrorEvent) => void): this; removeListener(event: T, listener: WikimediaStreamEventListener): this; removeListener(event: 'open' | 'close', listener: () => void): this; removeListener(event: 'error', listener: (error: ErrorEvent) => void): this; removeAllListeners(event?: 'open' | 'error' | 'close' | WikimediaEventStream): this; listeners(event: 'open' | 'error' | 'close' | WikimediaEventStream): Function[]; rawListeners(event: 'open' | 'error' | 'close' | WikimediaEventStream): Function[]; emit(eventName: T, data: WikimediaEventStreamEventTypes[T], event: MessageEvent): boolean; emit(event: 'open' | 'close'): this; emit(event: 'error', error: ErrorEvent): this; listenerCount(event: 'open' | 'error' | 'close' | WikimediaEventStream): number; prependListener(event: T, listener: WikimediaStreamEventListener): this; prependListener(event: 'open' | 'close', listener: () => void): this; prependListener(event: 'error', listener: (error: ErrorEvent) => void): this; prependOnceListener(event: T, listener: WikimediaStreamEventListener): this; prependOnceListener(event: 'open' | 'close', listener: () => void): this; prependOnceListener(event: 'error', listener: (error: ErrorEvent) => void): this; } /** * A WikimediaStream connects to the Wikimedia Event Platform EventStreams * domain (found at {@link https://streams.wikimedia.org}) and provides real-time * recent changes and actions on Wikimedia wikis. */ export declare class WikimediaStream extends EventEmitter { /** * The EventSource which listens to streams on the Wikimedia Event Platform. Uses * the `eventsource` package, which is backwards-compatible with the * {@link https://developer.mozilla.org/en-US/docs/Web/API/EventSource|EventSource} Web API. */ eventSource: EventSource; /** * The last event ID received from the EventSource. Used to seamlessly re-listen to * closed connections. * * @private */ private _lastEventId; /** * The streams that this WikimediaStream is currently listening/will listen to. * * @private */ private readonly streams; /** * A NodeJS.Timeout which checks if the EventSource is still open. The interval * checks if the EventSource is still open every second, and reopens it if it's * closed. * * @private */ private openCheckInterval; /** * A NodeJS.Timeout which reopens the EventSource every 15 minutes. This ensures * that messages are still being received (with a worst possible lag of 15 minutes) * even if the EventSource disconnects with no error or close event. * * @private */ private restartInterval; /** * The current status of this stream. */ get status(): EventSourceState; get lastEventId(): WikimediaStreamLastEventID[]; /** * The version of this package. Used for the default `User-Agent` header. */ static readonly VERSION = "3.0.0"; /** * The generic user agent to be used by wikimedia-streams when * no default user agent is used or set. */ static readonly genericUserAgent: string; /** * The default user agent to be used by wikimedia-streams. */ static defaultUserAgent: string; /** * Checks if a given string is a valid {@link WikimediaEventStream}. * * @param stream The string to check. * @return {} Whether the stream is a valid Wikimedia stream ID or not. */ static isWikimediaStream(stream: string): stream is SpecificWikimediaEventStream; /** * Checks if a given string is a valid {@link AliasWikimediaEventStream} ID. * * @param stream The string to check. */ static isWikimediaStreamAlias(stream: WikimediaEventStream): stream is AliasWikimediaEventStream; /** * Checks if a given string is a valid {@link SpecificWikimediaEventStream} ID. * * @param stream The string to check. */ static isSpecificWikimediaStream(stream: WikimediaEventStream): stream is SpecificWikimediaEventStream; private readonly startingOptions; /** * Creates a new Wikimedia RecentChanges listener. This will automatically start the * stream upon construction; you do not need to call {@link WikimediaStream#open} after * instantiating this class. * * @param streams * The streams to listen to. You may choose any stream defined by the * {@link https://stream.wikimedia.org/?doc|Wikimedia EventStreams documentation page}. * @param options * Additional options for the EventSource. */ constructor(streams: WikimediaEventStream | WikimediaEventStream[], options?: WikimediaStreamOptions); /** * Start listening to the stream. * * @param options * Additional options for the EventSource. * @return A Promise that resolves once the stream is open. */ open(options?: Omit): Promise; /** * Stop listening to the stream. */ close(): void; /** * @param options */ attachEventListeners(options: WikimediaStreamOptions): void; /** * */ eventNames(): ('open' | 'error' | 'close' | WikimediaEventStream)[]; filter(eventType: T): WikimediaStreamFilter; /** * Returns a promise that resolves when the stream is closed. */ waitUntilClosed(): Promise; } export default WikimediaStream;