import { default as SafeBlock } from './index'; import { default as EventBus } from '../utils/event-bus'; /** Standard events implemented by the SDK core */ interface DefaultEvents { /** Fired after all extensions have finished initializing */ onExtensionsInitializationFinished: [extensionNames: string[]]; } type ValidEventCarrier = T extends { events: infer E; } ? E : never; type ExtensionsEvents = T extends readonly any[] ? { [K in keyof T]: ValidEventCarrier extends never ? never : ValidEventCarrier; }[number] : never; type UnionToIntersection = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never; export type FinalEvents = T extends undefined | never ? {} : UnionToIntersection>; type EventFunctionsToArgs any> | unknown> = { [K in keyof T]: T[K] extends (...args: any[]) => any ? Parameters : never; }; /** Type describing a partially‑typed event bus used inside extensions */ export type PartialEventBus = EventBus & DefaultEvents, keyof DefaultEvents>; export type ExtractConfigExtensionsType SdkExtension[]) | undefined> = T extends (...args: any[]) => SdkExtension[] ? ReturnType : never; /** Helper type that extracts extension events as an object */ export type ExtractEvents SdkExtension[]) | undefined> = EventFunctionsToArgs>> & DefaultEvents; /** * Base class for an SDK extension. * * All SDK extensions must inherit from this class. */ export default abstract class SdkExtension { /** Unique extension name */ static name: string; /** * Unique extension name within the instance. * * Automatically set from the static `name` field. */ readonly name: string; /** Events implemented by the extension */ abstract events: { [key: string]: (...args: any[]) => void; }; /** * Called right after all extensions have finished initializing. * * Unlike the constructor, this method has access to every other extension, * even those located later in the list. */ abstract onInitialize(sdk: SafeBlock): void; protected constructor(); } export {};