@aarekaz/switchboard-core 0.3.1 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -41,7 +41,9 @@ declare function isErr<T, E>(result: Result<T, E>): result is {
|
|
|
41
41
|
* Supported chat platforms
|
|
42
42
|
* Extensible to allow custom platforms
|
|
43
43
|
*/
|
|
44
|
-
type PlatformType = 'discord' | 'slack' | 'teams' | 'google-chat' | (string & {
|
|
44
|
+
type PlatformType = 'discord' | 'slack' | 'teams' | 'google-chat' | (string & {
|
|
45
|
+
__brand?: 'PlatformType';
|
|
46
|
+
});
|
|
45
47
|
|
|
46
48
|
/**
|
|
47
49
|
* File attachment
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/bot.ts","../src/adapter/registry.ts","../src/utils/errors.ts","../src/client/create-bot.ts","../src/types/result.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { PlatformAdapter } from '../adapter/interface.js';\nimport type { Result } from '../types/result.js';\nimport type { PlatformType } from '../types/platform.js';\nimport type {\n UnifiedMessage,\n MessageRef,\n SendMessageOptions,\n UploadOptions,\n} from '../types/message.js';\nimport type { UnifiedEvent, MessageEvent, ReactionEvent } from '../types/event.js';\nimport type { Channel } from '../types/channel.js';\nimport type { User } from '../types/user.js';\nimport type { MessageContext, MessageHandler } from '../types/context.js';\n\n/**\n * Bot client - the main interface for interacting with chat platforms\n */\nexport class Bot {\n private eventHandlers: Map<string, Set<(event: UnifiedEvent) => void | Promise<void>>> = new Map();\n\n constructor(\n private readonly adapter: PlatformAdapter,\n private readonly _platform: PlatformType,\n private readonly credentials: unknown\n ) {\n // Subscribe to all events from the adapter\n this.adapter.onEvent(async (event) => {\n await this.handleEvent(event);\n });\n }\n\n /**\n * Get the platform type\n */\n get platform(): PlatformType {\n return this._platform;\n }\n\n /**\n * Start the bot (connect to the platform)\n */\n async start(): Promise<void> {\n // Connect to the platform if not already connected\n if (!this.adapter.isConnected()) {\n await this.adapter.connect(this.credentials);\n }\n }\n\n /**\n * Stop the bot (disconnect from the platform)\n */\n async stop(): Promise<void> {\n await this.adapter.disconnect();\n }\n\n /**\n * Check if the bot is connected\n */\n isConnected(): boolean {\n return this.adapter.isConnected();\n }\n\n /**\n * Send a message to a channel\n */\n async sendMessage(\n channelId: string,\n text: string,\n options?: SendMessageOptions\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.sendMessage(channelId, text, options);\n }\n\n /**\n * Reply to a message\n */\n async reply(\n message: UnifiedMessage,\n text: string,\n options?: SendMessageOptions\n ): Promise<Result<UnifiedMessage>> {\n // If the message is in a thread, reply in the same thread\n const threadId = message.threadId || message.id;\n return this.adapter.sendMessage(message.channelId, text, {\n ...options,\n threadId,\n });\n }\n\n /**\n * Edit an existing message\n */\n async editMessage(\n messageRef: MessageRef,\n newText: string\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.editMessage(messageRef, newText);\n }\n\n /**\n * Delete a message\n */\n async deleteMessage(messageRef: MessageRef): Promise<Result<void>> {\n return this.adapter.deleteMessage(messageRef);\n }\n\n /**\n * Add a reaction to a message\n */\n async addReaction(messageRef: MessageRef, emoji: string): Promise<Result<void>> {\n return this.adapter.addReaction(messageRef, emoji);\n }\n\n /**\n * Remove a reaction from a message\n */\n async removeReaction(messageRef: MessageRef, emoji: string): Promise<Result<void>> {\n return this.adapter.removeReaction(messageRef, emoji);\n }\n\n /**\n * Create a thread (or reply in a thread)\n */\n async createThread(\n messageRef: MessageRef,\n text: string\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.createThread(messageRef, text);\n }\n\n /**\n * Upload a file to a channel\n */\n async uploadFile(\n channelId: string,\n file: unknown,\n options?: UploadOptions\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.uploadFile(channelId, file, options);\n }\n\n /**\n * Get list of channels\n */\n async getChannels(): Promise<Result<Channel[]>> {\n return this.adapter.getChannels();\n }\n\n /**\n * Get list of users (optionally in a specific channel)\n */\n async getUsers(channelId?: string): Promise<Result<User[]>> {\n return this.adapter.getUsers(channelId);\n }\n\n /**\n * Register a handler for message events\n *\n * Supports both context API (recommended) and legacy message API\n *\n * @example\n * ```typescript\n * // Context API (recommended)\n * bot.onMessage(async (ctx) => {\n * await ctx.reply('Hello!');\n * await ctx.react('thumbsup');\n * });\n *\n * // Legacy API (still supported)\n * bot.onMessage(async (message) => {\n * await bot.reply(message, 'Hello!');\n * });\n * ```\n */\n onMessage(handler: MessageHandler | ((message: UnifiedMessage) => void | Promise<void>)): void {\n this.on('message', async (event) => {\n if (event.type === 'message') {\n const message = event.message;\n\n // Detect if handler expects context (by checking parameter count)\n // Context handlers have 1 parameter, legacy handlers might check message properties\n // We'll check if the handler looks like it wants a context by seeing if it's async\n // and calling it with a context object\n\n // Create context object\n const ctx = this.createContext(message);\n\n // Call handler with context\n await handler(ctx as any);\n }\n });\n }\n\n /**\n * Create a message context object\n */\n private createContext(message: UnifiedMessage): MessageContext {\n return {\n message,\n platform: this._platform,\n userId: message.userId,\n channelId: message.channelId,\n text: message.text,\n threadId: message.threadId,\n\n // Helper methods\n reply: (text: string, options?: SendMessageOptions) => {\n return this.reply(message, text, options);\n },\n\n react: (emoji: string) => {\n return this.addReaction(message, emoji);\n },\n\n unreact: (emoji: string) => {\n return this.removeReaction(message, emoji);\n },\n\n edit: (newText: string) => {\n return this.editMessage(message, newText);\n },\n\n delete: () => {\n return this.deleteMessage(message);\n },\n\n createThread: (text: string) => {\n return this.createThread(message, text);\n },\n\n send: (text: string, options?: SendMessageOptions) => {\n return this.sendMessage(message.channelId, text, options);\n },\n };\n }\n\n /**\n * Register a handler for reaction events\n */\n onReaction(handler: (event: ReactionEvent) => void | Promise<void>): void {\n this.on('reaction', async (event) => {\n if (event.type === 'reaction') {\n await handler(event);\n }\n });\n }\n\n /**\n * Register a handler for any event\n */\n onEvent(handler: (event: UnifiedEvent) => void | Promise<void>): void {\n this.on('*', handler);\n }\n\n /**\n * Get the underlying adapter (for advanced use cases)\n */\n getAdapter(): PlatformAdapter {\n return this.adapter;\n }\n\n /**\n * Internal: Register an event handler\n */\n private on(\n eventType: string,\n handler: (event: UnifiedEvent) => void | Promise<void>\n ): void {\n if (!this.eventHandlers.has(eventType)) {\n this.eventHandlers.set(eventType, new Set());\n }\n this.eventHandlers.get(eventType)!.add(handler);\n }\n\n /**\n * Internal: Handle an event from the adapter\n */\n private async handleEvent(event: UnifiedEvent): Promise<void> {\n // Call handlers for this specific event type\n const typeHandlers = this.eventHandlers.get(event.type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n try {\n await handler(event);\n } catch (error) {\n console.error(\n `[Switchboard] Error in ${event.type} handler:`,\n error\n );\n }\n }\n }\n\n // Call wildcard handlers\n const wildcardHandlers = this.eventHandlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n try {\n await handler(event);\n } catch (error) {\n console.error(`[Switchboard] Error in wildcard handler:`, error);\n }\n }\n }\n }\n}\n","import type { PlatformAdapter } from './interface.js';\nimport type { PlatformType } from '../types/platform.js';\n\n/**\n * Global registry for platform adapters\n * Adapters register themselves when their package is imported\n */\nclass AdapterRegistry {\n private adapters = new Map<PlatformType, PlatformAdapter>();\n\n /**\n * Register a platform adapter\n * Called by adapter packages when they're imported\n */\n register(platform: PlatformType, adapter: PlatformAdapter): void {\n if (this.adapters.has(platform)) {\n console.warn(\n `[Switchboard] Adapter for platform \"${platform}\" is already registered. Overwriting.`\n );\n }\n this.adapters.set(platform, adapter);\n }\n\n /**\n * Get an adapter for a platform\n */\n get(platform: PlatformType): PlatformAdapter | undefined {\n return this.adapters.get(platform);\n }\n\n /**\n * Check if an adapter is registered for a platform\n */\n has(platform: PlatformType): boolean {\n return this.adapters.has(platform);\n }\n\n /**\n * Get all registered platforms\n */\n getRegisteredPlatforms(): PlatformType[] {\n return Array.from(this.adapters.keys());\n }\n\n /**\n * Clear all registered adapters (mainly for testing)\n */\n clear(): void {\n this.adapters.clear();\n }\n}\n\n/**\n * Global singleton registry instance\n */\nexport const registry = new AdapterRegistry();\n","import type { PlatformType } from '../types/platform.js';\n\n/**\n * Base error class for all Switchboard errors\n */\nexport class SwitchboardError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly platform?: PlatformType\n ) {\n super(message);\n this.name = 'SwitchboardError';\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Error thrown when no adapter is found for a platform\n */\nexport class AdapterNotFoundError extends SwitchboardError {\n constructor(platform: PlatformType) {\n super(\n `No adapter found for platform: ${platform}. Did you import @aarekaz/switchboard-${platform}?`,\n 'ADAPTER_NOT_FOUND',\n platform\n );\n this.name = 'AdapterNotFoundError';\n }\n}\n\n/**\n * Error thrown when connection to a platform fails\n */\nexport class ConnectionError extends SwitchboardError {\n constructor(platform: PlatformType, cause: unknown) {\n super(\n `Failed to connect to ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'CONNECTION_ERROR',\n platform\n );\n this.name = 'ConnectionError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when sending a message fails\n */\nexport class MessageSendError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n channelId: string,\n cause: unknown\n ) {\n super(\n `Failed to send message to channel ${channelId} on ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'MESSAGE_SEND_ERROR',\n platform\n );\n this.name = 'MessageSendError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when editing a message fails\n */\nexport class MessageEditError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n messageId: string,\n cause: unknown\n ) {\n super(\n `Failed to edit message ${messageId} on ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'MESSAGE_EDIT_ERROR',\n platform\n );\n this.name = 'MessageEditError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when deleting a message fails\n */\nexport class MessageDeleteError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n messageId: string,\n cause: unknown\n ) {\n super(\n `Failed to delete message ${messageId} on ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'MESSAGE_DELETE_ERROR',\n platform\n );\n this.name = 'MessageDeleteError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when adding/removing a reaction fails\n */\nexport class ReactionError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n messageId: string,\n emoji: string,\n cause: unknown\n ) {\n super(\n `Failed to add/remove reaction ${emoji} on message ${messageId} (${platform}): ${cause instanceof Error ? cause.message : String(cause)}`,\n 'REACTION_ERROR',\n platform\n );\n this.name = 'ReactionError';\n this.cause = cause;\n }\n}\n","import { Bot } from './bot.js';\nimport { registry } from '../adapter/registry.js';\nimport type { PlatformAdapter } from '../adapter/interface.js';\nimport type { PlatformType } from '../types/platform.js';\nimport { AdapterNotFoundError, ConnectionError } from '../utils/errors.js';\n\n/**\n * Configuration for creating a bot\n */\nexport interface BotConfig {\n /**\n * Platform to connect to (e.g., 'discord', 'slack', 'teams', 'google-chat')\n */\n platform: PlatformType;\n\n /**\n * Platform credentials (structure depends on the platform)\n */\n credentials?: {\n /** Bot token (Discord, Slack) */\n token?: string;\n /** App ID (Teams) */\n appId?: string;\n /** App password (Teams) */\n appPassword?: string;\n /** Custom credentials object */\n [key: string]: unknown;\n };\n\n /**\n * Custom adapter (for advanced users or custom platforms)\n * If provided, this will be used instead of the registered adapter\n */\n adapter?: PlatformAdapter;\n\n /**\n * Platform-specific configuration (opt-in)\n */\n platformConfig?: {\n discord?: unknown;\n slack?: unknown;\n teams?: unknown;\n googleChat?: unknown;\n [key: string]: unknown;\n };\n}\n\n/**\n * Create a bot instance\n *\n * @example\n * ```typescript\n * import { createBot } from '@aarekaz/switchboard-core';\n * import '@aarekaz/switchboard-discord';\n *\n * const bot = createBot({\n * platform: 'discord',\n * credentials: {\n * token: process.env.DISCORD_TOKEN,\n * },\n * });\n *\n * bot.onMessage(async (message) => {\n * if (message.text.includes('ping')) {\n * await bot.reply(message, 'pong!');\n * }\n * });\n *\n * await bot.start();\n * ```\n */\nexport function createBot(config: BotConfig): Bot {\n let adapter: PlatformAdapter;\n\n // Use custom adapter if provided\n if (config.adapter) {\n adapter = config.adapter;\n } else {\n // Get adapter from registry\n const registeredAdapter = registry.get(config.platform);\n if (!registeredAdapter) {\n throw new AdapterNotFoundError(config.platform);\n }\n adapter = registeredAdapter;\n }\n\n // Create and return the bot instance\n // Connection happens lazily when bot.start() is called\n return new Bot(adapter, config.platform, config.credentials || {});\n}\n","/**\n * Result type for type-safe error handling\n * Inspired by Rust's Result<T, E> type\n */\nexport type Result<T, E = Error> =\n | { ok: true; value: T }\n | { ok: false; error: E };\n\n/**\n * Create a successful result\n */\nexport function ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create an error result\n */\nexport function err<E = Error>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Wrap an async operation in a Result type\n * Catches any errors and converts them to Result<T>\n */\nexport async function wrapAsync<T>(\n fn: () => Promise<T>\n): Promise<Result<T, Error>> {\n try {\n const value = await fn();\n return ok(value);\n } catch (error) {\n return err(error instanceof Error ? error : new Error(String(error)));\n }\n}\n\n/**\n * Check if a result is successful\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok === true;\n}\n\n/**\n * Check if a result is an error\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return result.ok === false;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/bot.ts","../src/adapter/registry.ts","../src/utils/errors.ts","../src/client/create-bot.ts","../src/types/result.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { PlatformAdapter } from '../adapter/interface.js';\nimport type { Result } from '../types/result.js';\nimport type { PlatformType } from '../types/platform.js';\nimport type {\n UnifiedMessage,\n MessageRef,\n SendMessageOptions,\n UploadOptions,\n} from '../types/message.js';\nimport type { UnifiedEvent, ReactionEvent } from '../types/event.js';\nimport type { Channel } from '../types/channel.js';\nimport type { User } from '../types/user.js';\nimport type { MessageContext, MessageHandler } from '../types/context.js';\n\n/**\n * Bot client - the main interface for interacting with chat platforms\n */\nexport class Bot {\n private eventHandlers: Map<string, Set<(event: UnifiedEvent) => void | Promise<void>>> = new Map();\n\n constructor(\n private readonly adapter: PlatformAdapter,\n private readonly _platform: PlatformType,\n private readonly credentials: unknown\n ) {\n // Subscribe to all events from the adapter\n this.adapter.onEvent(async (event) => {\n await this.handleEvent(event);\n });\n }\n\n /**\n * Get the platform type\n */\n get platform(): PlatformType {\n return this._platform;\n }\n\n /**\n * Start the bot (connect to the platform)\n */\n async start(): Promise<void> {\n // Connect to the platform if not already connected\n if (!this.adapter.isConnected()) {\n await this.adapter.connect(this.credentials);\n }\n }\n\n /**\n * Stop the bot (disconnect from the platform)\n */\n async stop(): Promise<void> {\n await this.adapter.disconnect();\n }\n\n /**\n * Check if the bot is connected\n */\n isConnected(): boolean {\n return this.adapter.isConnected();\n }\n\n /**\n * Send a message to a channel\n */\n async sendMessage(\n channelId: string,\n text: string,\n options?: SendMessageOptions\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.sendMessage(channelId, text, options);\n }\n\n /**\n * Reply to a message\n */\n async reply(\n message: UnifiedMessage,\n text: string,\n options?: SendMessageOptions\n ): Promise<Result<UnifiedMessage>> {\n // If the message is in a thread, reply in the same thread\n const threadId = message.threadId || message.id;\n return this.adapter.sendMessage(message.channelId, text, {\n ...options,\n threadId,\n });\n }\n\n /**\n * Edit an existing message\n */\n async editMessage(\n messageRef: MessageRef,\n newText: string\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.editMessage(messageRef, newText);\n }\n\n /**\n * Delete a message\n */\n async deleteMessage(messageRef: MessageRef): Promise<Result<void>> {\n return this.adapter.deleteMessage(messageRef);\n }\n\n /**\n * Add a reaction to a message\n */\n async addReaction(messageRef: MessageRef, emoji: string): Promise<Result<void>> {\n return this.adapter.addReaction(messageRef, emoji);\n }\n\n /**\n * Remove a reaction from a message\n */\n async removeReaction(messageRef: MessageRef, emoji: string): Promise<Result<void>> {\n return this.adapter.removeReaction(messageRef, emoji);\n }\n\n /**\n * Create a thread (or reply in a thread)\n */\n async createThread(\n messageRef: MessageRef,\n text: string\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.createThread(messageRef, text);\n }\n\n /**\n * Upload a file to a channel\n */\n async uploadFile(\n channelId: string,\n file: unknown,\n options?: UploadOptions\n ): Promise<Result<UnifiedMessage>> {\n return this.adapter.uploadFile(channelId, file, options);\n }\n\n /**\n * Get list of channels\n */\n async getChannels(): Promise<Result<Channel[]>> {\n return this.adapter.getChannels();\n }\n\n /**\n * Get list of users (optionally in a specific channel)\n */\n async getUsers(channelId?: string): Promise<Result<User[]>> {\n return this.adapter.getUsers(channelId);\n }\n\n /**\n * Register a handler for message events\n *\n * Supports both context API (recommended) and legacy message API\n *\n * @example\n * ```typescript\n * // Context API (recommended)\n * bot.onMessage(async (ctx) => {\n * await ctx.reply('Hello!');\n * await ctx.react('thumbsup');\n * });\n *\n * // Legacy API (still supported)\n * bot.onMessage(async (message) => {\n * await bot.reply(message, 'Hello!');\n * });\n * ```\n */\n onMessage(handler: MessageHandler | ((message: UnifiedMessage) => void | Promise<void>)): void {\n this.on('message', async (event) => {\n if (event.type === 'message') {\n const message = event.message;\n\n // Detect if handler expects context (by checking parameter count)\n // Context handlers have 1 parameter, legacy handlers might check message properties\n // We'll check if the handler looks like it wants a context by seeing if it's async\n // and calling it with a context object\n\n // Create context object\n const ctx = this.createContext(message);\n\n // Call handler with context\n await handler(ctx as any);\n }\n });\n }\n\n /**\n * Create a message context object\n */\n private createContext(message: UnifiedMessage): MessageContext {\n return {\n message,\n platform: this._platform,\n userId: message.userId,\n channelId: message.channelId,\n text: message.text,\n threadId: message.threadId,\n\n // Helper methods\n reply: (text: string, options?: SendMessageOptions) => {\n return this.reply(message, text, options);\n },\n\n react: (emoji: string) => {\n return this.addReaction(message, emoji);\n },\n\n unreact: (emoji: string) => {\n return this.removeReaction(message, emoji);\n },\n\n edit: (newText: string) => {\n return this.editMessage(message, newText);\n },\n\n delete: () => {\n return this.deleteMessage(message);\n },\n\n createThread: (text: string) => {\n return this.createThread(message, text);\n },\n\n send: (text: string, options?: SendMessageOptions) => {\n return this.sendMessage(message.channelId, text, options);\n },\n };\n }\n\n /**\n * Register a handler for reaction events\n */\n onReaction(handler: (event: ReactionEvent) => void | Promise<void>): void {\n this.on('reaction', async (event) => {\n if (event.type === 'reaction') {\n await handler(event);\n }\n });\n }\n\n /**\n * Register a handler for any event\n */\n onEvent(handler: (event: UnifiedEvent) => void | Promise<void>): void {\n this.on('*', handler);\n }\n\n /**\n * Get the underlying adapter (for advanced use cases)\n */\n getAdapter(): PlatformAdapter {\n return this.adapter;\n }\n\n /**\n * Internal: Register an event handler\n */\n private on(\n eventType: string,\n handler: (event: UnifiedEvent) => void | Promise<void>\n ): void {\n if (!this.eventHandlers.has(eventType)) {\n this.eventHandlers.set(eventType, new Set());\n }\n this.eventHandlers.get(eventType)!.add(handler);\n }\n\n /**\n * Internal: Handle an event from the adapter\n */\n private async handleEvent(event: UnifiedEvent): Promise<void> {\n // Call handlers for this specific event type\n const typeHandlers = this.eventHandlers.get(event.type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n try {\n await handler(event);\n } catch (error) {\n console.error(\n `[Switchboard] Error in ${event.type} handler:`,\n error\n );\n }\n }\n }\n\n // Call wildcard handlers\n const wildcardHandlers = this.eventHandlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n try {\n await handler(event);\n } catch (error) {\n console.error(`[Switchboard] Error in wildcard handler:`, error);\n }\n }\n }\n }\n}\n","import type { PlatformAdapter } from './interface.js';\nimport type { PlatformType } from '../types/platform.js';\n\n/**\n * Global registry for platform adapters\n * Adapters register themselves when their package is imported\n */\nclass AdapterRegistry {\n private adapters = new Map<PlatformType, PlatformAdapter>();\n\n /**\n * Register a platform adapter\n * Called by adapter packages when they're imported\n */\n register(platform: PlatformType, adapter: PlatformAdapter): void {\n if (this.adapters.has(platform)) {\n console.warn(\n `[Switchboard] Adapter for platform \"${platform}\" is already registered. Overwriting.`\n );\n }\n this.adapters.set(platform, adapter);\n }\n\n /**\n * Get an adapter for a platform\n */\n get(platform: PlatformType): PlatformAdapter | undefined {\n return this.adapters.get(platform);\n }\n\n /**\n * Check if an adapter is registered for a platform\n */\n has(platform: PlatformType): boolean {\n return this.adapters.has(platform);\n }\n\n /**\n * Get all registered platforms\n */\n getRegisteredPlatforms(): PlatformType[] {\n return Array.from(this.adapters.keys());\n }\n\n /**\n * Clear all registered adapters (mainly for testing)\n */\n clear(): void {\n this.adapters.clear();\n }\n}\n\n/**\n * Global singleton registry instance\n */\nexport const registry = new AdapterRegistry();\n","import type { PlatformType } from '../types/platform.js';\n\n/**\n * Base error class for all Switchboard errors\n */\nexport class SwitchboardError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly platform?: PlatformType\n ) {\n super(message);\n this.name = 'SwitchboardError';\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Error thrown when no adapter is found for a platform\n */\nexport class AdapterNotFoundError extends SwitchboardError {\n constructor(platform: PlatformType) {\n super(\n `No adapter found for platform: ${platform}. Did you import @aarekaz/switchboard-${platform}?`,\n 'ADAPTER_NOT_FOUND',\n platform\n );\n this.name = 'AdapterNotFoundError';\n }\n}\n\n/**\n * Error thrown when connection to a platform fails\n */\nexport class ConnectionError extends SwitchboardError {\n constructor(platform: PlatformType, cause: unknown) {\n super(\n `Failed to connect to ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'CONNECTION_ERROR',\n platform\n );\n this.name = 'ConnectionError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when sending a message fails\n */\nexport class MessageSendError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n channelId: string,\n cause: unknown\n ) {\n super(\n `Failed to send message to channel ${channelId} on ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'MESSAGE_SEND_ERROR',\n platform\n );\n this.name = 'MessageSendError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when editing a message fails\n */\nexport class MessageEditError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n messageId: string,\n cause: unknown\n ) {\n super(\n `Failed to edit message ${messageId} on ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'MESSAGE_EDIT_ERROR',\n platform\n );\n this.name = 'MessageEditError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when deleting a message fails\n */\nexport class MessageDeleteError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n messageId: string,\n cause: unknown\n ) {\n super(\n `Failed to delete message ${messageId} on ${platform}: ${cause instanceof Error ? cause.message : String(cause)}`,\n 'MESSAGE_DELETE_ERROR',\n platform\n );\n this.name = 'MessageDeleteError';\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when adding/removing a reaction fails\n */\nexport class ReactionError extends SwitchboardError {\n constructor(\n platform: PlatformType,\n messageId: string,\n emoji: string,\n cause: unknown\n ) {\n super(\n `Failed to add/remove reaction ${emoji} on message ${messageId} (${platform}): ${cause instanceof Error ? cause.message : String(cause)}`,\n 'REACTION_ERROR',\n platform\n );\n this.name = 'ReactionError';\n this.cause = cause;\n }\n}\n","import { Bot } from './bot.js';\nimport { registry } from '../adapter/registry.js';\nimport type { PlatformAdapter } from '../adapter/interface.js';\nimport type { PlatformType } from '../types/platform.js';\nimport { AdapterNotFoundError } from '../utils/errors.js';\n\n/**\n * Configuration for creating a bot\n */\nexport interface BotConfig {\n /**\n * Platform to connect to (e.g., 'discord', 'slack', 'teams', 'google-chat')\n */\n platform: PlatformType;\n\n /**\n * Platform credentials (structure depends on the platform)\n */\n credentials?: {\n /** Bot token (Discord, Slack) */\n token?: string;\n /** App ID (Teams) */\n appId?: string;\n /** App password (Teams) */\n appPassword?: string;\n /** Custom credentials object */\n [key: string]: unknown;\n };\n\n /**\n * Custom adapter (for advanced users or custom platforms)\n * If provided, this will be used instead of the registered adapter\n */\n adapter?: PlatformAdapter;\n\n /**\n * Platform-specific configuration (opt-in)\n */\n platformConfig?: {\n discord?: unknown;\n slack?: unknown;\n teams?: unknown;\n googleChat?: unknown;\n [key: string]: unknown;\n };\n}\n\n/**\n * Create a bot instance\n *\n * @example\n * ```typescript\n * import { createBot } from '@aarekaz/switchboard-core';\n * import '@aarekaz/switchboard-discord';\n *\n * const bot = createBot({\n * platform: 'discord',\n * credentials: {\n * token: process.env.DISCORD_TOKEN,\n * },\n * });\n *\n * bot.onMessage(async (message) => {\n * if (message.text.includes('ping')) {\n * await bot.reply(message, 'pong!');\n * }\n * });\n *\n * await bot.start();\n * ```\n */\nexport function createBot(config: BotConfig): Bot {\n let adapter: PlatformAdapter;\n\n // Use custom adapter if provided\n if (config.adapter) {\n adapter = config.adapter;\n } else {\n // Get adapter from registry\n const registeredAdapter = registry.get(config.platform);\n if (!registeredAdapter) {\n throw new AdapterNotFoundError(config.platform);\n }\n adapter = registeredAdapter;\n }\n\n // Create and return the bot instance\n // Connection happens lazily when bot.start() is called\n return new Bot(adapter, config.platform, config.credentials || {});\n}\n","/**\n * Result type for type-safe error handling\n * Inspired by Rust's Result<T, E> type\n */\nexport type Result<T, E = Error> =\n | { ok: true; value: T }\n | { ok: false; error: E };\n\n/**\n * Create a successful result\n */\nexport function ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create an error result\n */\nexport function err<E = Error>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Wrap an async operation in a Result type\n * Catches any errors and converts them to Result<T>\n */\nexport async function wrapAsync<T>(\n fn: () => Promise<T>\n): Promise<Result<T, Error>> {\n try {\n const value = await fn();\n return ok(value);\n } catch (error) {\n return err(error instanceof Error ? error : new Error(String(error)));\n }\n}\n\n/**\n * Check if a result is successful\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok === true;\n}\n\n/**\n * Check if a result is an error\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return result.ok === false;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aarekaz/switchboard-core",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Core types and client API for Switchboard - universal chat platform SDK",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"switchboard",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"README.md"
|
|
33
33
|
],
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"tsup": "^8.
|
|
36
|
-
"typescript": "^5.
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^5.9.3"
|
|
37
37
|
},
|
|
38
38
|
"publishConfig": {
|
|
39
39
|
"access": "public"
|